티스토리 뷰

0. 핵심 요약

UE 5.8-Preview는 두 개의 신규 Experimental 플러그인을 통해 "Mesh Terrain" 시스템을 도입했다:

에디터 모드를 제공하는 `MeshTerrainMode`와 런타임 데이터/스트리밍을 담당하는 `MeshPartition`. 두 플러그인 모두 5.7.4에는 존재하지 않는다.

핵심 결론:

Mesh Terrain Landscape처럼 영구적인 2D 하이트맵을 저장하지 않는다.

하이트맵은 일회성 임포트 포맷일 뿐이며, 임포트 직후 `FDynamicMesh3` 삼각형 메시로 변환된다. 이 덕분에 오버행/동굴/분기 토폴로지가 가능하다.

두 절벽 메시를 하나로 합치는 작업은 가능하다에디터 타임 한정으로 복셀화(Voxelization) 기반 CSG 도구 `FVoxelBooleanMeshesOp` / `FVoxelMergeMeshesOp`를 통해 수행된다.

내부적으로 마칭 큐브(MarchingCubes)와 협대역(Narrowband) SDF가 사용된다.

패키지된 런타임에서는 복셀/SDF 저장소가 없으며, 베이크된 `FMeshData` 삼각형 메시만 유통된다.

 


1. 플러그인 구성

1.1 두 개의 신규 플러그인

플러그인 역할 모듈 수 런타임/에디터
MeshTerrainMode Mesh Partition 편집을 위한 인터랙티브 툴 모음 1 (Editor) 에디터 전용
MeshPartition 런타임 데이터 + 스트리밍 + 에디터 워크플로 5 (Runtime 2 + Editor 3) 혼합

MeshTerrainMode 매니페스트 요약

결론적으로 아직 Experimental이며, 기본적으로 활성화되지 않습니다.

MeshPartition 모듈

  • MeshPartition (Runtime, Default)
  • MeshPartitionCompute (Runtime, PostConfigInit)
  • MeshPartitionEditor (Editor)
  • MeshPartitionModelingToolset (Editor)
  • MeshPartitionEditorUI (Editor)

2. 데이터 표현 — Landscape vs Mesh Terrain

2.1 Landscape 기준선

Landscape는 영구 2D 하이트맵 기반 시스템이다.

  • 핵심 구조: `FHeightmapData` `UTexture2D` 래핑 (LandscapeComponent.h:321)
  • 저장 포맷: uint16 raw 배열 + LOD mip — `TMap<int32, TArray<uint16>> HeightMipData` (LandscapeComponent.h:227)
  • 그리드: `(SubsectionSizeQuads + 1) * ComponentNumSubsections` 정점 (: 4×63+1 = 253 정점/컴포넌트)
  • LOD: 컴포넌트별 결정론적 mip + GPU에서 정점 모핑
  • 토폴로지: **2D 정규 그리드만**. X-Y 평면 + Z 높이. 오버행/동굴 불가능
  • 스트리밍: `ALandscapeStreamingProxy`가 셀별 액터 분할
  • 편집: 브러시 페인팅으로 높이만 수정
  • 결정론: 높음 (고정 그리드, 재현 가능)

2.2 Mesh Terrain (MeshPartition) 표현

Mesh Terrain은 완전 3D 삼각형 메시 기반이다.

  • 핵심 구조: `FMeshData` — 명시적 정점/삼각형 배열 (MeshPartitionMeshData.h:17)

  • `FDynamicMesh3` `FMeshDescription`과 양방향 변환
  • `FTriMeshCollisionData`로 변환되어 복합 충돌 생성
  • 토폴로지완전 3D오버행/동굴/분기 가능
  • 스트리밍: `ACompiledSection` 액터가 World Partition 그리드(`GridCellCoord`)에 등록
  • `bSplitSectionsToMatchWorldPartitionRuntimeGrid` 플래그로 자동 그리드 정렬
  • 결정론: 낮음 (메시 편집 순서 의존)
TArray<FVector3d> Vertices;       // 3D 위치

TArray<FIndex3i> Triangles;       // 삼각형 인덱스

TArray<FVector3f> Normals;        // 법선

TArray<FUVChannel> ChannelUVs;    // UV 채널

TArray<FWeightLayer> WeightLayers; // 가중치 레이어

2.3 하이트맵의 역할일회성 임포트

Mesh Terrain에서 하이트맵은 "시작점" 임포트 포맷일 뿐, 런타임 데이터 모델이 아니다.

  • `FHeightmapImporter` PNG/RAW 하이트맵을 `TArray64<uint16>`로 로드 (MeshPartitionHeightmapImporter.h:22)
  • 바이리니어 보간으로 UV → 정점 XY + Z(높이) 매핑 (MeshPartitionHeightmapImporter.cpp:418)
  • 쿼드 분할삼각형 그리드 생성 (MeshPartitionHeightmapImporter.cpp:432)
  • 섹션별 메시를 병렬 스레드로 빌드 후 `AMeshPartition` 액터에 머지 (MeshPartitionHeightmapImporter.cpp:235)
  • 임포트 직후 하이트맵 텍스처 폐기이후 모든 편집은 정점 단위로 진행
  • 에디터 메인 진입점: `BeginHeightmapImport` 액션 (MeshTerrainMode.cpp:1023)

2.4 차이 매트릭스

항목 Landscape Mesh Terrain
높이 저장 영구 `UTexture2D` + `uint16` mip 배열 임포트 시점만; 이후 삼각형 메시
메시 형태 암묵적 2D 그리드 명시적 `FDynamicMesh3`
오버행/동굴 불가능 (2D 함수 제약) 가능 (완전 3D)
분기 토폴로지 불가능 가능
LOD 컴포넌트별 결정론 mip Nanite fallback 의존
스트리밍 셀별 액터 (효율적 2D) 섹션별 (그리드 인식 약함)
편집 브러시 페인팅 (높이만) 모디파이어 스택 (비파괴 + 지오메트리 변형)
결정론성 높음 낮음

3. MeshTerrainMode 에디터 구조

3.1 메인 클래스

// MeshTerrainMode.h:38
class UMeshTerrainMode : public UBaseLegacyWidgetEdMode, 
public ILegacyEdModeSelectInterface

`UBaseLegacyWidgetEdMode` 기반 에디터 모드. ModelingToolset 인터랙티브 툴 인프라(`UInteractiveToolBuilder`, `UInteractiveTool`)를 사용한다.

3.2 서브모드 6

서브모드 목적 주요 툴 연산 모델
Create 절차적 메시 생성 CreateMegaMeshRectangle, HeightmapImport, DrawSpline, Pattern 메시 신규 생성 또는 하이트맵 임포트
Edit 메시 토폴로지/변환 Convert/Expand/Split/Stitch/Merge MegaMesh, ResectionMesh, EditPivot, BakeTransform, AttributeEditor 구조적 편집 (변위 없음)
Sculpt 정점 + 하이트맵 스컬핑 [Sculpt] Offset/Move/Smooth/Pinch/Flatten + [Height] HeightSculpt/HeightSmooth/HeightFlatten/ZeroHeight/SlopeErode 정점 푸시-(3D) + Z잠금 브러시(혼합)
Shapes CSG 부울 모디파이어 Add Box/Sphere/Cylinder/Capsule/Cone/Torus/Rectangle/Disc 모디파이어로 적용되는 CSG
Paint 어트리뷰트 페인팅 MeshAttributePaint, MeshVertexPaint, AttributeEditor 정점 색상/어트리뷰트 (비기하)
Modifiers 절차적 변형 스택 MeshProject, TexturePatch, Spline, ProjectMeshLayers, Lattice, Noise, Patch / Boolean / Remesh / SplineRemesh 변위 + 리메시 + CSG

3.3 Sculpt 서브모드의 듀얼 팔레트

Sculpt는 두 가지 모드를 함께 제공한다.

  • [Sculpt 팔레트] 정점을 노멀 방향으로 푸시/ — **완전 3D** 변형, 오버행 생성 가능
  • [Height 팔레트] Z축에만 작용하는 변위 — Landscape 스타일의 하이트필드 편집, 하이트맵 임포트 후에 사용

이 분리는 "기본 하이트맵 기반 지형" "3D 스컬프트 영역"을 동시에 한 자산 안에서 다루기 위함이다.

3.4 모디파이어 스택

모디파이어 범주 효과 토폴로지 변경
URemeshModifier 리토폴로지 Uniform/Adaptive 링, Red-Green 테셀레이션 O
UBooleanModifier CSG Union / Subtract / Trim O (구멍/오버행)
UMeshProjectModifier 변위 참조 메시에 Z 투영 (Raise/Lower/Set) X
USplineModifier 변위 스플라인 경로 따라 변형 X
UPatchModifier 로컬 패치 국지 메시 부분 교체 O (국소)
UTexturePatchModifier 변위 텍스처 기반 변위 X
UNoiseModifier 변위 절차적 정점 오프셋 X
ULatticeModifier 변위 FFD(자유 형식 변형) 격자 X

실행 모델: `FTransformerPipeline`이 모디파이어 체인을 비동기 태스크로 실행. 결과는 `FMeshData`에 베이크.


4. 두 절벽 합치기 — 복셀/SDF 알고리즘

4.1 결론

두 개의 분리된 절벽 메시를 토폴로지 일관성 있게 (오버행 포함) 하나로 합치는 작업은 **에디터에서 가능**하다. 내부적으로 복셀화 + 마칭큐브 + 협대역 SDF가 사용된다. **런타임에서는 불가능** — 결과는 베이크된 삼각형 메시로만 유통된다.

4.2 사용 가능 도구

클래스/Op 위치 역할
Voxel Boolean FVoxelBooleanMeshesOp VoxelBooleanMeshesOp.h:21 복셀 그리드 union/diff/intersect
Voxel Merge FVoxelMergeMeshesOp VoxelMergeMeshesOp.h:21 복셀 기반 메시 통합
Iso-Surface Offset IsoSurfaceD MergeMeshesTool.cpp:74 암시적 표면 오프셋 제어
Narrowband SDF TSweepingMeshSDF<> MeshSimpleShapeApproximation.cpp:551 NarrowBand_SpatialFloodFill 모드
Marching Cubes MarchingCubesGridScale 설정 MeshSimpleShapeApproximation.cpp:398 SDF → 메시 추출
ProxyLOD CSG IVoxelBasedCSG::CreateCSGTool() VoxelMergeMeshesOp.cpp:48 ProxyLOD 통합

4.3 MeshTerrainMode에서 등록된 액션

// MeshTerrainMode.cpp:918
ToolManager->RegisterToolType("BeginVoxelMergeTool", ...);

// MeshTerrainMode.cpp:921
ToolManager->RegisterToolType("BeginVoxelBooleanTool", ...);

MeshTerrainModeManagerActions.cpp:184-185 에서 "Voxel Boolean" "Voxel Merge" 명령어가 UI에 노출된다.

4.4 알고리즘 동작 흐름 (두 절벽단일 메시)

  • 입력: `FDynamicMesh3` × 2 (절벽 A, 절벽 B)
  • 복셀화: 각 메시를 협대역 SDF로 변환 (`TSweepingMeshSDF<>` + NarrowBand_SpatialFloodFill)
  • CSG 연산: 복셀 도메인에서 union / subtract / intersect / merge
  • 마칭 큐브: 결과 SDF iso-surface (`IsoSurfaceD` 오프셋) 추출 `FDynamicMesh3`
  • 옵션: 리메시 모디파이어로 정점 분포 정리
  • 결과 베이크: `FMeshData`로 압축되어 `ACompiledSection` 액터에 저장

4.5 런타임 제약

  • `ModelingOperatorsEditorOnly` 모듈은 **에디터 전용** — 패키지에 포함되지 않음
  • `FMeshBoolean` (GeometryCore 런타임 모듈)은 존재하지만 `MeshPartitionEditor/Modifiers/MeshPartitionBooleanModifier.cpp:6`에서만 사용에디터 모디파이어로 한정
  • `MeshPartition.Build.cs` (런타임)에는 Boolean 모디파이어 모듈 없음
  • 런타임 데이터는 베이크된 `FMeshData` 삼각형 메시뿐. SDF/복셀 그리드는 저장되지 않음
  • 결론: "두 절벽 합치기" **에디터 워크플로 한정**. 게임 플레이 중 동적 합성은 불가

5. 채널 / 충돌 / 렌더링

5.1 채널 시스템 (메타데이터)

  • `FChannelMap` / `FChannelName` — 명명된 어트리뷰트 (가중치 레이어 등)
  • 커스텀 프리미티브 데이터(Custom Primitive Data)로 머티리얼 룩업 — 5비트 슬롯 패킹, 최대 24채널
  • 채널 텍스처는 UV 공간에 래스터화 (월드 공간 복셀 아님)
  • Virtual Texture fallback 컴포넌트
  • 타일 기반 머티리얼 캐시

5.2 충돌

  • `UMeshPartitionCollisionComponent` `FTriMeshCollisionData` 보유
  • `IInterface_CollisionDataProvider` 구현복합 충돌(Complex Collision)을 삼각형 메시에서 직접 추출
  • `bCanEverAffectNavigation` 플래그로 NavMesh 영향 제어
  • 채널별 물리 머티리얼 매핑 (가중치 폴백)

5.3 컴포넌트 계층

클래스 역할 파일
AMeshPartition 루트 액터, 정의 + 컴포넌트 보유 MeshPartition.h:24
UMeshPartitionDefinition 공유 설정 에셋 MeshPartitionDefinition.h:149
UMeshPartitionComponent PrimitiveComponent 기반 (Runtime)
UMeshPartitionStaticMeshComponent StaticMeshComponent 래퍼 (Runtime)
UMeshPartitionCollisionComponent 충돌 전용 MeshPartitionCollisionComponent.h:35
ACompiledSection 런타임 결과 액터 (World Partition) MeshPartitionCompiledSection.h:163

6. 제약사항 및 결론

6.1 사용 시 제약

  • Experimental 단계 — API 변경 가능성 큼
  • 기본 비활성화 (`EnabledByDefault: false`)
  • StylusInput 의존스타일러스 디바이스 지원 권장
  • World Partition 활성 환경 필요 — `bSplitSectionsToMatchWorldPartitionRuntimeGrid`
  • 자체 LOD 없음 — Nanite 의존
  • 런타임 동적 토폴로지 변경 불가모든 CSG/복셀은 에디터에서 베이크

6.2 Mesh Terrain이 적합한 시나리오

  • 오버행/동굴/아치 등 비-함수형 지형이 필요한 환경 (절벽, 협곡, 동굴 입구)
  • 아티스트가 스컬프팅 워크플로로 직접 모델링하는 핸드크래프트 지형
  • CSG로 절차적 절벽 결합/구멍 뚫기가 필요한 레벨
  • Nanite 활용 가능한 PC/콘솔 타깃

6.3 Landscape를 유지해야 하는 시나리오

  • 거대한 2D 함수형 지형 (km 단위 평원, 언덕)
  • 결정론적 LOD 모핑이 중요한 게임 (모바일/멀티플레이)
  • Layer 기반 텍스처 블렌딩 워크플로
  • 스플랫맵 + /디칼 시스템에 강하게 의존하는 프로젝트

6.4 두 시스템 병행 권장

UE 5.8 단계에서는 "기본 지형 = Landscape, 특수 오버행 영역 = Mesh Terrain" 하이브리드 접근이 현실적이다. Mesh Terrain은 절벽/동굴/아치 등 함수형으로 표현할 수 없는 국지 지형에 한정 사용하고, 평원/언덕은 Landscape의 효율적 2D 스트리밍과 결정론적 LOD를 활용한다.


부록 A. 핵심 파일 경로

Plugins/Experimental/MeshTerrainMode/MeshTerrainMode.uplugin

Plugins/Experimental/MeshTerrainMode/Source/MeshTerrainMode/Private/MeshTerrainMode.h

Plugins/Experimental/MeshTerrainMode/Source/MeshTerrainMode/Private/Submodes/*

Plugins/Experimental/MeshPartition/MeshPartition.uplugin

Plugins/Experimental/MeshPartition/Source/MeshPartition/Public/MeshPartitionMeshData.h

Plugins/Experimental/MeshPartition/Source/MeshPartitionEditor/Public/MeshPartitionHeightmapImporter.h

Plugins/Runtime/MeshModelingToolset/Source/ModelingOperatorsEditorOnly/Public/CompositionOps/VoxelBooleanMeshesOp.h

Plugins/Runtime/MeshModelingToolset/Source/ModelingOperatorsEditorOnly/Public/CompositionOps/VoxelMergeMeshesOp.h

Plugins/Runtime/GeometryProcessing/Source/DynamicMesh/Private/ShapeApproximation/MeshSimpleShapeApproximation.cpp

Source/Runtime/Landscape/Classes/LandscapeComponent.h

부록 B. 공식 문서

부록 C. 향후 조사 권장

  • Nanite 적용 시 LOD 비용 측정 — Landscape mip 시스템과 비교 벤치마크
  • Voxel Boolean의 입력 메시 해상도별 베이크 시간/메모리 프로파일
  • World Partition 셀 경계에서의 메시 이음새(seam) 처리 방식 검증
  • 멀티 유저 에디터에서의 모디파이어 스택 동시 편집 충돌 정책
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함