UDN
Search public documentation:

ProceduralBuildingsKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > 스태틱 메시 > 프로시저럴 빌딩 (Procedural Building)
UE3 홈 > 배경 아티스트 > 프로시저럴 빌딩 (Procedural Building)

프로시저럴 빌딩 (Procedural Building)


문서 변경사항: James Golding, Joshua Marlow 작성 및 수정. 홍성진 번역.

개요


멋진 건물을 만드는 일은, 주로 메시를 여러개 붙여야 하기에 노력이 매우 많이 필요한 일입니다. UE3의 'ProcBuilding'(프록빌딩) 시스템은 멋진 도시 건물을 굉장히 빨리 만들거나 고칠 수 있도록 설계되었습니다. 또한 간단한 메시와 렌더-투-텍스처를 사용하여 자동으로 low-LOD 버전의 건물을 생성하는 식으로, 큰 도시도 뚝딱입니다.

그렇다고 도시 전체를 클릭 한 번으로 뚝딱 만들어내는 도깨비 방망이는 아닙니다. 거리와 도시 블록은 자동으로 놓이지 않습니다. 건물의 모양이나 레이아웃을 만드는 것은 레벨 디자이너의 몫이며, 이 툴의 역할은 그 모양에 메시를 빠르게 적용할 수 있게 해 줄 뿐입니다.

이 시스템에 대한 연설은 GDC 2010에 발표되었고, 언리얼 테크놀러지 사이트 에서 슬라이드를 다운받을 수 있습니다.

*주의 *: 이 자료는 작업중입니다! 즉 이 기능은 현재 지원되지 않고 있습니다. 피드백 환영!

빌딩 정의하기


프록빌딩은 간단히 특수 유형의 볼륨입니다. 즉 다른 볼륨처럼 빌더 브러쉬를 조절한 후 볼륨 목록에서 프록빌딩을 선택하여 놓으면 됩니다. 그 후 새로 생긴 파사드라는 키즈멧 유사 에디터를 사용하여 패키지에 ProcBuildingRuleset (프록빌딩 룰셋)을 생성하며, 이 파사드를 통해 메시를 적용할 방법을 결정할 수 있습니다. 그리고 다른 건물에 대해서는 다른 룰셋을 사용하여 건물의 모양 등을 변경할 수 있으며, 메시를 업데이트하게 됩니다. 룰셋을 적용하려면 볼륨의 Ruleset (룰셋) 속성을 정하거나, 간단히 콘텐츠 브라우저에서 룰셋을 끌어다 놓으면 됩니다.

프로시저럴 빌딩 튜토리얼 페이지에 단계별 예제가 있습니다.

빌딩 그룹

모양이 단순하지 않은 건물을 작업할 때, 보통 볼륨을 여럿 사용하게 됩니다. 하지만 성능 측면에서는 이 볼륨들을 하나로 묶는 것이 좋습니다. 하나의 볼륨을 'Base' 볼륨으로 선택하고 난 후, 'Base' 속성을 사용하여 다른 볼륨을 거기에 붙이는 방법이 있습니다. 어태치먼트 에디터를 사용하거나, 맥락 메뉴의 'ProcBuilding -> Group Buildings' 옵션을 사용하면 훨씬 쉽습니다. 에디터 툴바의 '프리팹 잠금' 버튼(P자)도 전체 프록빌딩 '그룹'을 선택할지 아니면 그룹에서 개별 프록빌딩을 선택할지 선택하는데 사용합니다. 그룹 안의 'Base' 프록빌딩 볼륨은 와이어프레임이 노란색이 아닌 연녹색으로 그려지며, 'ProcBuilding -> Select Base Building'을 통해 빠르게 선택할 수 있습니다.

Base 빌딩의 룰셋 만 설정하면, 그에 딸린 건물도 같이 설정됩니다. 필요에 의해 딸린 프록빌딩 볼륨에 이 설정을 따로 하여, 같은 프록빌딩 그룹 내의 일부분만 바꿀 수도 있습니다. 주의! 단일 건물 '그룹'에 사용된 모든 메시는 'Base' 프록빌딩 볼륨 소속이므로, 에디터에서 선택하면 해당 볼륨이 선택됩니다.

빌딩 속성

프록빌딩 볼륨의 속성은 아래와 같으며, 자세한 설명은 이 문서에 추후 기술합니다.

Ruleset (룰셋) 이 볼륨에 적용할 ProcBuildingRuleset
bGenerateRoofMesh (지붕 메시 생성여부) 이 건물에 지붕 폴리곤을 만들지
bGenerateFloorMesh (바닥 메시 생성여부) 이 건물에 바닥 폴리곤을 만들지
bApplyRulesToRoof (지붕에 룰 적용여부) 룰셋이 건물의 벽뿐 아니라 지붕에도 해당되는지
bApplyRulesToFloor (바닥에 룰 적용여부) 룰셋이 건물의 벽뿐 아니라 바닥에도 해당되는지
bSplitWallsAtRoofLevels (지붕 레벨에 벽 분할여부) 전체 건물 그룹을 각 지붕 레벨에서 수평으로 분할시킬지
bSplitWallsAtWallEdges (벽 에지에 벽 분할여부) 건물 면이 다른 면과 교차할 때 수직으로 분할시킬지
SimpleMeshMassiveLODDistance (단순 메시 대규모 LOD 거리) 건물의 low-LOD 버전 트랜지션을 위해 얼마나 멀리 가야할 지
RenderToTexturePullBackAmount (렌더-투-텍스처 후퇴량) LOD용 렌더-투-텍스처를 생성할 때, 건물(과 클립 디테일)에서 얼마나 멀리 후퇴시킬지
RoofLightmapRes (지붕 라이트맵 해상도) 건물 지붕에 사용할 라이팅 해상도
NonRectWallLightmapRes (비사각벽 라이트맵 해상도) 비사각형 벽 폴리곤에 사용할 라이팅 해상도
LODRenderToTextureScale (LOD 렌더-투-텍스처 스케일) LOD 렌더-투-텍스처의 해상도 조절
BuildingMaterialParams (빌딩 머티리얼 파람) 특정 건물의 메시에 적용된 머티리얼 인스턴스에 설정된 추가 파라미터. 벽을 착색하는데 사용할 수 있습니다.
bBuildingBrushCollision (빌딩 브러시 충돌여부) 건물 볼륨 자체에 충돌(콜리전)이 가능한지

룰셋


빌딩 시스템이 처음 하는 일은, 디자이너가 정한 볼륨에서 사각형 scope(유효범위, 스코프) 세트를 추출하는 것입니다. 이 스코프는 메시 시스템에서 기본 작업 유닛을 형성합니다. 각 스코프는 공간에서의 위치와 반경값, X와 Z축 값(X는 건너쪽, Z는 위쪽)을 갖습니다. 분명 건물의 모든 벽이 사각형은 아니겠지만, 그런 경우 시스템은 두 평행 모서리를 찾아 사각형을 추출해 내며, 나머지 부분에는 평평한 폴리곤을 생성하여 채워 넣습니다.

extract_rect.gif

건물의 벽을 기술하는 스코프 세트가 설정되면, 룰셋은 다음 두 가지 중 하나를 수행합니다.

  • 스코프를 더 잘게 쪼개거나
  • 스코프의 공간을 차지하는 메시를 놓거나

이런 식으로 룰셋은 룰의 그래프이며, 각 '최상위 레벨' 스코프는 차례로 좌측으로 보내져 좁은 지역에 흩어지며, 그 지역에 메시가 놓여 채워지게 됩니다.

Rules.jpg

룰은 보통 건물의 지붕에는 수행되지 않습니다. 이는 그저 (기존에 언급한 비사각형 벽의 '구멍'과 비슷한) 텍스처 입힌 폴리곤으로 채워질 뿐입니다.

룰셋 속성

(콘텐츠 브라우저를 사용하는 일반적인 방법으로) 새로운 룰셋을 생성하면, 파사드에서 열 수 있습니다. 다른 룰 노드를 선택하지 않은 상태라면 속성 창에는 룰셋 자체의 속성이 나타납니다:

DefaultRoofMaterial (디폴트 지붕 머티리얼) 건물의 지붕 폴리곤에 적용된 머티리얼
DefaultFloorMaterial (디폴트 바닥 머티리얼) 건물의 바닥 폴리곤에 적용된 머티리얼
DefaultNonRectWallMaterial (디폴트 비사각벽 머티리얼) 벽 스코프 주위의 구멍을 메꿀 폴리곤에 사용된 머티리얼
RoofZOffset (지붕 Z 오프셋) Z축을 따라 지붕(전체 건물의 윗면) 폴리곤에 적용된 오프셋. 주의! 보통 RoofEdgeScopeRaise (지붕 에지 스코프 올리기)가 지붕 주변의 벽을 만들기에는 더 좋습니다.
NotRoofZOffset (지붕이외 Z 오프셋) Z축을 따라 (전체 건물 윗면 외 다른 볼륨의) 지붕 폴리곤에 적용된 오프셋. 주의! RoofEdgeScopeRaise (지붕 에지 스코프 올리기)가 지붕 주변의 벽을 만들기에는 더 좋습니다.
FloorZOffset (바닥 Z 오프셋) Z축을 따라 바닥(전체 건물의 밑면) 폴리곤에 적용된 오프셋.
NotFloorZOffset (바닥이외 Z 오프셋) Z축을 따라 (전체 건물 밑면 외 다른 볼륨의) 바닥 폴리곤에 적용된 오프셋.
RoofPolyInset (지붕 폴리 인셋) 지붕 폴리곤의 버텍스를 얼마나 꺼들일 지
FloorPolyInset (바닥 폴리 인셋) 바닥 폴리곤의 버텍스를 얼마나 꺼들일 지
BuildingLODSpecular (빌딩 LOD 스페큘러) 건물 low-LOD 버전의 전체 반사면을 조절
RoofEdgeScopeRaise (지붕 에지 스코프 올리기) 지붕에 닿은 스코프를 약간 늘여서, 건물의 지붕 주변에 낮은 벽을 에두름
LODCubemap (LOD 큐브맵) 건물의 low-LOD 버전상의 큐브맵 지역(보통 유리)에 사용할 큐브맵 텍스처
bLODOnlyRoof (지붕만 LOD 여부) 참이면 지붕 폴리곤은 건물의 low-LOD 버전용으로만 생성

파사드 속의 작은 검정 사각형은 '루트' 또는 '탑 레벨' 단자입니다. 이제 새로운 룰 '노드'를 추가하여 여기에 연결하면, 건물의 각 벽을 분해하여 메시를 적용합니다. 파사드의 녹색 '틱' 버튼은 수정중인 룰셋을 사용한 모든 건물의 메시를 생성하여, 어떤 모습이 될 지를 미리 보여줍니다.

다음은 현재 사용할 수 있는 각기 다른 룰에 대한 설명입니다.

메시 룰

Mesh Rule(메시 룰)은 전달된 스코프의 크기와 위치를 사용하여 건물에 메시를 실제로 추가하는 것으로, 정말 중요한 룰입니다. 메시는 Z가 위, X가 오른쪽이 될 수 있도록 좌하단 코너가 기준이 되게 작성해야 합니다. 메시가 차지할 공간이 얼마나 될 지도 정해야 합니다. 다음 이 방법으로 그 공간을 채울 메시의 크기를 조절할 수 있습니다. (울타리나 테두리와 같이) 전달된 스코프 지역 밖으로 뻗어나가는 것들도 만들 수 있습니다.

각 메시 노드는 BuildingMeshes (빌딩 메시)라 불리는 특정한 스태틱 메시 배열을 지원하며, 목록에서 임의로 선택됩니다. 배열의 각 메시에 대해 가능한 세팅은 다음과 같습니다.

Mesh (메시) 사용할 스태틱 메시
DimX (X차원) 메시의 X 차원 (폭)
DimZ (Z차원) 메시의 Z 차원 (높이)
Chance (확률) 배열에서 이 메시가 선택될 확률
Translation (옮기기) 메시를 놓을 때 적용할 옮기기( 또는 옮기기 범위) 옵션
Rotation (회전) 메시를 놓을 때 적용할 회전( 또는 회전 반경) 옵션 (도 단위)
bMeshScaleTranslation (메시 옮기기 스케일 여부) 참이면 메시에 적용된 다른 스케일 비율에 맞춰 옮기기를 적용
bOverrideMeshLightMapRes (메시 라이트맵 해상도 덮어쓰기 여부) 참이면 메시에 설정된 해상도 대신 덮어쓴 메시 라이트맵 해상도를 사용
OverriddenMeshLightMapRes (덮어쓴 메시 라이트맵 해상도) 메시 라이트맵 해상도 덮어쓰기 여부가 참인 경우, 이 메시의 라이팅에 사용할 해상도
SectionOverrides (섹션 덮어쓰기) 이 메시의 각 부분에 대해 무작위 대체물로 사용될 머티리얼의 범위를 지정

오클루전 테스트

메시 룰이 수행하는 또 다른 중요한 기능은, 전달된 스코프가 건물의 다른 부분에 가려지는지(occluded) 검사하는 것입니다. 아래 그림을 보십시오:

OcclusionRule.jpg

이와 같이 창문이 건물의 지붕에 가려져 있어 보기에 좋지 않습니다. 메시 룰은 스코프가 가려졌는지, 일부분만 가려졌는지, 아니면 가려지지 않았는지를 결정할 수 있습니다. (건물의 다른 부분 속에 전체가 들어간 것과 같이) 완전히 가려진 경우, 아무 메시도 추가되지 않습니다. 가려지지 않았다면, BuildingMeshes (빌딩 메시) 배열에 지정된 메시 중 하나가 선택됩니다. (위 예와 같이) 일부분 가려진 경우, PartialOccludedBuildingMesh (부분 가려진 빌딩 메시) 옵션에 지정된 메시가 대신 사용됩니다.

OcclusionRuleDemo.jpg

원한다면 bDoOcclusionTest (오클루전 테스트 수행여부) 옵션을 거짓으로 설정하여 이 가려짐 검사 기능을 끌 수 있으며, 항상 BuildingsMeshes (빌딩 메시) 배열의 메시가 추가됩니다. 가려짐 검사는 스코프 코너 바로 안쪽 4개의 점을 사용하여 수행함을 염두에 두시기 바랍니다.

콜리전

기본적으로 프록빌딩의 일부로 사용된 메시에는 (0규모 무기 충돌만 있을 뿐) 0규모 이외의 플레이어 충돌은 없습니다. 플레이어 충돌은 (블로킹 볼륨 같은) 볼륨 자체에 대해서만 일어나므로, 다음과 같은 장점이 있습니다:

  • 콜리전이 부드럽고 빠릅니다.
  • 프록빌딩 룰셋이 변경되어도 콜리전은 바뀌지 않습니다.

간혹 건물 일부 스태틱 메시에 대해 플레이어 충돌이 일어나게 하고 싶은 경우, 룰 노드의 bBlockAll (모두 블록여부) 부분을 참으로 설정하면 됩니다.

반복 룰

Repeat Rule(반복 룰)은 스코프를 지정하여 한 축을 따라 여러 개의 스코프로 분산시키는 룰입니다.

RepeatRule.jpg

먼저 RepeatAxis (반복 축) 옵션을 사용하여 (X나 Z)축을 선택하면, 해당 축을 따라 동일한 크기의 조각으로 분산시킵니다. RepeatMaxSize (반복 최대 크기)에 정한 크기 이상의 조각이 나오지 않도록 가급적 많은 부분으로 나눕니다. 이를 통해 건물 크기에 따라 새 스코프를 다양하게 만들어 냅니다.

아래는 Z축을 따라서는 큰 표면을 '바닥'의 연속으로 분산하는 반복 룰을 사용하고, X축을 따라서는 각 바닥을 창 스코프의 연속으로 분산하는 반복 룰을 사용한 뒤, 실제로 창 메시를 놓는 메시 룰을 사용한 예입니다.

RepeatRuleMain.jpg

분할 룰

Split Rule(분할 룰)은 스코프를 지정하여 SplitAxis (분할 축)에 지정된 값을 기준으로 작은 스코프로 분산시킨다는 점에서 반복 룰과 비슷합니다. 그러나 반복 룰은 입력된 스코프 크기에 따라 다양한 수의 스코프를 생성하는 반면, 분할 룰은 (입력값이 너무 작지 않은 한) 항상 동일한 수의 출력 스코프를 생성합니다.

SplitRule.jpg

스코프 분할 방법을 정하려면, 디자이너가 SplitSetup (분할 셋업) 배열을 채워야 합니다. 배열의 각 항목은 하나의 출력 스코프와 동시에 룰 노드의 추가 출력 커넥터로 나타납니다. 이를 통해 스코프의 각 부분에 대해 다른 일을 할 수 있습니다. 다음은 배열의 각 항목에 대한 속성입니다:

bFixSize (크기 고정여부) 참이면 이 출력은 FixedSize (고정 크기)로 고정됩니다. 거짓이면 입력 스코프와 마찬가지로 확장됩니다.
FixedSize (고정 크기) 고정 크기여부가 참이면 사용되며, 출력 스코프의 크기를 정확히 정합니다.
ExpandRatio (비율 확장) 여러 항목의 bFixSize (크기 고정여부)값이 거짓일 때, 확장 방법을 조절합니다. 수가 커지면 입력값이 커 질수록 더 길게 늘어나게 됩니다.
SplitName (분할 이름) 룰 노드에 생성된 출력물에 이름을 짓습니다.

확장하려면, SplitSetup (분할 셋업) 세트에 최소 1항목 이상 있어야 (예로 크기 고정여부가 거짓) 합니다. 또한, 전달된 스코프의 크기가 모든 고정 항목의 크기보다 클 경우, 그에 맞는 공간이 부족하여 일부 조각은 생성되지 않습니다.

얼터넛 룰

건물의 중간 중간 다른 기능이 보이더더라도, 항상 같은 기능으로 시작되거나 끝납니다. 이는 반복이나 분할 룰 만으로는 하기 힘들기 때문에, Alternate(번갈아, 얼터넛) 룰을 사용할 수 있습니다.

AlternateRuleDemo.jpg

반복이나 분할 룰처럼, RepeatAxis (반복 축) 속성을 사용하여 축을 지정해야 합니다. 이 룰에는 AB 로 표시된 두 가지 출력이 있습니다. 기본 설정에서는, 스코프가 클수록 B 부분이 늘어나지만 A 부분은 그대로입니다. BMaxSize (B 최대 크기) 속성에는 얼마 이상의 크기일 때 B를 추가할지, ASize (A 크기)에는 A의 크기를 얼마로 고정시킬지를 정합니다.

AlternateRule.jpg

추가 조정을 위한 다른 옵션도 있습니다:

bInvertPatternOrder (패턴 순서 뒤집기 여부) 이 옵션은 고정 크기 A 대신 (ABABA에서 BABAB와 같이) 가변 크기 B로 시작 또는 끝나게 합니다.
bEqualSizeAB (AB 크기 동일 여부) 참이면 A와 B의 값을 동일하게 고정시킵니다.

오클루전 룰

메시 룰 노드에서 언급했듯이, 스코프에서 오클루전 검사를 하는 것이 좋습니다. 이 룰 노드는 메시를 놓기 직전 뿐 아니라, 아무 스코프에서 이 검사를 할 수 있게 합니다. 예로, 중간에다 문용 공간을 내고자 분할하기 전에 건물 바닥을 검사할 수 있습니다.

탑/보텀 룰

건물 볼륨에서 추출한 각 스코프는 동일한 룰 세트에 의해 처리되기 때문에, 복잡한 건물에서는 이상한 모양이 나올 수 있습니다. 예로 각 스코프의 밑면에 상점을 놓는 룰셋의 경우, 건물의 윗부분에도 상점 모양이 나오기에 모양이 이상해 집니다. 이는 Top/Bottom(탑/보텀) 룰 노드를 통해 스코프의 윗면 또는 밑면이 전체 ProcBuilding 볼륨 그룹의 윗면 또는 밑면과 같은지 검사할 수 있습니다. 아래의 예는 이 과정을 보여줍니다:

TopBottomRule.jpg

이 노드는 먼저 입력 스코프의 윗면이 전체 건물의 윗면인지 알아보는 것으로 작동합니다. 그렇다면 ExtractTopZ (윗면 Z 추출)에 정의된 부분만큼 분리하여 제거한 후, 해당 스코프를 'Top' 출력으로 전달합니다. 아니라면 ExtraNotTopZ (윗면이외 Z 추출)에 정의된 부분만큼을 분리하여 'Not Top' 출력으로 전달합니다. 이런 식으로 각 단계의 윗면보다 전체 건물의 윗면 테두리가 더 커지게 만들 수 있습니다. ExtractBottomZ (밑면 Z 추출) 및 ExtractNotBottomZ (밑면이외 Z 추출) 값을 사용하면 건물의 밑면에 대해서도 똑같은 작업을 해줄 수 있습니다. 그 후 스코프의 나머지 부분은 'Mid' 출력으로 전달됩니다. 'Top', 'Not Top', 'Bottom', 'Not Bottom'중 어느 것에도 연결된 부분이 없다면, 아무것도 입력 스코프에서 분할되지 않습니다.

랜덤 룰

메시 룰을 통해 세트에서 메시를 하나 선택하는 것이 이미 가능합니다만, 가끔 룰셋 안에서 먼저 조정할 수도 있습니다. 예로 건물 면이나 바닥 특정 부분을 완전히 달라 보이게 만들고자 할 경우입니다. 게다가 때로는 세트에서 하나 이상의 옵션을 선택할 수도 있습니다. 이는 Random(랜덤) 룰을 통해 가능합니다. 먼저 NumOutputs (출력 수) 속성을 사용하여 출력 수를 지정합니다. 그리고 MinNumExecuted (최소 실행 수)와 MaxNumExecuted (최대 실행 수) 속성을 사용해 이 중 몇 개의 출력을 활용할 지 결정합니다. 이 룰을 사용하여 랜덤하게 메시를 '쌓을' 수 있습니다. 예로 건물의 특정 지역에 대해 각기 다른 A/C 유닛, 사인, 빛을 선택하거나 할 수 있습니다. 이런 예는 아래 그림과 같습니다:

RandomRule2.jpg

RandomRule3.jpg

RandomRule1.jpg

쿼드 룰

타일형 머티리얼을 씌운 평평한 쿼드 메시가 알맞을 것 같은 지역이 있다면, 이 Quad(쿼드) 룰 노드를 통해 구현할 수 있습니다. 2-트라이앵글 쿼드 메시를 건물에 추가하는 것과 아울러, 이 룰로 스코프의 크기에 따라 타일을 붙일 수 있도록 UV를 조절합니다. 이는 RepeatMaxSizeX (최대 X크기 반복)과 RepeatMaxSizeZ (최대 Z크기 반복) 파라미터로 조정하며, 방법은 반복 룰과 비슷합니다. 주의! 메모리에 쿼드 메시의 복사본은 단 하나만 존재하며, 인스턴스별 UV 조절은 머티리얼 인스턴스를 사용해야 합니다. 이는 자동으로 수행되지만, (Material 파라미터를 사용하여) 쿼드에 적용한 기본 머티리얼이 U_Scale, U_Offset, V_Scale, V_Offset의 4개 머티리얼 인스턴스 파라미터를 지원하는지 확인해야 합니다. 쿼드에 적용된 머티리얼 인스턴스의 기반으로 사용할 수 있는 마스터 머티리얼의 이름은 EngineBuildings.BuildingQuadMaterial (엔진 빌딩.빌딩 쿼드 머티리얼)입니다. 아래는 건물의 한 면에 쿼드 룰을 사용한 예입니다:

QuadNode.jpg

이 예에서 벽돌 패턴이 타일화되는 것을 볼 수 있지만, 흙(dirt) 패턴은 전체 메시에 걸쳐 딱 한 번 나타나고 있습니다. 이는 머티리얼에서 쉽게 설정할 수 있습니다. 타일링을 하지 않으려면, bDisableMaterialRepeat (머티리얼 반복 끄기 여부)를 참으로 설정하면 됩니다. QuadLightmapRes (쿼드 라이트맵 해상도) 속성으로 각 쿼드 메시의 라이트맵 해상도를 조절할 수 있습니다. YOffset (Y 오프셋) 설정을 사용하여 (건물의 내부로 또는 건물 밖으로와 같이) Y축을 따라 쿼드 메시를 오프셋시킬 수 있습니다.

서브 룰셋

Sub(서브) 룰셋으로 작업하면, 꽤 복잡한 그래프를 만들 수 있습니다. 또한 (정교한 샵프론트 부분과 같이) 다른 복수의 룰셋에서 사용하고픈 룰셋 일부분을 만들 수도 있습니다. 이를 돕기 위해, 서브룰셋 노드를 만들 수 있으며, SubRuleset (서브룰셋) 속성을 사용하여 또다른 룰셋을 가리킬 수도 있습니다. 어느 스코프가 전달되든 간에, 노드는 해당 룰셋의 시작으로 전달됩니다. 이 방법으로 각 룰셋을 작게 유지할 수 있으며, 불필요한 중복을 피할 수 있습니다. 룰셋이 서로에게 맞물려 연결되는 '순환'을 만들지 않도록 주의하십시오.

사이즈 룰

스코프의 치수에 기반한 간단한 선택 사항을 제공합니다. 먼저 SizeAxis (크기 축) 속성으로 어느 축에 관심이 있는지, 그리고 결정될 크기를 정합니다. 스코프 치수가 이보다 작으면, 'Less' 출력으로, 그 외의 경우엔 'Greater/Equal' 출력으로 전달됩니다. bUseTopLevelScopeSize (탑 레벨 스코프 크기 사용여부) 옵션으로 건네받은 스코프 대신 (전체 건물의 면 크기와 같이) '탑 레벨' 스코프에 따라 이 결정을 내릴 수 있습니다.

사이즈 룰은 메시가 너무 눌려 보이지 않게 하는데 사용하기도 합니다. 아래의 예에서, 창이 3개인 메시가 너무 눌려 보기에 안좋습니다. 이 때는 사이즈 룰로 공간이 좁을 때는 창 2개 또는 1개 버전의 메시를 사용하도록 할 수 있습니다. 테두리 작업도 동일하게 할 수 있습니다.

SizeRule.jpg

주석

이 특수 노드는 별 기능이 없지만, 키즈멧과 같은 식으로 룰셋영역 주변으로 주석 상자를 그릴 수 있습니다.

다양화 룰

기본적으로 프록빌딩에 적용된 룰셋은 모든 면에 적용됩니다. 그러나 가끔 다른 면에 다른 모양을 내고 싶은 경우가 있습니다. 이 경우에 Variation(다양화) 룰을 사용할 수 있습니다. 룰셋에 '다양성'을 주려면, 먼저 파사드에서 (모든 노드를 선택 해제하여) 룰셋 자체를 선택합니다. 그 후 Variations 배열에 요소를 추가할 수 있으며, ('PlainBrickSide'와 같이) 다양화에 이름을 지을 수 있습니다. 그리고, 파사드에 다양화 룰을 넣을 때마다, 해당 룰셋용으로 만든 각 다양화에 대한 출력 하나에 더해서, 최상단에 'default' 출력이 나옵니다.

레벨 디자이너가 건물의 면에 다양성을 주고 싶을 때, 다음과 같이 하면 됩니다:

  1. 지오메트리 수정 모드로 들어갑니다.
  2. 변경하려는 건물 볼륨의 면(들)을 선택합니다.
  3. 우 클릭 후 ProcBuilding 메뉴를 선택합니다.
  4. 목록에서 원하는 다양화 이름을 선택합니다.

건물에 준 모든 다양화를 취소하려면, 건물에 우 클릭 - 'ProcBuilding -> Clear Face Variation Assignments'를 선택하면 됩니다.

VariationsDemo.jpg

많은 다양화를 준 룰셋으로 할 수 있는 예는 이와 같습니다. 개별 룰셋을 여럿 만들지 않고도 도시에 다양성을 줄 수 있는 매우 좋은 방법입니다.

VariationsDemo2.jpg

에지 메시 룰

Edge Mesh(에지 메시)는 각 면의 모서리를 밋밋하게 하여 각 코너를 자연스럽게 만들어 주는 룰셋입니다. 이러한 예는 아래와 같습니다:

TrimCorners1.jpg

그러나 항상 이렇지만은 않습니다. 메시가 완벽히 일치하지 않을 때 코너를 더 나아보이게 만들 수 있는 방법 한 가지는, 접각 절반의 각도로 모서리를 따라 메시를 놓는 것입니다. 에지 메시 룰이 이 역할을 합니다. 건네받은 스코프의 왼쪽 모서리를 취한 뒤, 접각 절반의 각도만큼 회전시킨 뒤 'Edge' 출력으로 새로운 스코프를 생성합니다. 스코프의 나머지 부분은 각 횡모서리 부분이 MainXPullIn (주요 X 끌어들이기) 속성에 지정된 만큼 약간 '끌어들입'니다. 접각이 FlatThreshold (평면 한계점)에 지정된 각 이하일 경우, 모서리 스코프는 생성되지 않습니다. 결과는 아래 예와 같습니다:

TrimCorners2.jpg

코너 룰

건물 코너 외관을 최적화하고 싶은 경우, 접각이 다를 경우에 맞는 별도의 코너 메시를 만들 수도 있습니다. Corner(코너) 룰은 이를 편하게 하기 위해 고안되었습니다. 코너 룰을 사용할 때, 각 스코프는 왼쪽 면 모서리를 '소유'하게끔 되어 있습니다. 건네받은 스코프의 좌우측 일정 부분을 분할한 뒤, 접각에 가장 잘 맞는 출력 부분을 왼쪽에 붙인 스코프를 전달합니다. 우측에는 건물 주변 스코프로 해당 지역이 채워지게끔 갭을 둡니다.

CornerRule1.jpg

Angles (각도) 배열에 (0, -90, 90도와 같은) 값을 입력하면 어떤 각의 코너 노드도 지원할 수 있습니다. CornerSize (코너 크기) 속성을 사용하여 모서리 스코프가 차지하는 X 공간을 조절할 수도 있습니다. 각각의 각에 적합한 공간을 따로 지정하려면, Angles (각도) 배열 목록의 CornerSize (코너 크기)값을 0이 아닌 값으로 변경하면 됩니다. 코너 노드의 기타 속성은:

FlatThreshold (평면 한계점) 두 스코프의 각이 이 (각도)값 이하일 경우, 메시가 추가되지 않습니다.
bNoMeshForConcaveCorners (오목한 코너에는 메시를 없앨지) 참이면 오목한 코너에 대해서는 공간이나 메시가 추가되지 않습니다.

기본적으로 코너 노드는 왼쪽(에는 코너 메시)과 오른쪽(에는 갭) 부분을 똑같이 제거합니다. bUseAdjacentRulesetForRightGap (오른쪽 갭에 인접 룰셋 사용여부)를 참으로 설정하면, 시스템이 스코프 우측에 사용된 코너 노드를 찾아내어 우측에도 동일한 크기의 갭을 만듭니다. 이렇게 하면, 각기 다른 코너 스타일에 대한 변형이 아래 그림에서 보여지듯이 잘 어우러지게 됩니다. 이 방법을 제대로 활용하려면, 건물 모든 레벨의 코너 크기가 동일해야 함을 염두에 두시기 바랍니다.

CornerRule2.jpg

지붕 코너

굴곡진 또는 빗각인 코너를 사용할 때 생기는 문제점은, (프록빌딩 볼륨 면에 의해 생성되는) 지붕 폴리곤이 지붕의 실제 모양과 맞지 않는다는 점입니다. 이를 해결하려면, 코너 노드에 몇 가지 추가 정보를 지정하여 지붕 폴리곤의 코너 부분을 가다듬어야 합니다. 보통 시스템은 이 정보를 코너 노드의 가장 높은 부분에서 찾습니다.

Roof1.jpg

Roof2.jpg

지붕 코너 모양을 조절하는 코너 룰 노드의 속성은 다음과 같습니다:

CornerType (코너 종류) 코너의 모양 - EPBC_Default(표준 사각 코너), EPBC_Chamfer(모서리를 깎아낸 코너), EPBC_Round(원형 코너) 중 하나
RoundTesselation (원형 테셀레이션) 코너 모양이 EPBC_Round일 경우, 코너를 다듬는데 사용할 테셀레이션 수
RoundCurvature (원형 곡률) 원형화된 코너의 모양을 조절
CornerShapeOffset (코너 모양 오프셋) 굴곡 메시 지역의 시작점에서 지붕 폴리곤 코너를 실제로 chamfer/round화 하는 지점까지의 거리

수평 분할하기

건물을 처리하려면, 시스템은 각 모서리와 만나는 최상위레벨 스코프가 어느것인지 찾아내야 합니다. 아래 그림에서 보이듯이, 한 모서리에 2개 이상의 모서리가 만날 경우에는 찾아내기가 어렵습니다.

CornerRule3.jpg

여기에서 보면, 노란 모서리에 맞는 코너 메시 하나를 선택해서 보기 좋은 모양을 내기가 어려울 것이 뻔합니다. 이를 해결하기 위해, 시스템은 ProcBuilding 그룹에 있는 각기 다른 지붕 레벨에서 모든 스코프를 '자릅니다.' 그림으로 표현하면 다음과 같습니다:

CornerRule4.jpg

원한다면 프록빌딩 볼륨에 있는 bSplitWallsAtRoofLevels (지붕 레벨의 벽 분할여부) 값을 거짓으로 하여 이 과정을 생략할 수 있습니다. 이 과정은 아래에서 보듯, 보통 실제 건물에서도 전체 건물 주변으로 지붕 레벨 테두리가 잘 이어지는 것을 확인할 수 있습니다.

roof_cut_example.JPG

다음은 해당 옵션이 켜지거나 꺼진 상태의 프록빌딩의 예제입니다. 왼쪽 건물의 경우, 아래쪽 지붕 레벨이 건물의 나머지 부분과 만나는 부분에 대한 테두리 추가 작업이 쉽지 않기 때문에, 약간의 구멍이 보이게 됩니다.

CornerRule6.jpg

LOD


모든 ProcBuilding 그룹은 렌더-투-텍스처 기술을 사용하여 건물의 저해상도 스태틱 메시 버전을 자동으로 생성합니다. 이를 통해 엔진은 단 하나의 그리기 명령으로 모든 면을 단일 머티리얼에 전사시켜(atlased) 전체 low-LOD 건물을 그려냅니다. 근본적으로 건물의 지오메트리는 사용된 볼륨의 모양과 같습니다. 비록 RoofEdgeScopeRaise (루프 에지 스코프 올리기)와 같은 기능이 LOD 건물에 사용되긴 하지만, 지붕 주위의 작은 벽이 LOD에 그대로 유지되어서 건물 실루엣이 변하지는 않기 때문입니다. 아래는 건물에 대해 단일 메시 LOD를 생성한 예 입니다.

building_lod2.jpg

건물 면을 텍스처로 렌더링하는 일은 꽤나 시간이 걸리기에, 건물을 수정할 때는 수행되지 않습니다. low-LOD 텍스처를 생성하려면 ('빌딩 LOD 텍스처 생성' 옵션을 체크했는지 확인한 후) 맵에 라이팅을 리빌드하거나, 원하는 프록빌딩을 선택한 후 메인 에디터 메뉴에서 '도구 -> 선택 빌딩 LOD 텍스처 생성'을 선택하십시오.

건물에는 유리창이 있게 마련이며, 이는 보통 반사 큐브맵으로 구현합니다. 고로 LOD에는 반사되는 창에 대한 마스크가 있어야 하며, 반사가 없으면 트랜지션시 많이 티나게 됩니다. 이 과정은 자동으로 수행되지만, 메시에 약간의 설정을 해 줘야 합니다. 건물에 대해 low-LOD 텍스처 생성 및 다음과 같은 세 가지 렌더링 과정이 수행됩니다:

  1. 라이팅제외 모드로 디퓨즈 컬러 정보를,
  2. 라이팅만 모드로 라이팅 정보를,
  3. 창 모드, 즉 창은 흰색, 창이 아닌 곳은 검정색으로 표시되는 정보를 모읍니다.
다음 그림은 세 가지 렌더링 상황을 보여줍니다:

Windows.jpg

메시가 '창 모드'를 지원하게 하려면, 먼저 (머티리얼이 아닌) 머티리얼 인스턴스를 메시에 적용해야 합니다. 머티리얼 인스턴스는 'RenderWindowCubemapMask' (창 큐브맵 마스크 렌더)라는 스케일러 파라미터를 지원해야 합니다. 이 값은 '창 모드'에서 건물을 렌더링할 때 1.0으로 설정됩니다. LOD 텍스처 생성 과정에서 머티리얼의 특정 기능을 끄거나 하고 싶은 경우를 위해, 세가지 과정 모두에 1.0으로 설정된 'RenderLOD'라는 옵션 파라피터도 있습니다.

이 과정에서 텍스처가 둘 생성됩니다. 하나는 라이팅제외 디퓨즈 컬러용으로, 알파 채널에 1비트 '창 마스크'가 적용된 것입니다. 다른 하나는 라이팅만 텍스처로, 보통 해상도가 훨씬 낮습니다. 이 두 텍스처는 low-LOD 건물 메시의 머티리얼에 함께 변조됩니다. 텍스처가 둘인 이유는, 창 지역 큐브맵 텍스처의 위쪽에서 라이팅을 적용하기 위함입니다. 아래는 위의 low-LOD 건물에 적용된 텍스처입니다.

Windows2.jpg

스트리밍

low-LOD 단일 섹션 메시의 각기 다른 서브레벨에서도, (다수의 메시 인스턴스로 구성된) 높은 디테일의 건물이 필요할 경우가 있습니다. 이는 시스템에서 자동으로 지원해 줍니다. 스트리밍 서브레벨에 프록빌딩을 추가하면, 자동으로 '하이 디테일' 레벨명 뒤에 '_LOD'가 붙은 이름을 가진 새 서브레벨이 생성됩니다. 예로, CityBlock_01에 프록빌딩을 추가하면, CityBlock_01_LOD라는 새 스트리밍 레벨이 자동으로 생성되며, (스태틱 메시 액터의 직계 서브클래스인) ProcBuilding_SimpleLODActor가 추가됩니다. low-LOD가 _P 맵이 아닌 자체 서브레벨 안에 생기는 이유는, 해당 도시 지역을 _P 맵 검사 없이 작업하기 위해서입니다. 하이 디테일 프록빌딩을 수정하는 동안, 로우 디테일은 자동으로 갱신됩니다. 보통 도시 블록은 하이 & 로우 디테일 버전 둘 다 체크하는 것이 좋습니다.

주의! 서브레벨 없이 프록빌딩을 추가할 때에는 LOD MAP이 추가되지 않습니다. 프록빌딩 자체에 로우 디테일 메시가 들어갑니다.

어태치먼트 (부착)

(보통의 Base 속성을 사용하여) 프록빌딩에 스태틱 메시 액터를 부착할 경우, 건물이 low-LOD 버전으로 바뀔 때 해당 메시가 숨겨지게 됩니다. low-LOD 버전에는 해당 스태틱 메시가 텍스처 안에 렌더링될 것이기에 바람직한 일입니다. (A/C 유닛과 같은) 스태틱 메시 액터를 프록빌딩 위에 놓을 경우, 자동으로 건물에 부착됩니다. 이 기능은 스태틱 메시 액터의 bDisableAutoBaseOnProcBuilding (프록빌딩에 자동 베이스 끄기 여부) 속성으로 끌 수 있습니다.

트랜지션 (전환)

언리얼 엔진은 트랜지션/LOD에 접근할 때 디더링을 사용합니다. 그러나 이 기능을 사용하려면, 건물 메시에 적용되는 머티리얼(또는 건물에 부착되어 스태틱 메시 액터에 사용된 메시)의 bUsedWithScreenDoorFade (스크린 도어 페이드와 사용여부) 속성을 참으로 설정해야 합니다.

기타 기능


빌딩 통계

에디터에는 도시 안의 건물에 대한 통계를 볼 수 있는 새로운 탭이 있습니다. 각 건물은 한 줄에 아래와 같은 요소, 트라이앵글, 라이팅, LOD 텍스처 메모리 사용량 등이 표시된 것을 볼 수 있습니다. 이는 너무 커서 더 간단한 룰셋이 필요하겠다 싶은 건물, 또는 라이팅 설정 조절이나 메시 단순화가 필요한 룰셋 등을 찾아내는 데 매우 좋습니다. 줄을 더블 클릭하면 해당 건물로 이동합니다.

building_stats.jpg

머티리얼 파라미터

건물 메시 머티리얼에 노출시킨 것들에 대한 파라미터 설정을 건물 단위로 할 수 있습니다. 방법은 프록빌딩의 BuildingMaterialParams (빌딩 머티리얼 파람) 배열에 항목을 추가하여, 해당 파라미터에 대해 이름과 바라는 색을 채워 넣으면 됩니다. 이는 개별 룰셋을 여럿 만들지 않고도 도시에 시각적 다양성을 주기에 좋은 방법입니다. 아래는 동일한 룰셋을 사용했지만 이 기능을 통해 벽 색을 바꾼 건물의 예입니다.

proc_color_variations.jpg

머티리얼 덮어쓰기

생성된 지붕, 바닥, 비사각형 벽 폴리곤 등에 사용된 머티리얼을 프록빌딩 단위로 덮어쓸 수 있습니다. 방법은 지오메트리 모드로 들어간 후, 원하는 머티리얼을 대신 선택한 뒤 면(들)을 선택하고 우클릭 - ' ProcBuilding -> Apply Material (MaterialName) To Face'을 선택하면 됩니다. 건물에 우클릭 후 'ProcBuilding -> Clear Material Face Assignments'를 선택하면, 덮어쓴 머티리얼을 면 단위로 취소할 수 있습니다.

지붕과 바닥 메싱

전에 언급했듯이, 기본적으로 건물 지붕과 바닥에 대해서는 메싱 룰이 적용되지 않습니다. 그러나 (다리 같은 건물의 아래에 기둥 지지대를 추가하는 경우와 같이) 가끔은 이 규칙을 적용하는게 나을 수도 있습니다. 프록빌딩에 bApplyRulesToFloor (바닥에 룰 적용여부)나 bApplyRulesToRoof (지붕에 룰 적용여부)를 설정하면 실제로 스코프가 추출되어 지붕 및/혹은 바닥 지역에 룰이 적용되게 됩니다. 룰셋 다양화 설정 안에 bMeshOnTopOfFacePoly (면 폴리의 맨위에 메시 적용여부)라는 추가 옵션이 있습니다. 이 기능을 켜면 시스템은 일반적인 바닥이나 지붕 폴리곤을 생성한 뒤, 그 위에 룰을 적용합니다. 예로, 아래 그림에서 통로의 밑부분을 보십시오:

floor_mesh.jpg

기술적인 정보 (프로그래머용)


이 부분은 프록빌딩 시스템 작업을 하는 프로그래머용으로, 더 자세한 기술적인 설명을 제공합니다.

인스턴스된 렌더링

프록빌딩은 인스턴스된 스태틱 메시 컴포넌트를 광범위하게 활용합니다. 이 컴포넌트를 통해 같은 메시의 인스턴스 여럿을 엔진의 드로 콜 하나로 렌더링할 수 있습니다. 시스템은 메시마다 각 프록빌딩 '그룹'에 대해 하나의 인스메컴을 만들려 합니다만, 메시가 라이트맵에 그룹되어 있거나 각기 다른 머티리얼 혹은 라이팅 옵션이 사용된 경우에는 만들 수가 없습니다. INSTCOMPCOUNT 콘솔 명령을 에디터에 입력하면 컴포넌트별 인스턴스 막대 그래프 로그가 출력됩니다.