チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。
基本的なファサードテンプレートから高度なファサードまで作成し、LOD とアセットを挿入する方法を学習します。
演習 |
---|
・Part 1: 基本的なファサード テンプレートの作成 |
・Part 2: 高度なファサードの作成 |
・Part 3: LOD とアセットの挿入 |
Facade Wizard は、複雑な CGA のファサード ルール テンプレートを容易に作成することのできるツールです。最大の利点は、ユーザーが実際に CGA コードを書くことなく、バックグラウンドで CityEngine が自動的にこれを作成してくれることです。非常に複雑な構造を効率的かつ容易に構築することができるのです。
このプロセスが素晴らしいのは、アウトプットとして CGA ルールが作成され、それを任意のファサード ジオメトリに適用することができる点です。
以下の図では、ファサードの写真の一例と、それにより作成されたルールを異なるサイズの建物に適用して生成したモデルを示しています。壁面のサイズに応じて窓の枚数が変化していることが分かります。
Facade Wizard により、いつでも再利用可能なファサード テンプレートを大量に作りためることができ、他のプロジェクトにも備えることができます。
[File] メニュー → [New]… → [CityEngine] → [CityEngine scene] から新規シーンファイルを作成します
チューリッヒの「ナショナルバンク」ビルディングのマスモデルをインポートするために、アセット ファイル NationalBankMassModel.obj を右クリックし、[Import] をクリックします。
OBJ インポーターが表示されるので、[Import as static model] オプションを無効にして [Finish] をクリックします。シーンの原点付近に建物が表示されているはずです。
幅が短い方の側面のファサードをダブルクリックします。
[Shapes] メニューの [Separate Faces] ツールを使用してこの面を選択します。
メニューより [Window] メニュー → [Facade Wizard] を選択して [Facade Wizard] を起動します。
[Facade Wizard] のフォルダーのボタン [New Façade from Image] で、[asset] フォルダーから Plane_MG_3_TX.jpg を開きます。
[Set Region Width] ダイアログが表示されます。デフォルトの値で [OK] をクリックします。
Split ツールを使用して、ファサードの指定領域を切り取ります。
[Facade Wizard] ダイアログのツールバーで、[Y Split] が選択されていることを確認します。建物を地上階、中間階、屋上部分に割けるために平行方向の分割 1 と 2 を作成します。
地上階を次のように定義します:左側の 2 つの (繰り返しの )窓、玄関、右側の 2 つの (繰り返しの) 窓。
a. [X Split] を選択します。
b. [X Split] の青い線で、1階の左側をクリックして分割 3 と 4 を作成し、2 つの (繰り返しの) 左側のウィンドウを分離します。
c. 引き続き垂直方向の分割を作成し、エントリの右側をクリックして分割 5 を作成します。
正しい分割タイプを選択するプロセスをスピードアップするために、左右の矢印キーを使用して分割タイプを切り替えることもできます。
分割の設定をした後に分割線に戻り、その位置を対話的に編集して位置を調整できます。
(a) 赤色の繰り返し分割 7 と 8 を作成します。
(b) 繰り返し分割では、青い領域が繰り返されます。この例では、窓から光が見えない領域を選択します。領域を右クリックして、[Select Region] を選択します。右側の (繰り返しの)
ウィンドウに対して同じ手順を繰り返します。
中間階で分割 9 と 10 を作成するには、再度垂直方向の分割ツールを選択し、 Shift キーを押しながら地上階で作成した分割 3 と 6 にスナップさせます。
中間階エリア内で [Y Repeat] ボタンをクリックして、残り 2 つの水平方向の繰り返し分割 11 および 12 を設定します。
[X Repeat] ボタンをもう 1 回クリックして、9 つの垂直方向の繰り返し分割を作成します。
水平方向の分割 (Y Split) と垂直方向の分割 (X Split) を行い、窓の領域を分離します。
現状平坦な表面をより立体感のある状態にするために、各タイルに対して [Z Adjust] 値を設定し、起伏を付けます。目的のシェープをクリックして左マウスボタンをホールドして左右にずらせばこの値を編集することができます。建物のどのパートについてもこれを行うことができます。
[Save Rules and Textures for Current Facade] ボタンをクリックしてファサードの .cga ファイルを作成します。
ファサード シェープにルールを適用します。
モデルを選択して生成し、立体的になったファサードを確認します。
[Visibility Setteings] の [Shapes] (F11) をクリックして、元のシェープを非表示にします。
立体的なファサードを見るためには、[Show/Hide Shapes] ( F11 キー) ボタンが押されていない状態にしておく必要があります。逆に他のファサードを選択したい場合は再度このボタンが押された状態にします。
この例では、Facade Wizard に画像ファイルを読み込んでファサード ルール テンプレートを作成します。その後でシンプルなマスモデルの建物ルール ファイルを作成し、その中から先に作成しておいたファサード ルール ファイルを実行します。これをビジュアル CGA で行います。
下図はこれから使用して行くオリジナルのファサード テクスチャ ファイルです。このファイルには、Facade Wizard を使用してより複雑なファサードを作成するにあたって、ユーザーが良く直面する問題の良い例が含まれています。
Facade Wizard を使用する際、多くの場合、ファサードの構造を分割する最善の方法を見つけるために、窓領域の数や装飾の繰り返し、不均一なフロアの高さといったファサードの細部を注意深く観察する必要があります。実際少し時間を取って戦略的にこれを考えてみてください。
以下のような分類は、メインファサードを小領域に分割する上で有効なアプローチの 1 つです。
緑: 繰り返しのないシングルタイル
青: 繰り返しのあるタイル [x または y]
赤: 入れ子式に繰り返すタイル [x と y 方向にタイル化可能]
前回の例と異なり、ここではテクスチャ ファイルを選択することにより直接的に開始します。
[Window] の [Facade Wizard] から [Facade Wizard] を開きます。
ツールバー上の [New Facade from Image] ボタンから AdvancedFacade.tif ファイルを選択します。
[Set Region Width] という小さなウィンドウが現れ、ここで分割サイズが幾何学的に理解できるようにファサード全体の幅を入力することができます。なお、この値は後から処理の中で変更することもできます。ファサードの正確なサイズが不明でも、ある 1 つの窓のサイズがわかっている場合があります。この場合、この 1 つの窓のスコープに到達した時にその値を入力すれば良いだけになります。
使用するファサードの写真が傾いて撮影されていて主要ラインが垂直または水平になっていないという場合は少なからずあります。このような場合に [Crop Image] ツールを使用して直交テクスチャを作成することができます。
[Navigator] の Tutorial_13_Facade_Wizard__2019_1\Images\facadeFoto.jpg を選択して [shapes] の [Crop Image] をクリックします。または [Navigator] の Tutorial_13_Facade_Wizard__2019_1 の [Image] にある facadeFoto.jpg を右クリックして [Crop Image] を選択します。
[Crop Image] ツールが起動すると、自動的に画像の透視線が解析され、利用可能なファサードの範囲を見つけます。
左側のウィンドウで四角形を編集すると、右側のウィンドウで結果が自動的に更新されます。切り出された範囲に満足したらファイルを保存します。
ここでは CityEngine の中で画像を幾何補正することができるということを学習しました。これにより外部のソフトウェアに頼らない、より一貫性のある処理が実現しているのです。
ファサードのサイズを大きくしてテクスチャを繰り返すには、単一の繰り返し分割を追加し、分割を絶対分割または浮動分割として定義します。
右の垂直方向の中間階部分は分割なしで残されています。その部分は左側と同じであり、このチュートリアルの後半でルールの再リンクを使用して解決されます。玄関の左側にあるタイルでも同じことが起こり、右側からタイルの1つをリンクします。
以下の分割は、あらゆるサイズのファサードに適合させるために、ファサードの中で繰り返される部分を定義する繰り返し分割です。分割2,4,6,7は、一定タイル サイズの水平分割として最初に定義され、建物全体が高くなるとそれらの階が繰り返されることになります。残りの 2 つの水平繰り返し分割も忘れずに設定してください。(それぞれ 4 つの水平タイルに分割されます。)
特殊なケースとして、アーチ状の構造を持った地上階があります。
ここで、1 つの窓の幅を定義することによりファサード全体のサイズを再定義します。このパートの最初でファサード全体のサイズを [Set Region Width] ポップアップで定義しました。しかし、この値が正確かどうかはわかりませんし、一般的にはファサード全体より窓のサイズの方が取得しやすいため、ここで新しい値をセットします。
右クリック → [Set Region Width …] を選択します。
1.2m のような適切な値を入力します。
ここで、ファサードに立体的な見た目を与える深さの値を編集するために [Z Adjust] を使用します。窓を少し押し込み、レッジを前に押し出します。また、好みに応じて三角形および台形の装飾を前方に移動します。
まだ保存していなければルールファイルを保存します。また、後にスクリプトをこの段階まで戻したくなった場合のために、ツールバーの [Save] ボタンでバックアップを取っておくこともお勧めです。
ここで、このルールでこの先どのように進めれば良いのか疑問を持たれるかもしれません。Facade Wizard で作成されるルールファイルはあくまでもファサード用ですので、垂直な面にしか適用することはできません。したがって、シンプルなマスモデルのルールを作成してテストすることにします。
MassModel.cga と名付けた新しいルールファイルを作成します。
[CGA Rule Editor] ウィンドウで buildingHeight という名前の属性を作成し、値を 25 とします。
[CGA Rule Editor] ウィンドウを右クリック → コンテキスト メニューの [Import Rules…] を選択し、先ほど作成したファサード テンプレートの CGA ファイルをインポートします (または、[Navigator] ウィンドウから CGA ファイルをドラッグ & ドロップします) 。
Lot という名前の属性を作成し、extrude コマンドを定義します。先に作成した [buildingHeight] 属性を押し出し幅として使用します。
押し出しの後は、すべての side 面を分割するための要素分解のルールを追加します 。
インポートしたファサード テンプレート ファイルの Façade ルールをアサインします。今回の例では、gen_Facade_AdvancedFacade.Facade です。MassModel.cga ファイルは以下のようになっているはずです。
import gen_Facade_AdvancedFacade : "gen_Facade_AdvancedFacade_dist.cga"
attr buildingHeight = 25
Lot-->
extrude(buildingHeight) comp(f) { side : gen_Facade_AdvancedFacade.Facade }
下図では、これまで細部の構築を保留していた部分が黄色で示されています。ここでは、CGA と [Model Hierarchy] (モデル階層) ウィンドウを使用してファサード テンプレートからの特定のサブルールを再リンクし、黄色いエリアの中の未構築部分を埋めることになります。
[Window] メニュー → [Model Hierarchy] をクリックし、建物モデルを選択します。
[Model Hierachhy] ツールバー上の [Inspect Model] ボタンをクリックして有効化します。Inspect Model モードになり、モデルが半透過表示になります。
交換したいシェープ ノード (上図で黄色で強調されているファサードの右側にある縦長のパート) をクリックします。[Model Hierarchy View] ウィンドウでも該当する場所が選択されます。 [Model Hierarchy View] ウィンドウを右クリックし、[Graph] → [Collapse Others] をクリックします。すると、シェープ ツリーの選択されていないパートが消え、[Model Hierarchy View] ウィンドウが整理されます。
親シェープ ノードを選択し、ダブルクリックします。[CGA Rule Editor] ウィンドウで個のシェープ ノードを作成するファサード テンプレート ルールがハイライトされます。
[CGA Rule Editor] ウィンドウで選択されたルールは、3 つのパートのファサードを作成します。左、真ん中、右のパートです。右パートのファサード ルールを左パートに置き換えます。今回のケースでは、Façade__1_3_3_を Façade__1_3_1 で置き換えます。
オリジナル:
Facade__1_3 -->
split(x, noAdjust) { 2.68: Facade__1_3_1 | ~10.62: Facade__1_3_2 | 2.66: Facade__1_3_3 }
置き換え後:
Facade__1_3 -->
split(x, noAdjust) { 2.68: Facade__1_3_1 | ~10.62: Facade__1_3_2 | 2.66: Facade__1_3_1 }
これでファサードの右パートは左と同じルールを使用することになります。そして使用しないルール Facade__1_3_3 はもう必要ないので削除できます。
ここまで Facade Wizard による基本的なファサード テンプレートの作成方法を学習してきました。ここからは CGA や Model Hierarchy を使用してデフォルトの Facade Wizard ルールを強化する方法を考えていきましょう。
Facade Wizard チュートリアルのこの最後のパートでは、次の 2 つのトピックを取り扱います。
詳細度 (Level of Detail, LOD)
ファサード テンプレートへのアセットの挿入
3D の都市を作成しようとすると、どうしても巨大なデータセットができてしまいがちです。このようなデータセットは、システムのリソースに細心の注意を払ってのみ扱うことができます。上級ユーザーは必要に応じて、同じ建物について異なる複雑さを持たせた別のモデルを作成することで回避しようと考えます。例えば、ある建物がカメラの正面に見えている場合、すべての細部が見えているべきですが、カメラからはるか遠い (または見えない) 建物についてはできるだけ細部を省きつつ基本形状は認識できるようなものであるべきです。同一のオブジェクトについて異なるモデルを作成し、それをカメラからの距離に応じて使いわける仕組みはコンピューター グラフィックスの分野では「詳細度 (Level of Detail)」またはそれを省略した「LOD」という用語で広く知られています。
Facade Wizard で作成したルールファイルを見ると、すでにデフォルトの LOD システムが組み込まれていることが分かります。CGA ファイルの先頭 (CGA スクリプト エディター参照) には、デフォルト値についての説明が含まれています。
CityEngine ではこれ以外の LOD を作成することも可能ですが、システムに組み込まれてはいません。
attr LOD = 2
# LOD 0 generates the original texture
# LOD 1 generates flat splits
# LOD 2 generates splits with depth as defined in Facade Wizard
下図は 3 つすべての既定 LOD の適用例を示しており、当チュートリアルの前パートで作成されたルールに基づいて表示されています。 LOD 1 と LOD 2 の間の違いは極めて小さいですが、重要なものです。LOD 1 は分割された平面で生成されているに過ぎず、すべての [Z Adjust] の設定が無視されています。一方 LOD 2 ではテクスチャ付された直方体オブジェクトに [Z Adjust] を組み込んだ立体的な表現を生成しています。 同一の Facade Wizard ルールテンプレートによる 3 つのデフォルト LOD の表示 (左から LOD 0, 1, 2)
Facade Wizard ルール テンプレートを他の cga ルールにインポート (例えば当チュートリアルの前パートで使用した MassModel.cga ファイルで行われているように) した場合、LOD 属性もマスター cga ファイルの中で初期化される必要があります。 --> attr LOD = 2
ここで重要な疑問が生じます。Facade Wizard で作成されたテンプレートが LOD 2 でも十分詳細でない場合、どうしたら良いのでしょうか?さらに詳細な LOD 3 を作成することは可能なのでしょうか?
その答えは: はい、できます!
これに対する解決策は、Model Hierarchy の中でハイライトされているシェープ、VCGA の中でハイライトされているコード、そして自作アセットの挿入を賢く組み合わせることです。
最初に MassModels.cga ファイルを編集します。
ここでは、ファサードの装飾を吟味した結果、以下のアセットを使用することにしました。
Triangular pediment asset から始めるため、CGA Rule Editor でファサードルールを開きます。
insertTriangularPedimentAsset -->
case LOD ==3 : Shape
t(0, 0, '1)
s('1, '1, 0.25)
i("triangularPediment.obj")
projectUV(0) Asset
else : Shape
LOD 3 については、obj アセットをロードします。t() と s() は配置とスケールを調整します。ProjectUV() はアセットにファサードのテクスチャを重ね合わせます。
insertSquarePedimentAsset -->
case LOD ==3 :
Shape
t(0, 0, '1) s('1, '1, 0.25) i("squarePediment.obj")
projectUV(0) Asset
else : Shape
insertArcEntryAsset -->
case LOD ==3 :
t(0, 0, -0.35) s('1, '1, 0.5) i("entryArc.obj")
projectUV(0) Asset
else : Shape
addTympanonAsset -->
case LOD ==3 :
t(0, 0, '1) i("tympanon.obj")
projectUV(0) Asset
else : Shape
アセット triangularPediment.obj と squarePediment.obj が既存シェープ上に配置されるのに対し、アセット entryArc.obj と tympanon.obj は既存シェープのジオメトリを置換する点に注意してください。ルールのコード上の違いは、最初の Shape です。
残る作業は、適切なターミナル シェープを見つけ、ここから下図に示すように先ほどの新しいルールに接続してアセットを挿入します。
建物を選択し、[Inspect Model] モードにします。
アセットを挿入するシェープを選択します。
[Model Hierarchy View] 内で、選択したシェープをダブルクリックします。[CGA Rule Editor] ウィンドウでシェープ ノードを作成するファサード テンプレート ルールがハイライトされます。
または、既存のルールの最後にアセットの挿入を行う insertTriangularPedimentAsset ルールを追加します。
Facade__1_3_1_2_2_2 -->
case LOD <= 1:
setupProjection(0, scope.xy, '8.0953, '19.2869, '-0.1945, '-11.3296)
projectUV(0)
else:
setupProjection(0, scope.xy, '8.0953, '19.2869, '-0.1945, '-11.3296)
t(0, 0, -0.2)
s('1, '1, 0.2)
i("builtin:cube")
projectUV(0) insertTriangularPedimentAsset
アセットを挿入する同様のステップをファサードの他の場所や他のアセットに行います。
最後のステップでは屋根から外側エレメントを削除します。
Facade__1_5 -->
split(x, noAdjust) { 2.68: NIL | ~10.62: Facade__1_5_2 | 2.66: NIL }