morton code를 구할 때, 좌표를 양자화해서 일부 정보가 소실되는 걸로 알고 있음. 양자화할 때 좌표를 공간의 최대 최소에 대해 0~1로 만든 뒤 각 축이 표현할 수 있는 범위(예시로 30비트에 대해 3차원 각 축은 10비트, unsigned로 2^10 - 1까지)내로 매핑해서 합성하는 것으로 봄.
공간 크기를 좌표 자료형이 표현 가능한 범위로 잡게 되면, 가깝지만 다른 점들이 같은 morton code를 갖게 되버리는 문제들이 있어보임.
지금 BVH 구현하면서 상향식 빌드를 이런 식으로 구현함.
1. 모든 leaf node의 중심점 기준 morton code 변환
2. 큐에 morton code 순서대로 삽입
3. 큐에 노드 하나 남을 때까지 노드를 두 개씩 뽑아 새 interior 노드 자식으로 삼고 큐에 삽입 반복
4. 남은 하나의 노드는 루트로 삼기
노드들의 중심점이 밀집해있을 수록 넓은 공간을 기준으로 변환한 morton code 정렬이 제 기능을 못하는데, 어떻게 해결해야할까?
- dc official App
모턴코드는 방금 구글링해서 찾아봤고 내가 그쪽 전문가는아니긴한데 3차원데이터를 압축하면서 정보손실때문에 근접점들이 구분이 안되는 문제면 prefix를 앞에 붙여서 0이면 전역기준, 나머지숫자론 전체공간을 분할해서 각각 공간기준 모턴코드로 대응되게하면 해결 안되나? 이래도 점들이 너무 밀집되어있으면 또 문제가될수있는데 그러면 공간을 더 세밀하게 쪼개고 prefix 크기를 늘려야겠지
uint64 쓰면 각 축마다 2^21까지 되지 않음? 가장 큰 좌표하고 작은 좌표 구해서 좌표 정규화시키면 될 것 같은데
최소점, 최대점 구해서 정규화하는 건 좋은데, 점들의 최소, 최대점이 표현형 최소, 최대에 위치해있으면 문제가 있지 않나 싶음. 64비트는 해보겠음. 근데 21비트여도 200만 정도라 단순 32비트 정수 공간 상정해도 21억인데 해상도 늘린다고 해결될 문제는 아닐 거 같은디 지금 생각해본건 공간을 격자로 분리해놓고 같은 격자 내 점들끼리 격자 크기로 정규화하는 건데 점들이 매우 밀집되어 있으면 이것도 한계가 있어 보임. - dc App
방금 생각난건데 같은 morton code 가진 점들끼리 재비교하면 되지 않을까싶다. 일단 64비트해보고 재비교 구현해봐야지 - dc App