UDN
Search public documentation:

ProceduralBuildingsJP
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

プロシージャルビルディング

ドキュメントの概要:このドキュメントでは、Unreal Engine 3における、プロシージャルビルディング(手順に沿った建造物の作成)とFacade(ファサード)について説明します。

ドキュメントの変更ログ:作成および更新者:James Golding および Joshua Marlow

概要

美しい建造物を作成するのは、大変な労力を要する仕事です。なぜなら、多くの場合、多数のメッシュを1つ1つ配置しなければならないからです。UE3におけるProcBuilding(プロシージャルビルディング)システムは、都市のビルを美しく素早く作成編集できるように設計されています。またこのシステムは、シンプルなメッシュとレンダーツーテクスチャを使用して、自動的に低LODバージョンのビルを作成することもできるため、大きな都市を作ることが可能になります。

このツールは、1回のクリックで都市全体を作成するようには設計されて*いません*。街路や都市のブロックを設計者に代わって設計してくれるわけではないのです。建造物の形状やレイアウトを設計しなければならないのはレベル設計者です。その際にこのツールは、メッシュを素早くシェープに適用するために使用することができるのです。

このシステムに関する講演は2010年のGDCで行われました。またUnreal Technology site には、スライドも用意されています。

注意: この作業はまだ進行中です。そのため、この機能は現時点で未サポートとなっています。どうぞ、フィードバックをお待ちしております。

建造物の定義

ProcBuildings(プロシージャルビルディング)は、ボリュームの特殊なタイプにすぎません。このため、他のボリュームと同じように配置することができます。これを行うには、ビルダーブラシを調整し、Volume(ボリューム)リストからProcBuilding(プロシージャルビルディング)を選択します。次に、パッケージの中に ProcBuildingRuleset を作成します。このとき、Facade(ファサード)など、Kismet JP に似た新しいエディタを使用します。これによって、メッシュの適用の仕方が分かります。これによって、さまざまなルールセットをさまざまな建造物に試したり、建造物の形を変えられるようになります。また、メッシュも更新されます。ルールセットを適用するために必要なことは、ボリュームのRuleset(ルールセット)プロパティを設定する、またはContentBrowser(コンテンツブラウザ)からルールセットをドラッグアンドドロップするだけです。

手順例は、Procedural Buildings Tutorial JP (プロシージャルビルディングのチュートリアル)のページで見ることができます。

建造物のグループ

単純ではない形の建造物を扱う場合、通常、複数のボリュームを使うのがよいでしょう。ただし、パフォーマンス上の理由で、これら複数のボリュームをグループにまとめる必要があります。そのためには、1つのボリュームをBase(ベース)ボリュームとして選び、その他のボリュームをBaseプロパティを使ってBaseボリュームに付属させます。これをきわめて簡単に実行するには、Attachments Editor JP (アタッチメントエディタ)を使用するか、コンテクストメニューでProcBuilding(プロシージャルビルディング) -> Group Building(建造物のグループ化)オプションを使用します。エディタのツールバー上にあるPrefab Lock(Prefabロック)ボタン(Pという文字)を使用して、ProcBuildingのgroups(グループ)全体を選択するか、特定グループ内の個々のProcBuildingボリュームを選択するかを決定することもできます。グループ内のBase ProcBuildingボリュームは、ワイヤーフレームが、通常の黄色ではなく緑色で表示されます。ワイヤーフレームは、ProcBuilding -> Select Base Building(ベースとなる建造物の選択)を使用して素早く選択することができます。

Baseとなる建造物に Ruleset (ルールセット)を設定するだけで、子建造物にもこれが適用されます。しかし目的に応じて、子ProcbuildingボリュームにRulesetを設定することも可能で、それによって、同一ProcBuildingグループにおける特定のエリアでの設定を優先させることができます。なお、1つの建造物グループに使用されるメッシュはすべて、Base ProcBuildingボリュームのものとなります。したがって、それらのメッシュをクリックした場合は、Base ProcBuildingボリュームを選択したことになります。

 建造物のプロパティ

ProcBuildingボリュームのプロパティは下記のとおりです。これらプロパティのうち多くのものに関しては、詳細が本ドキュメントで後述されます。

Ruleset このボリュームに適用されるProcBuildingRuleset
bGenerateRoofMesh この建造物に対してルーフ(屋根)ポリゴンが生成されるかどうかを制御する。
bGenerateFloorMesh この建造物に対してフロアポリゴンが生成されるかどうかを制御する。
bApplyRulesToRoof 壁だけではなく建造物のルーフにもRulesetを適用する場合
bApplyRulesToFloor 壁だけではなく建造物のフロアにもRulesetを適用する場合
bSplitWallsAtRoofLevels 建造物グループ全体を、それぞれのルーフのレベル(高さ)で水平に分割する場合
bSplitWallsAtWallEdges 他の建造物のフェースが交差しているときに、建造物の表面を垂直に分割する場合
SimpleMeshMassiveLODDistance 建造物を低LODバージョンに移行する距離
RenderToTexturePullBackAmount LOD向けレンダーツーテクスチャを生成する場合、建造物からプルバックする距離(および詳細度を削減する距離)
RoofLightmapRes 建造物のルーフをライティングする際に使用する解像度
NonRectWallLightmapRes 四角形以外の壁ポリゴンをライティングする際に使用する解像度
LODRenderToTextureScale LOD向けレンダーツーテクスチャの解像度を制御する
BuildingMaterialParams 特定の建造物のメッシュに適用されるMaterialInstances(マテリアルインスタンス)に設定する追加パラメータ。着色された壁などに使用することができる。
bBuildingBrushCollision 建造物のボリューム自体にコリジョンを有効にする場合

Rulesets(ルールセット)

建造物システムではまず、設計者指定のボリュームから1組の四角形 スコープ が抽出されます。これらのスコープによって、メッシュシステムにとって基本となる作業ユニットが形成されます。各スコープは、空間において、ロケーションとローテーションを持つとともに、X-Z次元を持ちます(Xは横方向、Zは上方向)。しかし、建造物のすべての壁が四角形になるとは限りません。そのような場合、システムは2つの平行なエッジ(縁)を検出し、残りのエリアを埋める平坦なポリゴンを生成することによって、四角形を抽出します。

extract_rect.gif

建造物の壁を描写する1組のスコープが検出されると、ルールセットによって次のいずれかが実行されます。

  • 1つのスコープを、より小さなスコープに分割する。
  • スコープのスペース全体にメッシュを配置する。

このように、ルールセットはルールの図式となっています。すなわち、各トップレベルのスコープが順々に左側でパスインされ、より小さなエリアに分割され、さらに、メッシュが配置されてこれらのエリアが埋められます。

Rules.jpg

ルールは、建造物のルーフには通常どおりに適用されません。単にテクスチャ化されたポリゴンで埋められるだけです(前述の四角形以外の壁の穴と同様)。

Rulesetのプロパティ

新しいRulesetを(コンテントブラウザを使用して通常の方法で)作成した後は、Facadeエディタで開くことができます。ルールノードが選択されていない場合は、Ruleset自体がプロパティウインドウに表示されます。

DefaultRoofMaterial 建造物のルーフポリゴンに適用されるマテリアル
DefaultFloorMaterial 建造物のフロアポリゴンに適用されるマテリアル
DefaultNonRectWallMaterial 壁スコープのまわりの穴を埋めるために作られるポリゴンに使用するマテリアル
RoofZOffset ルーフポリゴン(建造物全体の最上部に位置する)に対してZ軸方向に適用されるオフセット。多くの場合、ルーフのまわりの壁を作るには、 RoofEdgeScopeRaise  (ルーフのエッジスコープを上げる)がより適切な方法となります。
NotRoofZOffset ルーフポリゴン(建造物全体の最上部以外のすべてのボリューム)に対してZ軸方向に適用されるオフセット。多くの場合、ルーフのまわりの壁を作るには   RoofEdgeScopeRaise (ルーフのエッジスコープを上げる)がより適切な方法となります。
FloorZOffset フロアポリゴン(建造物全体の底部に位置する)に対してZ軸方向に適用されるオフセット
NotFloorZOffset フロアポリゴン(建造物全体の底部以外のすべてのボリューム)に対してZ軸方向に適用されるオフセット
RoofPolyInset ルーフポリゴンの頂点にプル「イン」する距離
FloorPolyInset フロアポリゴンの頂点にプル「イン」する距離
BuildingLODSpecular 建造物の低LODバージョンのスペキュラ全体を制御する
RoofEdgeScopeRaise 建造物のルーフのわまりに低い壁を作り、ルーフを修正するすべてのスコープをこの分量だけ拡張する
LODCubemap 建造物の低LODバージョン上にあるキューブマップエリア(通常はガラス)に使用するキューブマップテクスチャ
bLODOnlyRoof 値がTRUEの場合、建造物の低LODバージョン用にのみルーフポリゴンが作成される

Facadeの中の小さな黒い四角形は、root(ルート)またはtop level(トップレベル)コネクタです。新たなルールノードを追加して、それらにここから接続することにより、建造物の各壁を分解してメッシュを適用することができます。Facade内にある緑色のtick(チェックマーク)ボタンを使用すると、編集中のRulesetを使用するすべての建造物上でメッシュが生成されます。これによって、メッシュがどのように見えるかプレビューすることができます。

以下は、現在使用されている各種ルールについての解説です。

メッシュルール

これはきわめて重要なルールです。パスインされたスコープのサイズとロケーションを使用することによって、実際に建造物にメッシュを追加します。メッシュは常に左下コーナーが原点で、上がZ軸、右がX軸になるように作成する必要があります。メッシュが占る予想スペースの大きさも指定しなければなりません。これはその後、与えられたスペースを埋めるメッシュの大きさを調整するために使用されます。これによって、パスインされるスコープの区域外に拡張する機能(たとえば、レーリングまたはトリム)を利用できるようになります。

メッシュのノードはそれぞれ、_BuildingMeshes_ という名の固有のStaticMeshes配列に対応し、そのリストからランダムに選択されます。次の設定は、その配列内にある各メッシュに対して使用できます。

Mesh 使用するStaticMesh(静的メッシュ)
DimX メッシュのX軸(幅)
DimZ メッシュのZ軸(高さ)
Chance このメッシュが配列から選択される可能性
Translation 配置時にメッシュに適用するオプションのトランスレーション(またはトランスレーション範囲)
Rotation 配置時にメッシュに適用する、オプションのローテーション角度(またはローテーション範囲)
bMeshScaleTranslation 値がTRUEの場合、指定されたTranslation(トランスレーション)が、メッシュに適用された任意のスケール設定でスケールされる
bOverrideMeshLightMapRes 値がTRUEの場合、メッシュ上に設定された解像度のかわりに、OverriddenLightMapResを使用する
OverriddenMeshLightMapRes bOverrideMeshLightMapResがTRUEの場合、このメッシュのライティングに使用する解像度
SectionOverrides このメッシュのセクションそれぞれに対して、ランダムなオーバーライドとして適用するマテリアルの範囲を指定する

オクルージョンテスト

メッシュルールには重要な機能がもう1つあります。それは、パスインされたスコープが建造物の他の部分と交差するかどうかを検証する機能です。次の画像を検討してみましょう。

OcclusionRule.jpg

ご覧のとおり、窓が建造物のルーフと交差してるため美しくありません。メッシュルールでは、スコープがオクルードされているか、部分的にオクルードされているか、オクルードされていないか、判定できます。完全にオクルードされている場合(完全に建造物の他の部分の内側になっている場合)、メッシュは配置されません。オクルードされていない場合は、BuildingMeshes配列で指定されたメッシュが選択されます。部分的にオクルードされている場合(上の例のように)は、 _PartialOccludedBuildingMesh_ オプションで指定されたメッシュがかわりに使用されます。

OcclusionRuleDemo.jpg

このオクルージョンテストを無効にする場合は、 _bDoOcclusionTest_ オプションをFALSEに設定します。これによって、BuildingMeshes配列にあるメッシュが常に追加されるようになります。なお、オクルージョンテストは、スコープのコーナーの少し内側にある4点を利用して行われます。

コリジョン

デフォルトでは、ProcBuildingの一部として使用されるメッシュには、非ゼロ範囲のプレイヤーコリジョンがありません(ゼロ範囲の武器コリジョンだけがある)。プレイヤーコリジョンは、ボリューム自体(ブロッキングボリュームなど)があるときにしか発生しません。これには、次のような利点があります。

  • コリジョンがスムーズで速い。
  • ProcBuildingのルールセットが変更されても、コリジョンが変化しない。

しかし時として、建造物の一部であるStaticMeshに対するプレイヤーコリジョンが望ましくない場合もあります。それには、ルールノード内の _bBlockAll_ フラグをTRUEにセットするだけで済みます。

反復ルール

このルールは、スコープを軸方向に分割して多数の小さなスコープにします。

RepeatRule.jpg

まず _RepeatAxis_ を使って、軸(X軸またはZ軸)を選択します。これによって、スコープが軸方向に、等しいサイズのピースに分割されます。作られるピースの数は、分割後に、 _RepeatMaxSize_ を使って定義されたサイズよりも大きいピースができないように設定されています。建造物のサイズに応じてさまざまな数の新しいスコープが生成されます。

次は、反復ルールをZ軸方向に沿って適用した例です。大きな表面を一続きのフロアに分割します。その後、X軸方向に沿って反復ルールを適用することによって、フロアを一続きの窓に分割します。そして、さらにメッシュルールを適用して実際にウインドウメッシュを配置します。

RepeatRuleMain.jpg

分割ルール

このノードは、スコープを定義済みの _SplitAxis_ に基づいて小さなスコープに分割するという点で、反復ルールに似ています。ただし、反復ルールが、入力スコープのサイズに従って多様な数のスコープを生成するのに対して、分割ルールの方は、(入力が小さすぎない限り)常に同一数の出力スコープを生成します。

SplitRule.jpg

スコープをどのように分割するかを定義するには、 _SplitSetup_ 配列を満たします。配列内の各エントリは、結果として1つの出力スコープとなります。これは、ルールノード上の付加的な出力コネクタと同様です。これによって、スコープの各部分に関してさまざまなことができるようになります。以下は、配列内の各エントリ用プロパティです。

bFixSize 値がTRUEの場合、このアウトプットは _FixedSize_ に固定される。FALSEの場合、この出力は入力スコープと同様に拡張される。
FixedSize bFixSizegaがTRUEの場合にのみ使用され、出力スコープの大きさを正確に定める。
ExpandRatio 複数のエントリでbFixSizeがFALSEに設定されている場合に、拡張の程度を制御する。大きな数は、入力が大きくになるにつれ拡張性が増すことを意味する。
SplitName ルールノードで作られた出力にラベルをつける。

拡張するには、SplitSetupセットで少なくても1つのエントリが常に必要です(bFixSizeをFALSEに設定)。また、パスインされたスコープのサイズが、どの固定エントリのサイズよりも大きい場合は、生成されないピースも出てきます。これは、入れるべきスペースがないからです。

代替ルール

建造物には、常に同じフィーチャー(外見)の間に他のフィーチャーが存在する部分があります。これを反復ルールと分割ルールだけで処理するのは難しいため、このような場合は代替ルールを使用します。

AlternateRuleDemo.jpg

反復ルールや分割ルールと同様に、 _RepeatAxis_ プロパティを使用して軸を指定します。このルールからは出力が2つできます。ラベルは _A_ と _B_ で、デフォルトの設定では、スコープが大きくなると、B部分は拡張しますが、A部分は拡張しません。Bの大きさは、他を追加する前に _BMaxSize_ プロパティを使って指定します。またAのサイズは、常に _ASize_ で指定します。

AlternateRule.jpg

他にも制御にかかわるオプションがいくつかあります。

bInvertPatternOrder 固定サイズのAにかわって、可変サイズのBで開始および終了することができる(ABABAからBABABに変更するということ)。
bEqualSizeAB 値がTRUEの場合は、強制的にAとBを同じ大きさにする。

オクルージョンルール

メッシュルールのノードで述べたように、スコープのオクルージョンテストを実施するのが望ましい場合があります。このルールノードでは、どのスコープに対してもこのテストを行うことができます。これは、メッシュを配置する直前に行うべきではありません。たとえば建造物のフロアは、分割して中央ドア用のスペースを作る前にテストします。

トップ/ボトムルール

建造物ボリュームから抽出された各スコープは、同じルールセットに所属します。そのため、複雑な建造物の場合、外見が奇妙なものになることがあります。たとえば、ルールセットによって各スコープのボトム(底)部分に店が配置される場合、建造物の上部の正面が、意味もなく店になってしまうことがあります。これに対処する目的で、トップ/ボトムルールノードでは、スコープのトップまたはボトムが、ProcBuildingボリュームグループ全体のトップかボトムと同じかどうかを検証することができるようになっています。下の例は、このことを分かりやすく説明しています。

TopBottomRule.jpg

このノードは、まず入力スコープのトップが建造物全体のトップであるかどうかを判定します。そうである場合は、 _ExtractTopZ_ で定義された範囲を分割し、そのスコープをTop(トップ)出力からパスします。そうでない場合は、 _ExtractNotTopZ_ で定義された範囲を分割し、Not Top(非トップ)出力からパスします。このようにして、たとえば、各ステップにおけるトップのトリムよりも、建造物全体におけるトップのトリムのほうを大きくすることなどが可能に鳴ります。同様のプロセスを建造物のボトムについても実行できます。その場合、 _ExtractBottomZ_ と _ExtractNotBottomZ_ という値を使用します。次に、スコープの残りが、Mid(中間)出力からパスされます。Top、Not Top、Bottom、Not Bottomのうちどれとも接続しているものがない場合、出力スコープから分割されるものはありません。

ランダムルール

メッシュルールでは、セットから1つのメッシュを選択することは可能ですが、もっと早い段階でルールセットの制御を行いたい場合もあります。たとえば、建造物の特定のフロアやフェースが全く異なる外見になるように選択したい場合などです。または、セットから2つ以上のオプションを選択したい場合も考えられます。これらは、ランダムルールによって可能になります。まず、 _NumOutputs_ プロパティを使用して必要な出力の数を指定します。次に、 _MinNumExecuted_ プロパティおよび _MaxNumExecuted_ プロパティを使って、それらの出力のうちいくつ適用されてよいかを決定します。このルールを使用すれば、複数のメッシュの上に相互にランダムで重ねることができます。たとえば、建造物の特定部分に、異なる空調装置、看板、ライトを選択することができます。下の図はその一例です。

RandomRule2.jpg

RandomRule3.jpg

RandomRule1.jpg

四角形ルール

タイル状マテリアルをともなったフラットな四角形のメッシュが建造物の一部に最適な場合があります。このルールでは、そのようなことが可能になります。2つの三角形からなる四角形のメッシュを建造物に追加する場合と同様に、このルールではUVが調整されるため、スコープのサイズに基づいてタイル貼りを行うことできます。これを制御するには、反復ルールのときと同様に、 _RepeatMaxSizeX_パラメータおよび_RepeatMaxSizeZ_パラメータを使用します。なお、メモリには四角形メッシュのコピーが1つしかありません。また、UVインスタンス単位の調整は、マテリアルインスタンスを使用して行われます。以上は自動的に実行されますが、(_Material_パラメータを使用することによって)四角形に適用されるベースマテリアルが、必ず、U_Scale、U_Offset、V_Scale、V_Offsetの4つのパラメータに対応するようにしてください。また、四角形に適用されるマテリアルインスタンスの基礎として使用できる、_EngineBuildings.BuildingQuadMaterial_というマスターマテリアルというものもあります。以下は、建造物の1つのフェースに適用される四角形ルールの使用例です。

QuadNode.jpg

なお、この例では、レンガ模様がタイルされていますが、汚れ模様はメッシュ全体を横切ったところで初めて出現しています。マテリアル内でこれを設定するのは簡単です。タイルの実行を止める場合は、_bDisableMaterialRepeat_をTRUEに設定します。_QuadLightmapRes_プロパティを使用すると、配置された四角形メッシュそれぞれの上でライトマップの解像度を制御することもできます。四角形メッシュは、Y軸方向(建造物に出入りする方向)にオフセットすることも可能です。この場合、_YOffset_設定を使用します。

サブルールセット

ルールセットでは、非常に複雑な図式を作成することも可能です。また、他の複数のルールセットに使用する目的で、ルールセットの一部を作成する場合もあります(特定の詳細度のショップの前面エリアなど)。そのためには、サブルールセットのノードを作成し、_SubRuleset_プロパティを使用して他のルールセットをポイントすることができます。ノードにパスされるものであれば、どんなスコープでも、そのルールセットの開始個所にパスされます。このようにすることで、各ルールセットのサイズを小さく維持でき、不要な重複を避けることができます。なお、ルールセットどうしが参照しあう「ループ」を作らないように注意してください。

サイズルール

このルールでは、スコープの次元に基づいて、選択が容易になります。まず、 SizeAxis プロパティを使って目的の軸を選びます。次に、決定対象のサイズを選択します。スコープの次元がこれよりも小さい場合は、Less(小)出力からパスされます。そうでない場合は、Greater/Equal(大/同)出力からパスされます。_bUseTopLevelScopeSize_オプションを利用すると、パスインされるスコープに基づく決定ではなく、トップレベルのスコープ(建造物全体のフェースのサイズ)に基づく決定が可能になります。

サイズルールは、メッシュが過度にスキッシュされることを防ぐ目的で使用できます。下の例では、3つの窓のメッシュがスキッシュされ、見栄えが悪くなっています。スペースが狭い場合は、サイズルールを利用して、2つ窓または1つ窓のバージョンを使用します。トリムについても同様のことが行われます。

SizeRule.jpg

コメント

この特殊なノードには何の機能もありませんが、ルールセットエリアのまわりにボックスを配置して、コメントを入れられるようになります。この方法は、Kismetと同様のものです。

バリエーションルール

デフォルトでProcBuildingに適用されているルールセットは、すべてのフェースに適用されます。しかし、さまざまなフェースの上にさまざまな外観を持たせたいときもあります。これを実現するには、バリエーションルールを使います。ルールセットにバリエーションを追加するには、まず、Facade内でルールセット自体を選択する必要があります(すべてのノードを非選択状態にすることによって可能)。これで、要素を_Variations_ 配列に追加することができます。バリエーションには名前をつけます(「PlainBrickSide」など)。これによって、バリエーションルールのノードをFacadeにいつ配置しても、ルールセット用に作った新たな各バリエーションに対して、1つの出力ができることになります。それに加えて、トップにデフォルトの出力もあります。

レベル設計者が、建造物のフェースに特定のバリエーションを用いるには、次のようにするだけです。

  1. ジオメトリエディティングモードにする。
  2. 変更したい建造物ボリュームのフェース(複数可)を選択する。
  3. 右クリックしてProcBuildingのメニューを選択する。
  4. リストから目的のバリエーションを選択する。

建造物に割り当てられているすべてのバリエーションをクリアするには、その建造物を右クリックし、ProcBuilding -> Clear Face Variation Assignments(フェースのバリエーション割り当てをクリアする)を選択します。

VariationsDemo.jpg

以下に、バリエーションを多数ともなったルールセットを使ってできることの例を他にもいくつかあげてみます。街にバライエティをもたせるには、とても効果的な方法です。これによって、独自のルールセットを多数作らなくてもすみます。

VariationsDemo2.jpg

エッジメッシュルール

各フェースのエッジをフラットにするルールセットを作れることがあります。その場合、コーナーもごく自然に機能します。そのような例を下に示します。

TrimCorners1.jpg

しかし、常にこうなるとは限りません。メッシュの一致が不完全な場合にコーナーをきれいに見せるには、メッシュをエッジに沿って配置します。角度は、両フェースの中間を取ります。これは、エッジメッシュルールによって可能です。パスインされたスコープの左エッジをベースに、Edge(エッジ)出力から新しいスコープが生成されます。角度は、2つのフェースの中間になります。スコープの残りは、_MainXPullIn_プロパティを使って指定された分だけ、垂直な各エッジからわずかにプルインされます。フェースの間の角度が_FlatThreshold_の角度よりも小さい場合、エッジスコープは生成されません。結果は下の例のようになります。

TrimCorners2.jpg

コーナールール

建造物のコーナーを最大限美しく見せるには、フェース間のさまざまな角度を処理できるカスタマイズされたコーナーメッシュを作成すべき場合がしばしばあります。コーナールールのノードは、この処理が簡単にできるように設計されています。コーナールールを使用した場合、各スコープは左側のエッジを「所有している」ものとして指定されます。パスインされたスコープの左側と右側の部分が分割されます。それとともに、左側で、フェース間角度に最も適合するアウトプットからスコープが作られ、パスされます。右側については、ギャップが放置されます。これは、建造物を右に回ったところのスコープによってフィルインされると想定されているためです。

CornerRule1.jpg

コーナーノードは、_Angles_配列にエントリを追加することによって、どのような数のアングルにも対応するようにできます(0~-90度、0~+90度など)。また、エッジスコープによってどのくらいのXスペースが占められるかについても、制御することができます。これには_CornerSize_プロパティを使います。各アングルに使用するスペースの量を変更する場合は、_Angles_配列エントリ内の_CornerSize_をゼロ以外の値に変更します。コーナーノードには、他にも次のようなプロパティがあります。

FlatThreshold 2つのスコープ間のアングルがこの量(角度)よりも小さい場合、メッシュは追加されない。
bNoMeshForConcaveCorners TRUEの場合、スペースが残らない、または凹面のコーナーにメッシュが挿入される。

デフォルトでは、コーナーノードによって左側(コーナーメッシュ用)と右側(ギャップ用)で同じ量が取り除かれます。_bUseAdjacentRulesetForRightGap_プロパティをTRUEに設定した場合は、コーナーノードが右側のスコープに使われていると認識され、そのコーナーサイズが右側のギャップに使用されます。以下の画像のように、これによって、さまざまなコーナースタイルのバリエーションが調和して機能します。なお、正しく機能するには、建造物のあらゆるレベルで、コーナーのサイズが等しくなければなりません。

CornerRule2.jpg

ルーフルール

カーブのあるコーナーや斜めになっているコーナーを使う場合に起きる問題には、ルーフポリゴン(ProcBuildingボリュームフェースに基づいて生成される)が、実際のルーフの形と合わないというものがあります。これに対処するには、コーナーノードで情報をいくつか追加指定します。ルーフポリゴンのコーナーの形は、この情報に従って変更されます。なおシステムは、最も高いコーナーノードを特定することによってこの情報を得ます。

Roof1.jpg

Roof2.jpg

以下は、ルーフコーナーの形を制御する、コーナールールノードのプロパティです。

CornerType コーナーの形。EPBC_Default (標準の四角いコーナー)、EPBC_Chamfer (斜めにカットされたコーナー)、EPBC_Round (丸いコーナー)のいずれか。
RoundTesselation コーナーの形がEPBC_Roundの場合、コーナーを丸めるのにどの程度細分化処理を行うか制御する。
RoundCurvature 丸いコーナーの形を制御する。
CornerShapeOffset カーブメッシュ領域開始からどのくらいの位置で、ルーフポリゴンの面取り/丸め調整を実際に行うかを制御する。

水平分割

建造物を作成するには、トップレベルのどのスコープが、それぞれのエッジの部分で整合するのかが、システムによって認識されなければなりません。これが難しくなるのは、3つ以上のエッジが1つのエッジで整合する場合です。次の画像をご覧ください。

CornerRule3.jpg

これを見ると、明らかに黄色のエッジに1つのコーナーメッシュを選択することはできません。これで結果がよくなることはないと思われます。これに対処するために、システムは、ProcBuilding内の異なるルーフレベルそれぞれにおいて、スコープをすべてカットします。次の画像を参照してください。

CornerRule4.jpg

この動作を無効にする場合は、ProcBuildingボリューム上にある_bSplitWallsAtRoofLevels_をFALSEに設定します。この工程は通常きわめてよく機能します。現実の建造物の多くも、下で見られるように、建造物全体をとりまくルーフレベルがトリムされています。

roof_cut_example.JPG

これは、オプションがオンになっているProcBuildingと、オプションがオフになっているProcBuildingの例です。ご覧のとおり、左側の建造物には穴がいくつかあります。原因は、低いルーフレベルが建造物の他の部分と合うと、トリムの追加がうまくいかなくなるからです。

CornerRule6.jpg

LOD

ProcBuildingグループはすべて、レンダーツーテクスチャの技術を使うことによって、建造物の低詳細度StaticMeshバージョンを自動的に生成します。これによって、エンジンは低LODの建造物を1回の描画コールで描くことができます。フェースはすべて1つのマテリアルにアトラスされます。建造物のジオメトリとは、本質的に、使用されているボリュームの形状です。しかし、LODの建造物には_RoofEdgeScopeRaise_などの機能が使用されているため、LODにはルーフのまわりの小さな壁が依然として存在します。その結果、建造物のシルエットが変化しません。以下は、建造物のために生成された単一メッシュのLODの例です。

building_lod2.jpg

建造物のフェースをテクスチャにレンダリングするプロセスは、たいへん時間がかかりるため、編集に合わせてレンダリングを行うことはできません。低LODテクスチャを生成する場合は、次のどちらかによって行います。1つは、マップ内でライティングを再ビルドします。この場合、Generate Building LOD Textures(建造物LODテクスチャを生成する)オプションにチェックが入っていることを確認してください。もう1つは、必要なProcBuildingsを選択し、メインエディタメニューからTools(ツール) -> Generate Selected Buildings LOD Textures(建造物LODテクスチャを生成する)を選択します。

建造物の窓の多くはガラスなので、通常は反射するキューブマップで処理します。そのためLODには、反射する窓のマスクが必要です。これを使用しない場合は、窓が反射しなくなるとともに、移行時に非常に目立つポップができてしまいます。これは自動的に実行されますが、メッシュに対して設定を行う必要があります。低LODテクスチャを生成する際は、建造物に対して以下の3つのレンダリングパスが実行されます。

  1. Unlit(アンリット) ディフューズ色を集める
  2. Lighting Only(ライティングのみ)
  3. Window Mode(窓モード) 窓はすべて白くなり、窓以外の領域は黒くなる

以下の画像は、これら3つのレンダリング状態を示しています。

Windows.jpg

メッシュをWindow Mode(窓モード)に対応させるには、まず、(Materialではなく)MaterialInstance(マテリアルインスタンス)をメッシュに適用します。マテリアルインスタンスは、RenderWindowCubemapMask(窓キューブマップマスクをレンダリング)という名前のスカラーパラメータに対応する必要があります。このパラメータは、建造物がWindow Modeにある場合に、1.0に設定されます。また、RenderLOD(LODをレンダリング)という名前のオプションのパラメータがあります。これは、たとえば、LODテクスチャ生成中にマテリアルの特性をいくつか無効にしたい場合に、3つのパスすべてで1.0に設定します。

このプロセスによって、テクスチャが2つ生成されます。1つは、ディフューズ、アンリット色で、1ビットの窓マスクがアルファチャンネルに保存されます。もう1つは、ライティングテクスチャで、解像度は通常かなり低めです。これらのテクスチャは、低LODの建造物メッシュ上にあるマテリアル内同時にモジュレートされます。テクスチャが2つある理由は、窓領域にあるキューブマップテクスチャのトップでライティングを適用する必要があるためです。以下は、上で示した低LODの建造物に適用されたテクスチャです。

Windows2.jpg

ストリーミング

単一セクションのメッシュからなる低LODとは異なるサブレベルに、高詳細度の建造物(多数のメッシュインスタンスから作られる)を置くことが必要になる場合がしばしばあります。これは、システムによって自動的にサポートされます。ProcBuildingをストリーミングサブレベルに追加した場合は、自動的に新しいサブレベルが生成されます。high detail(高詳細度)レベルと同じ名前になりますが、_LODというサフィックスがつきます。たとえば、ProcBuildingをCityBlock_01に追加した場合、CityBlock_01_LODという名前の新たなストリーミングレベルが自動的に生成され、ProcBuilding_SimpleLODActor(StaticMeshActorの単なるサブクラス)がそこに追加されます。低LODを、_Pマップの中に持つのではなく、それ自身のサブレベルの中にもつ理由は、_Pマップをチェックアウトすることなく街エリアの作業が可能になるためです。高詳細度のProcBuildingを編集した際は、低詳細度バージョンも自動的に更新されます。多くの場合、高詳細度と低詳細度の両バージョンの街ブロックをチェックすることをお勧めします。

なお、ProcBuildingをサブレベルのないマップに追加した場合、LODマップは追加されません。ProcBuilding自体が低詳細度メッシュをもつことになります。

付属

StaticMeshActorをProcBuildingに付属させる場合(通常のBaseプロパティを使用して)、建造物が低LODバージョンに切り替わるときにそのメッシュが隠されます。低LODバージョンには、テクスチャにレンダリングされたその静的メッシュのバージョンがあるため、これは通常望ましいことです。StaticMeshActor(空調装置など)をProcBuildingの上に配置した場合、自動的にその建造物に付属することになります。この機能は、StaticMeshActor上で_bDisableAutoBaseOnProcBuilding_プロパティを使用して無効にすることができます。

移行

Unreal Engineでは、移行/LODに対してディザーアプローチをとっています。ただし、これを機能させるには、建造物メッシュ(または建造物に付属するStaticMeshActorsで使用されるメッシュ)に適用されるあらゆるマテリアルに対してい、_bUsedWithScreenDoorFade_プロパティをTRUEに設定します。

その他の機能

建造物のステータス

エディタに新しいタブができました。街にある建造物についてのステータスを表示できます。建造物それぞれに1つの列が当てられており、コンポーネント、トライアングル、ライティング、LODテクスチャのメモリ使用状況についての情報が見れます。これは、ルールセットをもっと単純にすべき建造物を探す際に大いに役立ちます。そのような建造物は、サイズが非常に大きい、ルールセットでライティング設定を調整する必要がある、メッシュを単純化する必要がある、と考えられます。列をダブルクリックすると、それに対応する建造物が表示されます。

building_stats.jpg

マテリアルのパラメータ

建造物メッシュのマテリアルにおいて、特定したパラメータを建造物単位で設定することが可能です。それには、ProcBuilding上の_BuildingMaterialParams_配列に要素を追加し、パラメータの名前と目的の色を入力します。これは、固有のルールセットを多数作らなくても街に視覚的バラエティをもたせることができる効果的な方法です。次は、この機能の利用例です。一並びになっている建造物は、同じルールセットを使いながらも、この機能を利用することによって壁の色が変化しています。

proc_color_variations.jpg

マテリアルのオーバーライド

生成されたルーフ、フロア、四角形の壁のポリゴンに使用されているマテリアルは、ProcBuilding単位でオーバーライド(設定変更)することができます。それには、ジオメトリモードに切り替え、代わりに使用したいマテリアルを選択し、フェース(複数可)を選び、右クリックしてProcBuilding -> Apply Material (MaterialName) To Face(マテリアル(マテリアル名)をフェースに適用)を選択します。マテリアルのオーバーライドをフェース単位ですべてクリアするには、建造物を右クリックしてProcBuilding -> Clear Material Face Assignments(マテリアルフェース割り当てをクリア)を選択します。

ルーフとフロアのメッシュ

前述したように、デフォルトでは、メッシュルールは建造物のルーフやフロアに適用されません。しかし、橋のような建造物の下にそれを支える梁を付け加える場合などには、これが必要となる場合があります。これには2つのモードがあり、ProcBuilding 上で_bApplyRulesToFloor_ または _bApplyRulesToRoof_を設定すると、抽出されているスコープと実行されているルールが、ルーフとフロアのいずれかまたは両方に対して有効になります。ルールセットのバリエーション設定の内部には、_bMeshOnTopOfFacePoly_という名前の追加オプションがあります。これを有効にすると、システムによって、通常のフロアまたはルーフのポリゴンが生成されて、それにルールが適用されます。次の例をご覧ください。通路の下側が、これに該当します。

floor_mesh.jpg

テクニカル情報(プログラマー用)

このセクションでは、ProcBuildingシステムを使用するプログラマーのために、より詳細な技術的説明を行います。

インスタンス化されたレンダリング

ProcBuildingでは、InstancedStaticMeshComponentが活用されています。エンジンは、このコンポーネントによって同じメッシュから数多くのインスタンスを一回の描画コールでレンダリングできます。このため、頂点パフォーマンスが向上し、描画コールが減少します。システムは、メッシュ単位でProcbuildingグループ1つにつき1つのISMCを作成しようとしますが、メッシュがどのようにライトマップにグループ化されているかによって、これがうまくいかないことがあります。これは、異なるマテリアルオプションまたはライティングオプションが使用された場合に発生します。エディタのINSTCOMPCOUNTというコンソールコマンドでは、コンポーネント単位のインスタンス履歴がログに出力されます。