지형 기반 배치
Landscape와 연동하여 경사도, 높이, 법선 방향에 따라 오브젝트를 배치하는 실전 기법을 학습합니다.
Landscape 데이터 연동
Get Landscape Data와 Surface Sampler 조합
PCG에서 지형 기반 배치의 시작점은 Get Landscape Data 노드입니다. 이 노드는 레벨의 Landscape Actor에서 Surface 데이터를 추출하여 Surface Sampler에 전달합니다.
// 방법 1: Get Landscape Data 사용
[Get Landscape Data] // 자동으로 레벨의 Landscape 참조
↓ (Surface)
[Surface Sampler] // Landscape 표면에 포인트 생성
// 방법 2: PCG Component Input 설정
// PCG Component > Input Type: "Landscape"
// → 그래프의 Input 노드에서 직접 Landscape 데이터 수신
// 방법 3: PCG Volume + Landscape 조합
[Get Landscape Data]
↓
[Intersection] // Volume 범위로 제한
Source: Landscape
Target: [Get Volume Data]
↓
[Surface Sampler] // Volume 내부의 Landscape만 샘플링
Get Landscape Data는 Landscape의 페인트 레이어 정보도 포함합니다. Texture Sampler로 특정 레이어의 가중치를 읽어 "잔디 레이어에만 꽃 배치" 같은 규칙을 만들 수 있습니다.
경사도와 높이 기반 필터링
Steepness와 Position.Z를 활용한 지형 적응 배치
경사도($Steepness) 활용
Surface Sampler가 생성한 포인트에는 해당 지점의 경사도($Steepness) 값이 자동으로 포함됩니다. 0은 완전 평탄, 1은 수직 면을 나타냅니다.
| 경사도 범위 | 지형 상태 | 적합한 배치물 |
|---|---|---|
| 0.0 ~ 0.15 | 평탄 | 건물, 캠프, 큰 나무, NPC 스폰 |
| 0.15 ~ 0.35 | 완만한 경사 | 중간 나무, 관목, 돌무더기 |
| 0.35 ~ 0.6 | 급경사 | 작은 관목, 이끼, 바위 |
| 0.6 ~ 1.0 | 절벽 | 절벽 식물, 암석 노출, 배치 불가 영역 |
// 경사도와 높이를 조합한 식생 배치 그래프
[Surface Sampler] (0.1 ppsm)
↓
// 평탄 영역 분기
[Attribute Filter Range] ($Steepness: 0.0 ~ 0.2)
↓ Inside
[Attribute Filter Range] ($Position.Z: 0 ~ 1000)
↓ Inside → 저지대 평원 나무
↓ Outside → 고지대 침엽수
↓ Outside (경사진 영역)
[Attribute Filter Range] ($Steepness: 0.2 ~ 0.5)
↓ Inside → 경사면 관목
↓ Outside → 절벽 바위
Projection과 Normal to Density
법선 방향 기반 배치와 지형 투영
Projection 노드
Projection은 포인트를 지정된 서피스 위로 투영합니다. 공중에 생성된 포인트를 지형 표면에 정확히 놓거나, 그리드로 생성한 포인트를 지형에 맞추는 데 사용됩니다.
| 파라미터 | 설명 |
|---|---|
Projection Target |
투영할 대상 서피스 (Landscape, Static Mesh 등) |
Project Rotation |
포인트 회전을 서피스 법선에 맞출지 여부 |
Projection Direction |
투영 방향 벡터 (기본: -Z 방향, 아래로) |
Normal to Density
Normal to Density는 서피스의 법선 방향을 기반으로 밀도 값을 설정합니다. 위를 향하는 면에는 높은 밀도, 경사진 면에는 낮은 밀도를 부여하여 자연스러운 분포를 만듭니다.
// 법선 방향에 따른 밀도 분포 패턴
[Get Landscape Data]
↓
[Surface Sampler] // 높은 밀도로 샘플링
Points Per Sq.Meter: 0.5
↓
[Normal to Density] // 법선 기반 밀도 재계산
Normal: (0, 0, 1) // Up 방향과 비교
Offset: 0.0
Strength: 1.0
↓
[Density Filter] // 밀도 필터로 간추리기
Lower Bound: 0.3
↓
[Self Pruning] // 겹침 제거
↓
[Transform Points] // 랜덤 변형
↓
[Static Mesh Spawner] // 최종 배치
나무는 항상 위를 향해야 하지만, 바위나 이끼는 지형 법선에 정렬하면 더 자연스럽습니다.
Projection의 Project Rotation = true 설정으로 포인트 회전을 법선에 맞출 수 있습니다.
Landscape Layer 기반 배치
Texture Sampler로 Landscape 페인트 레이어 활용
Landscape의 페인트 레이어(잔디, 흙, 바위 등)를 Texture Sampler로 읽어 레이어별 식생을 배치할 수 있습니다. 레벨 아티스트가 페인팅한 영역에 자동으로 적합한 식물이 배치됩니다.
// Landscape 레이어별 식생 자동 배치
[Surface Sampler]
↓
[Texture Sampler] // Landscape Weight Map 읽기
Texture: LandscapeGrassLayerWeightmap
Output Attribute: "GrassWeight"
↓
[Attribute Filter Range] // 잔디 레이어 가중치 높은 곳
Attribute: "GrassWeight"
Min: 0.5
Max: 1.0
↓ Inside
[Static Mesh Spawner] // 풀, 꽃 배치
// 같은 포인트에 바위 레이어도 체크
[Texture Sampler] // 바위 레이어
Texture: LandscapeRockLayerWeightmap
Output Attribute: "RockWeight"
↓
[Attribute Filter Range] // 바위 레이어 영역
Attribute: "RockWeight"
Min: 0.6
↓
[Static Mesh Spawner] // 바위, 자갈 배치
Landscape Weight Map의 해상도는 Landscape의 컴포넌트 크기에 따라 달라집니다. 해상도가 낮으면 레이어 경계가 뭉개질 수 있으므로, 경계 부근에서는 Spatial Noise를 추가하여 자연스러운 전환을 만드는 것이 좋습니다.
핵심 요약
- Get Landscape Data로 Landscape Surface 데이터를 가져와 Surface Sampler에 연결한다
- $Steepness(경사도)와 $Position.Z(높이)로 지형 특성에 맞는 필터링을 한다
- Projection 노드로 포인트를 서피스에 정확히 투영하고, 법선 정렬도 가능하다
- Normal to Density는 법선 방향 기반 밀도 할당으로 경사면의 식생 감소를 자연스럽게 표현한다
- Texture Sampler로 Landscape 페인트 레이어를 읽어 레이어별 식생을 자동 배치한다
- 경사도, 높이, 법선, 레이어를 조합하면 현실적인 대규모 환경을 프로시저럴로 생성할 수 있다
도전 과제
배운 내용을 직접 실습해보세요
Get Landscape Data와 Surface Sampler로 Landscape 위에 포인트를 생성하세요. 경사도와 높이 필터를 적용하여 평탄한 영역에만 나무를, 경사면에는 바위를 배치하세요.
Landscape에 페인팅된 레이어(Grass, Dirt, Rock) 가중치를 읽어 각 지형 타입에 맞는 에셋을 배치하세요. Grass에는 풀과 꽃, Rock에는 돌과 이끼를 배치하세요.
8km x 8km 이상의 Landscape에서 World Partition과 연동된 PCG 배치를 구현하세요. 파티셔닝된 영역별 독립 생성과 스트리밍 경계 연속성을 보장하세요.