PART 3 · 강의 1/3

지형 기반 배치

Landscape와 연동하여 경사도, 높이, 법선 방향에 따라 오브젝트를 배치하는 실전 기법을 학습합니다.

01

Landscape 데이터 연동

Get Landscape Data와 Surface Sampler 조합

PCG에서 지형 기반 배치의 시작점은 Get Landscape Data 노드입니다. 이 노드는 레벨의 Landscape Actor에서 Surface 데이터를 추출하여 Surface Sampler에 전달합니다.

Landscape 연동 기본 패턴
// 방법 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만 샘플링
Landscape Layer 정보

Get Landscape Data는 Landscape의 페인트 레이어 정보도 포함합니다. Texture Sampler로 특정 레이어의 가중치를 읽어 "잔디 레이어에만 꽃 배치" 같은 규칙을 만들 수 있습니다.

02

경사도와 높이 기반 필터링

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 → 절벽 바위
03

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 설정으로 포인트 회전을 법선에 맞출 수 있습니다.

04

Landscape Layer 기반 배치

Texture Sampler로 Landscape 페인트 레이어 활용

Landscape의 페인트 레이어(잔디, 흙, 바위 등)를 Texture Sampler로 읽어 레이어별 식생을 배치할 수 있습니다. 레벨 아티스트가 페인팅한 영역에 자동으로 적합한 식물이 배치됩니다.

Landscape Layer 기반 배치
// 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] // 바위, 자갈 배치
Texture Sampler 해상도

Landscape Weight Map의 해상도는 Landscape의 컴포넌트 크기에 따라 달라집니다. 해상도가 낮으면 레이어 경계가 뭉개질 수 있으므로, 경계 부근에서는 Spatial Noise를 추가하여 자연스러운 전환을 만드는 것이 좋습니다.

SUMMARY

핵심 요약

  • Get Landscape Data로 Landscape Surface 데이터를 가져와 Surface Sampler에 연결한다
  • $Steepness(경사도)와 $Position.Z(높이)로 지형 특성에 맞는 필터링을 한다
  • Projection 노드로 포인트를 서피스에 정확히 투영하고, 법선 정렬도 가능하다
  • Normal to Density는 법선 방향 기반 밀도 할당으로 경사면의 식생 감소를 자연스럽게 표현한다
  • Texture Sampler로 Landscape 페인트 레이어를 읽어 레이어별 식생을 자동 배치한다
  • 경사도, 높이, 법선, 레이어를 조합하면 현실적인 대규모 환경을 프로시저럴로 생성할 수 있다
PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: Landscape 기반 포인트 생성

Get Landscape Data와 Surface Sampler로 Landscape 위에 포인트를 생성하세요. 경사도와 높이 필터를 적용하여 평탄한 영역에만 나무를, 경사면에는 바위를 배치하세요.

실습 2: 레이어 가중치 활용

Landscape에 페인팅된 레이어(Grass, Dirt, Rock) 가중치를 읽어 각 지형 타입에 맞는 에셋을 배치하세요. Grass에는 풀과 꽃, Rock에는 돌과 이끼를 배치하세요.

심화 과제: 대규모 오픈 월드 지형 배치

8km x 8km 이상의 Landscape에서 World Partition과 연동된 PCG 배치를 구현하세요. 파티셔닝된 영역별 독립 생성과 스트리밍 경계 연속성을 보장하세요.