PART 2 · 강의 2/3

필터와 셀렉터

Density Filter, Attribute Filter, Self Pruning 등 PCG 데이터를 선별하고 정제하는 핵심 필터 노드를 학습합니다.

01

Density Filter

밀도 값 기반 포인트 필터링

Density Filter는 포인트의 $Density 값을 기준으로 포인트를 통과/제거합니다. Surface Sampler가 생성한 밀도 값이나 Spatial Noise로 부여한 밀도를 기반으로 자연스러운 분포를 만듭니다.

파라미터 기본값 설명
Lower Bound 0.5 이 값 미만의 밀도를 가진 포인트는 제거
Upper Bound 1.0 이 값 초과의 밀도를 가진 포인트는 제거
Invert Filter false true면 범위 외부의 포인트를 통과시킴
밀도 기반 식생 계층화
// 밀도 값을 활용한 계층적 식생 배치 [Surface Sampler][Spatial Noise] // 밀도에 노이즈 추가 [Density Filter] (0.8 ~ 1.0) → 큰 나무 // 밀도 높은 영역 [Density Filter] (0.5 ~ 0.8) → 중간 나무 // 중간 밀도 영역 [Density Filter] (0.2 ~ 0.5) → 관목/풀 // 낮은 밀도 영역 [Density Filter] (0.0 ~ 0.2) → 바위/잔디 // 매우 낮은 밀도
Density의 이중 역할

$Density는 필터링 기준과 동시에 존재 확률로도 작동합니다. Static Mesh Spawner에서 밀도가 0.3인 포인트는 30% 확률로만 메시가 생성되므로, 필터를 거치지 않아도 자연스러운 분포가 만들어집니다.

02

Attribute Filter 계열

속성 값 기반 정밀 필터링

Attribute Filter 노드 종류

노드 필터 조건 출력
Attribute Filter 속성 값의 비교 조건 (==, >, < 등) Inside / Outside 두 출력 핀
Attribute Filter Range 속성 값의 범위 조건 (min ~ max) Inside / Outside 두 출력 핀
Point Filter 포인트 속성에 대한 조건식 Inside / Outside 두 출력 핀
Point Filter Range 포인트 속성의 범위 조건 Inside / Outside 두 출력 핀
Filter Data By Tag 태그 매칭 Inside / Outside 두 출력 핀
Filter Data By Type 데이터 타입 (Point, Spline 등) Inside / Outside 두 출력 핀
경사도 기반 필터링 예시
// 지형 경사도($Steepness)로 필터링하여 평탄한 곳에만 배치 [Surface Sampler] [Attribute Filter Range] Target Attribute: "$Steepness" Min Value: 0.0 Max Value: 0.3 // 경사도 30% 이하만 통과 Inclusive: true (Inside 핀) [Static Mesh Spawner] // 평탄한 영역에만 건물 배치 (Outside 핀) [Density Filter] // 경사진 곳에는 바위 배치 [Static Mesh Spawner] // 바위 메시
Inside / Outside 패턴

대부분의 필터 노드는 Inside(조건 충족)와 Outside(조건 불충족) 두 개의 출력을 제공합니다. Outside 핀을 활용하면 필터에서 제외된 포인트도 별도 처리가 가능하여 데이터를 낭비하지 않습니다.

03

Self Pruning

포인트 간 겹침을 방지하는 공간 필터

Self Pruning은 포인트들의 바운드가 서로 겹치는지 검사하여, 겹치는 포인트 중 우선순위가 낮은 것을 제거합니다. 나무나 건물 등 서로 겹치면 안 되는 오브젝트 배치에 필수적입니다.

파라미터 설명
Pruning Type Large to Small: 큰 포인트 우선 유지
Small to Large: 작은 포인트 우선 유지
Radius Similarity Factor 비슷한 크기의 포인트를 동일 우선순위로 취급하는 유사도 비율
Random Select 겹치는 포인트 중 랜덤으로 선택 (우선순위 무시)
Self Pruning 활용 패턴
// 겹침 방지 워크플로우 [Surface Sampler] [Bounds Modifier] // 포인트 바운드 크기 조정 Bounds Min: (-200, -200, -200) // 나무 간 최소 4m 간격 Bounds Max: (200, 200, 200) [Self Pruning] // 겹치는 포인트 제거 Pruning Type: Large to Small [Static Mesh Spawner] // 겹침 없는 나무 배치 // 핵심: Bounds Modifier의 크기가 곧 최소 간격 거리 // 바운드가 클수록 포인트 간 간격이 넓어짐
Self Pruning vs Density

Density Filter는 확률적으로 포인트를 제거하므로 간격이 보장되지 않습니다. 반면 Self Pruning은 공간적으로 겹침을 검사하므로 최소 간격을 보장합니다. 자연스러운 분포에는 둘을 함께 사용하는 것이 좋습니다.

04

공간 필터와 Boolean 연산

Intersection, Difference, Union으로 영역 조합하기

PCG는 공간 데이터 간의 Boolean 연산을 지원합니다. 이를 활용하면 특정 영역을 제외하거나, 두 영역의 교차 부분에만 생성하는 등의 복잡한 규칙을 정의할 수 있습니다.

노드 연산 결과
Intersection A AND B 두 데이터가 모두 존재하는 영역만 남김
Difference A NOT B Source에서 다른 데이터 영역을 제거
Union A OR B 두 데이터를 합친 전체 영역
Inner Intersection A AND B AND C... 모든 입력의 교차 영역
Difference를 활용한 제외 영역 설정
// 도로 주변을 나무 배치에서 제외하기 [Get Landscape Data] [Surface Sampler] // 지형 전체에 포인트 생성 [Difference] Source: Surface Sampler 출력 Difference: [Get Spline Data] // 도로 스플라인 → Bounds 확장 // 도로 양쪽 10m 여유 [Static Mesh Spawner] // 도로 제외 영역에만 나무
Exclusion Volume 패턴

실무에서는 별도의 Exclusion Volume(제외 볼륨)을 레벨에 배치하고, Get Volume Data → Difference 패턴으로 특정 건물이나 도로 영역을 PCG 생성에서 제외합니다. 이 방식이 가장 직관적이고 레벨 디자이너가 제어하기 쉽습니다.

SUMMARY

핵심 요약

  • Density Filter는 $Density 값 범위로 포인트를 선별하며, 계층적 식생 배치에 효과적이다
  • Attribute Filter 계열은 임의의 속성 값(경사도, 높이 등)으로 정밀 필터링이 가능하다
  • 대부분의 필터 노드는 Inside/Outside 두 출력을 제공하여 제외된 데이터도 활용할 수 있다
  • Self Pruning은 포인트 바운드 겹침을 검사하여 최소 간격을 보장한다
  • Difference 노드로 특정 영역(도로, 건물)을 생성에서 제외할 수 있다
  • Intersection, Union, Difference를 조합하면 복잡한 공간 규칙을 정의할 수 있다
PRACTICE

도전 과제

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

실습 1: 필터 노드 체인 구성

Density Filter → Distance Filter → Bounds Filter를 순차적으로 연결하여 포인트를 점진적으로 걸러내세요. 각 필터 후 Debug로 포인트 수 변화를 확인하세요.

실습 2: Selector 기반 분류

포인트 데이터를 Density 범위에 따라 3그룹(큰 나무, 관목, 풀)으로 분류하고 각 그룹에 다른 Static Mesh를 할당하세요.

심화 과제: 지형 기반 스마트 필터

Landscape의 경사도, 높이, 레이어 가중치를 조합한 복합 필터를 만드세요. 절벽에는 바위, 평지에는 풀, 물가에는 갈대가 자동 배치되는 지능형 필터를 구현하세요.