チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。
このチュートリアルを行うには、 CityEngine 2017.0 以上のバージョンが必要です。
本チュートリアルでは、CityEngine でローカル編集を行う方法を解説します。チュートリアル 6 を完了したところからスタートし、ローカル編集を有効化するためのコードを追加することから始めます。ローカル編集を使用すると、CGA コードで局所的なバリエーションを指定する必要なく、個々の窓のサイズを変更したり、地上階に変更したり、選択可能なバルコニーを追加することができます。
演習 |
---|
・Part 1: テレインの作成 |
・Part 2: 地上階のみを変更する |
・Part 3: バルコニーを追加する |
・Part 4: 草地エリアを追加する |
以下の作業を行ってハンドルを作成します。
attr window_width = 2
attr window_height = 1.5
Tile -->
split(x){ ~1 : Wall
| window_width: split(y){ ~1: Wall | window_height: Window | ~1: Wall }
| ~1 : Wall }
@Handle(shape=Window, axis=x)
attr window_width = 2
@Handle(shape=Window)
attr window_height = 1.5
複数の選択を行うと、同じローカル編集を複数の窓に同時に適用することができます。
ドアの上にある窓は、階段がある場所にあるため、通常小さくなります。以前のすべての変更を取り消し、ローカル編集を使用してこれを作成することができます。
地上階は建物の中間階とは異なる場合があります。例えば、地上階の窓は、通常、中間階の窓よりも大きくなっています。このシンプルな建物ルールでは、同じ窓のタイル化コードを使用して、すべてのフロアで同じ窓のタイルを作成しますが、ローカル編集を使用することにより、建物の正面にある地上階の窓は、地上階のタイルのための別のルールを書くことなく、大きくすることができます。
@Handle(shape=Tile, axis=x)
@Range(min=1, max=10, restricted=false)
attr tile_width = rand(2.5,6)
これにより、地上階の 1 つのタイルが変更されます。しかし、目標は地上階のすべてのタイルを変更することです。これは、より高いレベルでシェープを選択することによって可能です。
これにより、ステップ 5 で変更された最初の窓を除いて、地上階のすべての窓が変更されます。これは、ステップ 5 で最初の窓に加えられた編集がより低いレベルにあったためです。同じオブジェクトに対する複数の編集が存在する場合、最も低いレベルで行われた編集が優先されます。Inspector では、[tile_width]、[window_width]、および [window_height] の各属性の横にある ↓ の矢印は、これらの属性が現在の選択レベルよりも低いレベルで編集されたことを示します。[window_width] 属性の横にある * 記号は、現在の選択レベルでも編集されていることを示します。地上階のすべての窓が同じである必要があるため、不揃いとなった原因である低いレベルで窓に加えられた変更は、元に戻す必要があります。
建物にジオメトリまたは詳細をローカルに追加するオプションを提供することは可能ですが、ジオメトリが存在しない場合にユーザーがハンドルにアクセスする方法が必要です。たとえば、選択した窓にバルコニーを配置するためにローカル編集を使用できます。これを行うには、バルコニーに並列するジオメトリが必要です。この並列ジオメトリにより、バルコニーが存在しない場合でもバルコニーのハンドルにアクセスできるようになります。
attr hasBalcony = false
Tile -->
split(x){ ~1 : Wall
| window_width: split(y){ ~1: Wall | window_height: Window BalconyMass | ~1: Wall }
| ~1 : Wall }
BalconyMass -->
s('1,0.9,0.9)
t(0,0,'-0.5)
Balcony
Balcony -->
case hasBalcony:
primitiveCylinder(32)
color(0.8,0.8,0.8)
split(z) { ~1: NIL
| ~1: comp(f) { top: NIL
| back: NIL
| bottom: extrude(0.05) Bottom.
| all= BalconyRailing } }
else:
NIL
BalconyRailing -->
comp(f) { side: s(0.05,'1,'1) center(x) extrude(0.05) Bar. }
s('1,0.05,'1)
[ t(0,-0.05,0) extrude(vertex.normal, 0.05) Bottom. ]
[ t(0,0.9,0) extrude(vertex.normal, 0.05) Railing. ]
@Handle(shape=Balcony, type=toggle, occlusion=false)
attr hasBalcony = false
PageUp キーと PageDown キーを使用して、上位レベルに移動したり、下位レベルに移動したりすることができます。
[Inspector] では、[hasBalcony] 属性の横に上向き矢印 ↑ があります。これは、この属性が上位レベルでローカルに編集されたことを意味します。この変更は、下位レベルで実行された編集が優先されるため上書きできます。
Home キーと End キーを使用してパターンを選択できます。
ローカル編集はシェープ ツリーにリンクされています。ローカル編集の1つの制限は、シェープ ツリー構造を変更すると、既に適用されているローカル編集が失われる可能性があることです。つまり、ローカル編集を適用した後にコードを変更すると、予期しない結果につながる可能性があります。ローカル編集はコードの作成終了後にのみ行う、あるいは将来のコードの変更を考慮したコードとしてプレース ホルダー ルールを作成する、といった対策によりコード変更によりシェープ ツリー構造を変更しないようにすることをお勧めします。
Lot -->
extrude(height) Building
Lot -->
offset(-1)
comp(f) { inside: Footprint | border= Grass }
Footprint -->
extrude(height) Building
Grass -->
color("#4c7b1e")
offset オペレーションを使用して、芝生と建物の設置エリアを分けます。Footprint ルールは Building を作成します。
残念ながら、ローカル編集がシェープ ツリーに関連しているため、ローカル編集が失われてしまいます。シェープ ツリーの構造が変更されると、予期しない結果が生じる可能性があります。コードを元の状態に戻して、ローカル編集がまだ存在することを確認することができます。
ステップ 3 の前後のシェープ ツリーは、Footprint シェープが Lot シェープと Building シェープの間に挿入されていることを示しています。
シェープ ツリーを開くには、[Window] → [Show Model Hierarchy] を選択して、建物を選択し、[Model Hierarchy] タブで [Inspect model] をクリックします。詳細は Model Hierarchy をご参照ください。
Lot -->
offset(-1)
comp(f) { inside: extrude(height)
Building | border= Grass }
Simple_Building_LE_05.cga のルール ファイルを使用した最終結果は、Simple_Building_LE_05.cej シーンに含まれています。
ローカルでの編集を失わないための一つの方法は、コードを追加する際にシェープ ツリー構造を変更しないようにすることです。もう一つの方法は、最初のルール ファイルを作成するときに、後で必要になると思われるルールのプレースホルダーを作成するようにすることです。コードを変更すると、ローカル編集が意味をなさなくなる場合があるので、CGA ファイルの作成が完了してからローカル編集を適用するのが最も簡単な解決策かもしれません。