チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。チュートリアルまたはサンプルを選択すると、プロジェクトが自動的にダウンロードされ、ワークスペースに追加されます。
このチュートリアルでは、ArcGIS CityEngine におけるローカル編集の方法を紹介します。ローカル編集を使用すると、個々の窓のサイズを変更したり、1 階部分を調整したり、バルコニーを個別に追加したりすることができます。これらのローカルな変更を CGA コード内で指定する必要はありません。
生成されたモデルがどのように構成されているかを理解することは有益です。これをより深く理解するために、[Model Hierarchy] ツールに慣れておくことをおすすめします。このツールを使えば、生成されたモデルのシェープ ツリーを確認することができます。
演習 |
---|
・Part 1: 個々の窓の編集 |
・Part 2: 地上階の変更 |
・Part 3: バルコニーの追加 |
個々の窓を編集するには、以下の手順を完了してください。
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
この操作により、すべての窓のサイズが同じように変更されます。
ローカル編集を使用すると、ルール内に窓の幅の属性が 1 つしか存在しない場合でも、各窓の幅を個別に変更することが可能です。
[Viewport] ウィンドウでオレンジ色にハイライトされている部分は、現在選択されているオブジェクトを示しています。[Inspector] ウィンドウで同じくオレンジ色にハイライトされている属性は、現在の選択に対してローカル編集が可能です。window_width と window_height の属性は、この窓だけに対して個別に設定することができます。
複数選択を使用すると、同じローカル編集を複数の窓に同時に適用することができます。
ドアの上にある窓は、階段があるために小さくなることがよくあります。以前のすべての変更を取り消し、ローカル編集を使ってこの構成を作成することができます。
Home と End を押すことで、利用可能なパターンを前方または後方に繰り返すことができます。パターンは、シェープ ツリーと CGA コードによって作成された階層構造に基づいて自動的に検出されます。この場合、利用可能なオプションは、地上階の上にある窓の列の選択です。
地上階は建物の上層階とは異なることがよくあります。例えば、地上階の窓は通常、上層階の窓よりも大きくなっています。このシンプルな建物ルールでは、すべての階に同じ窓のタイルを作成するために、同じ窓のタイル コードを使用しています。しかし、ローカル編集を行うことで、地上階のためのタイル ルールを新たに作成する必要なく、地上階の建物正面の窓をより大きくすることができます。
@Handle(shape=Tile, axis=x)
@Range(min=1, max=10, restricted=false)
attr tile_width = rand(2.5,6)
これは地上階の 1 つのタイルを変更するだけです。しかし、目標は地上階のすべてのタイルを変更することです。これは、より高いレベルでシェープを選択することで可能になります。
現在、地上階のすべての窓が選択され、オレンジ色でハイライトされています。PageUp と PageDown は、それぞれ階層を上のレベル、または下のレベルへ移動します。ローカル編集はシェープ ツリーにリンクされており、編集をシェープ ツリーのより上位のレベルで適用することで、階すべての窓など複数のオブジェクトに対して編集を行うことができます。
これは、地上階のすべての窓を変更しますが、先ほど変更した最初の窓は除かれます。これは、最初の窓に対する編集がより低いレベルで行われたためです。同じオブジェクトに複数の編集が存在する場合、最も低いレベルで行われた編集が優先されます。
[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. ]
Balcony ルールは、バルコニーのジオメトリーを生成する場合もあれば、何も生成しない(NIL) 場合もあるため、バルコニーが存在しないときでもハンドルにアクセスできるように、ジオメトリーを持つ並列シェープが必要です。その並列シェープが「窓」です。BalconyMass ルールは、バルコニーが挿入されるボリューム空間を作成し、残りのルールがバルコニーのジオメトリーを生成します。
@Handle(shape=Balcony, type=toggle, occlusion=false)
attr hasBalcony = false
通常、バルコニーは建物の上層階にのみあり、玄関の上にある階段の窓には設置されないことが多いです。
上層階の窓を選択し、PageUp を押して、地上階を除いたすべての上層階が選択されるまでレベルを上げます。
トグル ハンドルを使って hasBalcony 属性を true に切り替えることで、すべての上層階の窓にバルコニーを追加してください。
[Inspector] ウィンドウで、hasBalcony 属性の横に上向き矢印 (↑)が表示されています。これは、この属性がより高いレベルでローカル編集されていることを示しています。この変更は上書き可能です。なぜなら、同じオブジェクトに対して複数の編集がある場合、より低いレベルで行われた編集が優先されるためです。
Home と End は、パターンを選択するために使用できます。
ローカル編集の制限のひとつに、シェープ ツリーの構造を変更すると、すでに適用されたローカル編集が失われる可能性があるという点があります。つまり、ローカル編集を適用した後にコードを変更すると、予期しない結果が生じる可能性があります。そのため、ローカル編集はコードが完成した後に行うことが推奨されます。
このチュートリアルでは、ローカル編集を使用して以下のことを行う方法を学びました。
CityEngine の学習をさらに進めるには、その他のクラシック チュートリアルをご覧ください。