티스토리 뷰

[Graphics] 복셀 마칭큐브와 Mesh Terrain - 2

[Graphics] 복셀 마칭큐브와 Mesh Terrain - 3

[Graphics] 복셀 마칭큐브와 Mesh Terrain - 4

 

마칭큐브는 3차원 스칼라 장(scalar field)에서 등치면(isosurface)을 삼각형 메시로 뽑아내는 알고리즘이다. 1987 Lorensen Cline SIGGRAPH에서 발표한 이후 의료 영상의 CT 표면 재구성부터 게임의 절차적 지형, 유체 시뮬레이션의 마칭 결과 렌더까지, "복셀 그리드를 진짜 메시로 바꿔야 하는 모든 자리"의 표준이 되었다. UE 5.8에 새로 들어온 MeshTerrainMode / MeshPartition 플러그인도 절벽 두 개를 붙이는 그 순간에 내부적으로 복셀화 → 마칭큐브 → 협대역 SDF 파이프라인을 돌린다. 이 글은 그 핵심을 한 번 끝까지 풀어본다.

왜 이 글이 따로 필요한가

지난 글에서 UE 5.8의 메시 기반 지형 시스템 두 종(MeshTerrainMode, MeshPartition)을 훑었다. 그때 "두 절벽을 합치는 순간엔 복셀화 + 마칭큐브 + 협대역 SDF가 에디터에서 돌아간다"는 한 줄로 넘어갔는데, 그 한 줄의 무게가 사실 글 전체보다 무겁다. 마칭큐브를 모르면 그 파이프라인이 왜 그렇게 생겼는지, 왜 런타임이 아니라 에디터 전용인지, 왜 협대역 SDF로 잘라내는지가 전부 블랙박스로 남는다.

그래서 이번엔 순서를 뒤집는다. 마칭큐브가 주연이고, UE 5.8 메시 테레인은 그 알고리즘이 실제 엔진 코드에 어떻게 박혀 들어가는지를 보여주는 사례 한 편이 된다.

이 글이 답하는 것 / 답하지 않는 것

답하는 것

      등치면이 뭐고, "큐브 단위로 행진"하면 그게 뽑히는지

      큐브 8버텍스를 안/밖으로 분류해서 만든 8비트 인덱스가 어떻게 256개 경우, 그리고 회전·반사 대칭으로 15개 고유 케이스로 줄어드는지

      엣지 테이블과 삼각형 테이블이 무엇을 들고 있고, 한 번의 룩업으로 어떻게 삼각형들이 튀어나오는지

      선형 보간으로 엣지 위 교점을 어디에 찍는지 (t = (iso - v0) / (v1 - v0))

      1987년부터 따라다닌 모호성 케이스 (6, 10, 12, 13) — 면 모호성과 내부 모호성, 그리고 dual surface 문제가 왜 생기는지

      Dual Contouring / Surface Nets 같은 사촌 알고리즘들과의 짧은 비교

      성능 / 메모리 측면의 실전 고려사항

      위 모든 게 UE 5.8 MeshTerrainMode "두 절벽 붙이기" 흐름에 어떻게 매핑되는지

[IMAGE 02 Ch1 metaphor: "two cliffs welded into one continuous surface by an unseen algorithmic chisel"]

답하지 않는 것

      등치면 이론의 미분기하학적 정초 (풀리 핸들 같은 토폴로지 깊이)

      GPU 컴퓨트 셰이더 구현 코드 (의사코드까지만)

      Manifold Dual Contouring, Cubical Marching Squares 같은 고급 변종의 전체 구현

      UE 플러그인의 6개 서브모드(Create / Edit / Sculpt ) 디테일 — 그건 지난 글로 충분히 깔아 두었다

      런타임 동적 편집 기능에 대한 추측 (현재 에디터 전용이라는 사실만 인용한다)

 

4단계 로드맵

챕터 무엇
Ch1 지금 읽고 있는 개요
Ch2 입문 — 2D 마칭 스퀘어로 직관 잡고 3D로 점프
Ch3 딥다이브 — 인덱싱 → 테이블 → 보간 → 모호성 → 비교 → 성능
Ch4 사례 — UE 5.8 `MeshTerrainMode`에서 마칭큐브가 실제로 호출되는 지점

 

순서대로 읽으면 매끄럽지만, 각 챕터는 자기 토픽 문장 한 줄로 시작해서 독립적으로 떠먹어도 큰 무리가 없게 잘랐다.

전제 독자

게임 프로그래머 또는 테크니컬 아티스트(TA)를 가정한다. 다음은 글 안에서 따로 풀지 않고 그냥 쓴다.

      스칼라 장(scalar field): 공간상의 점마다 실수 한 개가 정의된 함수 f(x, y, z) → ℝ

      등치면(isosurface): 그 값이 특정 임계값과 같아지는 지점들의 집합 { p : f(p) = iso }

      SDF(Signed Distance Field): 가장 가까운 표면까지의 부호 있는 거리. 안쪽이 음수, 바깥이 양수

      복셀(voxel): 3D 그리드 셀. 여기서는 한 셀의 8개 꼭짓점에서 스칼라 값을 샘플링했다는 의미

      메시 토폴로지 기본: 버텍스 / 엣지 / 삼각형 / 노멀, 매니폴드 / 비매니폴드

이 정도는 UEFDynamicMesh3 API Houdini VDB / VolumeSDF 노드를 만져본 사람이라면 이미 머릿속에 들어있는 어휘다.

 

이 글의 그림들 — 책임 분리

본격적으로 들어가기 전에 한 가지만 분명히 해 두자. 마칭큐브 같은 알고리즘 글은 그림의 정확성이 글의 정확성을 절반쯤 결정한다. 큐브 8버텍스 어디가 V0인지 한 칸 어긋나면 인덱싱 규칙 전체가 무너지고, 256 케이스 중 6번이 13번처럼 그려지면 모호성 절()이 통째로 거짓말이 된다. 그래서 이 글의 그림은 두 갈래로 명확히 갈라 그렸다.

      정확 도식 (SVG / Python). 큐브 인덱싱, 15 케이스 그리드, 엣지 테이블 룩업 흐름, 보간 벡터, ambiguity 분기 — 좌표가 의미를 갖는 모든 도식은 손으로 짠 SVG 또는 matplotlib 스크립트로 만들었다. 코드가 공개되어 있으니(output/scripts/) 재현 가능하고, 라벨 한 칸 옮기는 수정도 안전하다.

      일러스트 (AI 이미지 — nanobanana). 표지, 비유 컷, 분위기 컷처럼 "느낌"만 전달하면 되는 자리는 nanobanana(Gemini 기반 이미지 생성)로 뽑았다. 정확성은 글이 책임지고, 그림은 호흡 정도만 맞춘다.

이 분리를 미리 깔아두는 이유는, 본문에서 "이건 도식이라 좌표를 믿어도 된다 / 이건 일러스트라 시각적 분위기만 읽어라" 같은 메타 설명을 매번 붙이지 않기 위해서다. 캡션의 톤만 보고도 어느 쪽인지 짐작하면 된다.

표기 약속

      큐브 8버텍스는 V0V7로 라벨링한다. 인덱싱 규칙(어느 모서리가 V0인지) Ch2 "큐브 인덱싱 컨벤션" 표에서 한 번에 못 박아 두고, 이후 챕터 전체에서 동일하게 쓴다.

      12 엣지는 E0E11이다.

      등치값은 iso. 한 엣지 위 두 끝값은 v0, v1 (소문자 v는 스칼라 값, 대문자 V는 정점 위치).

      보간 파라미터는 t [0, 1]. 교점 위치는 p = p0 + t * (p1 - p0), t = (iso - v0) / (v1 - v0).

, 시동 걸었다. 다음 챕터에서 2D 격자 위에 등치선을 그어 보면서 3D로의 점프를 준비한다. 그 점프가 끝나고 나면 마칭큐브의 핵심 골격이 이미 손바닥에 들어와 있을 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함