언리얼 엔진의 프로시저럴 콘텐츠 생성 프레임워크(Procedural Content Generation Framework) 테크니컬 아티스트와 디자이너에게 프로시저럴 콘텐츠를 생성하는 강력한 툴세트를 제공합니다. 프로시저럴 콘텐츠 생성의 맥락에서 셰이프 그래머(Shape Grammar) 는 콘텐츠가 생성되고 구조화되는 방식을 정의하는 규칙 세트입니다. 그래머에서 모듈(Modules) 이라고 하는 사용자 정의 심볼은 에셋을 나타내며 스트링으로 결합되어 더 복잡한 구조체를 생성합니다.
셰이프 그래머를 사용하여 생성된 펜스 제너레이터입니다.
중요 개념 및 용어
- 모듈(Modules): 에셋을 나타내는 사용자 정의 심볼입니다. 이러한 심볼은 문자 또는 단어일 수 있습니다. 모듈은 어트리뷰트(Attribute)로 저장될 수도 있고 노드에 하드코딩될 수도 있습니다.
- 구문(Syntax): 모듈을 스트링으로 결합하여 규칙을 형성하는 심볼과 메서드입니다.
전제조건
이 문서는 프로시저럴 콘텐츠 생성 개요에서 제시한 개념과 정보를 기반으로 작성되었습니다.
그래머 구문
PCG 그래머(PCG Grammar)는 특정 구문을 따라 다음과 같은 심볼을 사용하여 모듈을 결합합니다.
- 모듈은 단독으로 사용할 수도 있고 다른 모듈과 결합하여 사용할 수도 있습니다. 다음은 심볼
A및B가 있는 모듈을 사용하는 몇 가지 예입니다.A는A심볼이 있는 모듈을 배치한다는 뜻입니다.A, B는A와B모듈을 함께 배치한다는 뜻입니다.*는 모듈을 최대한 많이 배치한다는 뜻입니다. 예를 들어,A*는A모듈을 최대한 많이 배치한다는 뜻입니다.+는 모듈을 적어도 한 번 배치한 다음, 최대한 많이 배치한다는 뜻입니다. 예를 들어,A+는A모듈을 적어도 한 번 배치한 다음, 최대한 많이 배치한다는 뜻입니다.
- 대괄호
[]로 모듈을 캡슐화하여 모듈 조합을 생성할 수 있습니다.[A, B]는A와B모듈을 결합하고 함께 배치합니다.[A, B]*는A와B모듈을 함께 최대한 많이 배치한다는 뜻입니다.[A, B]+는A와B모듈을 함께 한 번 배치한 다음, 최대한 많이 배치한다는 뜻입니다.[A, B]2는A와B모듈을 함께 두 번 배치한다는 뜻입니다.
- 모듈 조합은 중괄호와 정수를 사용하여 확률을 할당해 랜덤화할 수 있습니다.
<A, B, C>는 공간이 충분하면A모듈을 배치하고, 그렇지 않으면B모듈을 배치한 다음C모듈을 배치한다는 뜻입니다.
예를 들어, 위의 이미지에 나오는 펜스 제너레이터는 그래머 규칙을 사용하여 스플라인을 따라 펜스 문과 펜스 섹션, 말뚝을 배치할 위치를 결정합니다. 이 경우 다음과 같은 모듈을 사용합니다.
| 심볼 | 규칙 |
|---|---|
A |
일반 펜스 섹션을 배치합니다. |
G |
펜스 문을 배치합니다. |
P |
펜스 말뚝을 배치합니다. |
BL |
길게 부서진 섹션이 있는 펜스를 배치합니다. |
BS |
짧게 부서진 섹션이 있는 펜스를 배치합니다. |
이는 {[A,P]:2,[BL,P]:1,[BS,P]:1}*,[G,P], {[A,P]:2,[BL,P]:1,[BS,P]:1}* 그래머를 사용합니다.
이 구문은 다음과 같이 해석됩니다.
| 구문 | 의미 |
|---|---|
{[A,P]:2,[BL,P]:1,[BS,P]:1}* |
구문에 표시된 가중치를 사용하여 말뚝이 있는 펜스 섹션, 말뚝이 있는 길게 부서진 펜스 섹션, 말뚝이 있는 짧게 부서진 펜스 섹션 중에 무작위로 선택하여 배치합니다. 스플라인 중심점에 문을 배치할 때까지 채웁니다. |
[G,P] |
문과 펜스 말뚝을 배치합니다. |
{[A,P]:2,[BL,P]:1,[BS,P]:1}* |
구문에 표시된 가중치를 사용하여 말뚝이 있는 펜스 섹션, 말뚝이 있는 길게 부서진 펜스 섹션, 말뚝이 있는 짧게 부서진 펜스 섹션 중에 무작위로 선택하여 배치합니다. 스플라인 끝에 이를 때까지 채웁니다. |
PCG 그래머 노드
PCG 그래머는 몇 가지 그래프 노드를 사용하여 시스템의 그래머와 셰이프를 정의합니다.
서브디비전 노드
Spline To Segment
Spline to Segment 노드는 스플라인을 포인트 데이터의 세그먼트로 분할합니다. 각 세그먼트는 두 개의 연결된 컨트롤 포인트에 의해 정의됩니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 탄젠트 추출(Extract Tangents) | 이전 세그먼트와 다음 세그먼트 사이의 탄젠트를 추출합니다. |
| 각도 추출(Extract Angles) | 이전 세그먼트와 다음 세그먼트 사이의 각도를 추출합니다. 닫히지 않은 스플라인의 경우 맨 끝의 각도는 0이 됩니다. |
| 연결 정보 추출(Extract Connectivity Info) | 연결에 대한 정보를 유지하기 위해 이전 세그먼트와 다음 세그먼트의 인덱스를 설정합니다. |
| 시계 방향 정보 추출(Extract Clockwise Info) | 스플라인 포인트가 시계 방향인지 반시계 방향인지 추적하는 글로벌 어트리뷰트를 출력합니다. |
Duplicate Cross-Section
Duplicate Cross-Section 노드는 선택한 그래머의 규칙대로 돌출 벡터를 따라 스플라인을 복제합니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 돌출 벡터를 어트리뷰트로(Extrude Vector as Attribute) | 돌출 벡터를 입력 스플라인에서 어트리뷰트로 가져올지, 아니면 세팅에서 수정할지 결정합니다. |
| 돌출 벡터(Extrude Vector) | 돌출 벡터를 정의합니다. |
| 모듈 정보를 입력으로(Module Info as Input) | 활성화하면 모듈 정보를 입력으로 가져옵니다. |
| 모듈 정보(Modules Info) | 서브디비전에 사용할 모듈 배열을 정의합니다. |
| 시드 어트리뷰트(Seed Attribute) | 시드 선택을 구동하는 데 사용되는 어트리뷰트를 정의합니다. 제공된 어트리뷰트가 없으면 시드를 사용합니다. |
| 시드(Seed) | 무작위 생성을 구동하는 데 사용되는 시드 값을 정의합니다. |
| 추가 출력 어트리뷰트(Extra Outputs Attribute) | 출력 어트리뷰트의 구체적인 이름을 정의합니다. |
| 그래머를 어트리뷰트로(Grammar As Attribute) | 활성화하면 그래머를 세팅에서 직접 읽지 않고 입력 어트리뷰트로 읽습니다. |
| 그래머 스트링(Grammar String) | 생성에 사용되는 그래머 스트링을 정의합니다. |
Subdivide Segment
Subdivide Segment 노드는 선택한 그래머와 모듈 정보에 따라 세그먼트를 서브디비전합니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 서브디비전 축(Subdivision Axis) | 포인트 로컬 스페이스에서 서브디비전 방향을 정의합니다. 이 드롭다운 메뉴에는 X축, Y축 또는 Z축을 사용하는 옵션이 포함되어 있습니다. |
| 축 플립을 어트리뷰트로(Flip Axis as Attribute) | 어트리뷰트를 사용하여 축을 플립할지 여부를 정의합니다. |
| 축 플립 필요(Should Flip Axis) | 축을 플립해야 할지 여부를 정의합니다. |
| 불완전한 서브디비전 수락(Accept Incomplete Subdivision) | 그래머가 세그먼트를 채우지 않은 경우 유효한지 여부를 결정합니다. '스플라인에 불완전한 서브디비전이 있습니다.'라는 경고 메시지를 해결하는 데 사용할 수 있습니다. |
| 시드 어트리뷰트(Seed Attribute) | 시드 선택을 구동하는 데 사용되는 어트리뷰트를 정의합니다. 제공된 어트리뷰트가 없으면 시드를 사용합니다. |
| 시드(Seed) | 무작위 생성을 구동하는 데 사용되는 시드 값을 정의합니다. |
| 추가 출력 어트리뷰트(Extra Outputs Attribute) | 출력 어트리뷰트의 구체적인 이름을 정의합니다. |
| 그래머를 어트리뷰트로(Grammar As Attribute) | 활성화하면 그래머를 세팅에서 직접 읽지 않고 입력 어트리뷰트로 읽습니다. |
| 그래머 스트링(Grammar String) | 생성에 사용되는 그래머 스트링을 정의합니다. |
Subdivide Spline
Subdivide Segment 노드는 선택한 그래머와 모듈 정보에 따라 스플라인을 서브디비전합니다. 모듈은 양쪽 끝이 스플라인에 떨어지도록 배치됩니다.
좁은 코너는 과소평가되어 잘못된 결과가 생성될 수 있습니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 불완전한 서브디비전 수락(Accept Incomplete Subdivision) | 그래머가 세그먼트를 채우지 않은 경우 유효한지 여부를 결정합니다. 이 옵션을 사용해 '스플라인에 불완전한 서브디비전이 있습니다.'라는 경고 메시지를 해결할 수 있습니다. |
| 모듈 높이를 어트리뷰트로(Module Height as Attribute) | 어트리뷰트를 사용하여 모듈 Z 높이를 정의합니다. |
| 모듈 높이(Module Height) | 모듈 Z 높이를 정의합니다. |
| 모듈 정보를 입력으로(Module Info as Input) | 활성화하면 모듈 정보를 입력으로 가져옵니다. |
| 시드 어트리뷰트(Seed Attribute) | 시드 선택을 구동하는 데 사용되는 어트리뷰트를 정의합니다. 제공된 어트리뷰트가 없으면 시드를 사용합니다. |
| 시드(Seed) | 무작위 생성을 구동하는 데 사용되는 시드 값을 정의합니다. |
| 추가 출력 어트리뷰트(Extra Outputs Attribute) | 출력 어트리뷰트의 구체적인 이름을 정의합니다. |
| 그래머를 어트리뷰트로(Grammar As Attribute) | 활성화하면 그래머를 세팅에서 직접 읽지 않고 입력 어트리뷰트로 읽습니다. |
| 그래머 스트링(Grammar String) | 생성에 사용되는 그래머 스트링을 정의합니다. |
셰이프 정의 노드
셰이프 정의 노드는 생성된 셰이프의 윤곽을 정의합니다.
Clean Spline
Clean Spline 노드는 사용자 정의 한계치에 따라 선형 스플라인에서 불필요한 컨트롤 포인트를 모두 제거합니다. 이러한 포인트는 다른 포인트와 너무 근접한 포인트(동일 위치)이거나 스플라인을 정의하는 데 필요하지 않은 포인트(동일 선상)일 수 있습니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 동일한 위치에 배치된 컨트롤 포인트 병합(Fuse Colocated Control Points) | 정의된 거리 한계치 내에서 동일한 위치를 공유하는 컨트롤 포인트를 병합합니다. |
| 동일 위치 거리 한계치(Colocation Distance Threshold) | 동일한 위치에 배치된 포인트를 병합하기 위한 거리 한계치를 정의합니다. |
| 스플라인 로컬 스페이스 사용(Use Spline Local Space) | 활성화하면 거리 계산에 스플라인 로컬 스페이스를 사용합니다. |
| 병합 모드(Fuse Mode) | 두 개의 동일 위치 컨트롤 포인트가 병합되는 방식을 제어합니다. 이 드롭다운에는 다음과 같은 옵션이 있습니다.
|
| 동일 선상 컨트롤 포인트 제거(Remove Collinear Control Points) | 스플라인의 선형 섹션을 따라 있는 최종 결과에 영향을 주지 않는 불필요한 포인트를 제거합니다. |
| 동일 선상 각도 한계치(Collinear Angle Threshold) | 포인트가 동일 선상에 있는지를 결정하는 데 사용되는 각도 한계치를 정의합니다. |
| 라디안 사용(Use Radians) | 활성화하면 각도 한계치 확인 시 도 대신 라디안을 사용합니다. |
Spline Direction
Spline Direction 는 컨트롤 포인트 순서와 그 도착 및 출발 탄젠트를 반전합니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 작업(Operation) | 이 노드가 수행할 작업을 정의합니다. 이 드롭다운에는 다음과 같은 옵션이 있습니다.
|
이는 스플라인 컴포넌트 대상으로는 파괴적인 작업이 될 수 있는데, 왜냐하면 이 과정에서 스플라인의 커브를 정의하는 일부 사용자 데이터가 손실될 수 있기 때문입니다.
Primitive Cross-Section
Primitive Cross-Section 노드는 프리미티브 크로스 섹션 세트를 스플라인으로 변환하는 작업을 지원합니다. 이 노드를 사용하려면 Procedural Generation Framework (PCG) Geometry Script Interop 플러그인이 필요합니다.
이 노드 현재 실험단계 기능입니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 슬라이스 방향(Slice Direction) | 슬라이스가 발생할 방향을 정의합니다. 정의된 거리 벡터를 따라 최소 버텍스에서 시작합니다. |
| 돌출 벡터 어트리뷰트(Extrusion Vector Attribute) | 각 크로스 섹션 돌출 벡터로 채워지는 어트리뷰트의 이름을 정의합니다. 이 벡터에는 길이와 방향 데이터가 포함되어 있습니다. |
| 최소 동일 평면 버텍스(Minimum Coplanar Vertices) | 티어 피처로 간주되기 위해 동일 평면에 있어야 하는 버텍스 수를 정의합니다. |
| 티어 병합 한계치(Tier Merging Threshold) | 이전 티어로부터 새 티어가 컬링될 거리(cm)를 정의합니다. |
| 최소 영역 컬링 한계치(Min Area Culling Threshold) | 새 티어가 가져야 하는 최소 영역 또는 컬링될 최소 영역을 정의합니다. |
| 중복 섹션 제거(Remove Redundant Sections) | 제거해도 크로스 섹션의 윤곽에 영향을 주지 않을 불필요한 섹션을 제거합니다. |
| 최대 메시 버텍스 수(Max Mesh Vertex Count) | 지나치게 복잡한 메시를 생성하지 않도록 최대 버텍스 수를 정의합니다. |
일반 그래머 노드
Select Grammar
Select Grammar 노드는 사용자 정의 키 값 및 기준 세트에 따라 그래머 스트링을 선택합니다. 포인트 데이터의 각 포인트에 대해 이 노드는 기준을 충족하거나 선택 기준을 찾을 때까지 순차적으로 각 기준을 비교합니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 키(어트리뷰트)(Key as Attribute) | 어트리뷰트를 사용하여 키를 선택합니다. 이 옵션을 활성화하지 않으면, 키(Key) 옵션으로 정의한 단일 키가 사용됩니다. |
| 키 어트리뷰트(Key Attribute) | 키로 사용할 어트리뷰트를 정의합니다. 키(어트리뷰트)(Key as Attribute) 를 활성화하지 않은 경우, 이 옵션은 없음(None) 으로 설정합니다. |
| 비교된 값 어트리뷰트(Compared Value Attribute) | 키 값과 비교할 어트리뷰트를 정의합니다. 각 값을 수치로 평가합니다. 디폴트 값은 $ScaledLocalBounds.X 이며, 이는 X축의 포인트 스케일로 스케일 조절되는 포인트의 바운드 크기입니다. |
| 기준(입력)(Criteria as Input) | 어트리뷰트 입력을 사용하여 비교할 기준을 정의합니다. |
| 기준(Criteria) | 키를 비교하고 값 어트리뷰트를 비교하는 데 사용되는 비교 기준을 선택하고 정의합니다. |
| 선택되지 않은 그래머에 대한 키 복사(Copy Key for Unselected Grammar) | 선택된 그래머가 없는 경우, 지정된 포인트에 대한 키 값을 전달합니다. |
| 어트리뷰트 그래머 출력(Output Grammar Attribute) | 선택한 그래머가 기록되는 어트리뷰트 이름을 정의합니다. |
| 기준 어트리뷰트 이름 리매핑(Remap Criteria Attribute Names) | 활성화하면 비교 기준으로 예상되는 특정 어트리뷰트 이름을 정의합니다. 기준(입력)(Criteria as Input) 이 활성화된 경우에만 사용할 수 있습니다. |
Print Grammar
Print Grammar 노드는 현재 그래머 스트링에 대한 더 자세한 설명을 로그에 출력합니다. 그래머 스트링을 더 읽기 쉬운 포맷으로 분해하여 스트링의 해석 방식을 보여줌으로써 그래머 스트링 유효성 검사를 지원하는 유틸리티 노드입니다.
이 노드에는 다음과 같은 옵션이 있습니다.
| 옵션 | 설명 |
|---|---|
| 그래머(Grammar) | 자세하게 유효성을 검사하고 로그에 출력할 그래머를 정의합니다. |