8. Index 배열 의 역할은
1. 특정 면을 이루고 있는 정점들을 알려줌.
2. 면의 법선 벡터를 알려줌. (겉인지 안인지 알려줌)
1
2 3
𝑏
Ԧ𝑎Ԧ𝑎 × 𝑏
1
2
3
4
5
1번 면은 vertex 1, 2, 3으로 이루어짐.
2번 면은 vertex 3, 4, 5로 이루어짐.
법선 벡터는 그래픽스에서 빛의 반사나
culling 등 다양한 곳에서 쓰임.
12. Ex) 임의로 생성되는 지형(Terrains)
https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html
13. Marching Cubes Algorithm
Lorensen와 Cline이 1987년 SIGGRAPH 에 발표한 알고리즘
3차원 공간의 물체를 가장 잘 표현하는 polygon mesh를 결과로 반환함.
(표현하려는 물체와 가장 비슷한 polygon mesh를 그려줌)
처음에는 의학에서 CT나 MRI같은 스캔 영상의 시각화를 위해 사용함.
한동안 특허때문에 많이 사용되지 못함. (지금은 특허 만료됨)
http://www.kompath.com/HSCM/index.html
14. 마칭 큐브 알고리즘에서의 입력값은?
‘경계가 있는 부동 소수점 값’의 3차원 배열
F < 0
F > 0
F = 0
15. 마칭 큐브 알고리즘에서의 입력값은?
‘경계가 있는 부동 소수점 값’의 3차원 배열
F > 0
F < 0
F = 0
http://polymathprogrammer.com/2008/09/01/cartesian-
coordinates-and-transformation-matrices/
한 칸 한 칸을 voxel이라고 부름
16. 지금부터 이 voxel 배열을 순회하면서 메쉬로 변환할 겁니다.
이래서 이름이 Marching cubes(행진하는 큐브들)입니다.
17. F < 0
F
F > 0
1. 8개의 voxel을 하나의 큐브로 정의
F
F < 0
5 6
1 2
47
0 3
편의를 위해 같은 큐브를 보는 방향만 바꿈
18. 2. 조건에 해당되는 폴리곤 메쉬 찾기
8개의 모서리에 대해 나올 수 있는 경우의 수 = 2 ^ 8 = 256
왼쪽의 이미지는 256개의 경우의 수에서
회전 또는 대칭에 의한 중복,
8개가 모두 같은 경우를 제외함
https://developer.nvidia.com/gpugems/GPUGems3/gpug
ems3_ch01.html
19. 2. 조건에 해당되는 폴리곤 메쉬 찾기
그래서 위에서 나온 큐브는 아래와 같이 폴리곤 메쉬가 생성됩니다.
20. 2. 조건에 해당되는 폴리곤 메쉬 찾기
물론 폴리곤 메쉬를 만들기 위해
vertex 배열과 index 배열을 찾아야 합니다.
21. 3. Vertex 찾기
vertex는 소수점의 +/-가 교차하는 edge 위에 존재합니다.
그래서 vertex를 edge번호로 구분할 수 있습니다.
28. 4. Lookup table 찾아보기
구글링하면 이런 식으로 참조표(lookup table)을 만들어 둔게 있습니다.
29. F < 0
F
F > 0
F
F < 0
5 6
1 2
47
0 3
이 큐브의 구성은 v7|v6|v5|v4|v3|v2|v1|v0 = 11000001 = 193
4. Lookup table 찾아보기
30. 4. Lookup table 찾아보기
따라서 아까 구한 193을 방금 본 참조표의 인덱스로 사용하면 됩니다.
193
int edge =
edgeTable[193]
아래의 Lookup table은 예시. 실제로는 구현하기 나름임.
int[16] triangles =
trianglesTable[193]
12개의 edge 중에 vertex가 있는 edge를
1로 나타낸 12비트 정수값을 반환함.
최대 5개의 triangle의 index들을
배열로 반환함. (edge 번호)
31. 전체 과정
193
int edgeTable[193]
int[16] trianglesTable[193]
2. 조건에 해당되는
폴리곤 메쉬 찾기
1. 8개의 voxel을
하나의 큐브로 정의
4. Lookup table 찾아보기
+ 0.2 - 0.8
3. Vertex 찾기
{ Index 배열 }
32. 전체 과정
Voxel 공간 처음부터 끝까지 반복하면서 저장한 다음 메쉬화 하면 됩니다.
(0, 0, 0) 부터 (width-1, height-1, depth-1)까지 반복
42. 아무튼 발표는 여기까지고 참고 자료들…
Sebastian Lague의 Coding Adventure: https://github.com/SebLague/Marching-
Cubes
Unity로 체험할 수 있는 마칭 큐우으브으
Perlin noise에 DirectX 기반 GPU 병렬 프로그래밍 적용: https://github.com/Scrawk/Marching-
Cubes-On-The-GPU
마칭 큐브 + 지형 만드는 방법 (텍스쳐도 입힐 수 있음!!!)
제가 공유하는거 까먹을 수도 있으니 카메라로 찍든지 하세요.
Nvidia GPU Gems 3: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html
마칭 큐브나 그 외 알고리즘 이론 참고
마칭 큐브, 마칭 사면체에 대한 정리: http://paulbourke.net/geometry/polygonise/
Dual contouring: https://www.boristhebrave.com/2018/04/15/dual-contouring-tutorial/