チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。
このチュートリアルは、主にモデルにハンドル機能を追加したい CGA ルール作成者向けです。ハンドルを設定すると、[Viewport] ウィンドウ内でCGA 属性を編集することができます。モデル編集を簡易化し、どの属性をコントロールできるかを視覚的に確認することができます。
演習 |
---|
・Part 1: 基本的なライン ハンドル |
・Part 2: 高度なライン ハンドル |
・Part 3: その他のハンドル タイプ |
ハンドルを作成する前に、以下の作業を行ってください。
キューブの高さを調節するハンドルを作成します。
@Handle(shape=Cube)
attr height = 10
これでキューブの高さを変更できるハンドルが追加されます。
ハンドルはモデルの外側に配置されます。ビューを回転させるとハンドルも合わせて最適な位置に移動するので、モデルに隠れたりしません。ハンドルのオレンジ色の矢印をクリックしてドラッグさせると、属性の値を編集することができます。また、ハンドルをドラッグさせると、属性の値が表示されます。
次にキューブの幅をコントロールするハンドルを作成します。
@Handle(shape=Cube, axis=x, skin=sphere, color="#6666ff")
attr width = 10
これでシェープ Cube に幅用のハンドルが追加され、位置と表示をカスタマイズする追加のパラメーターも使用されています。
続いて、キューブの奥行きをコントロールするハンドルを作成します。
@Handle(shape=Cube, axis=z, skin=diameterArrow)
attr depth = 10
ここでもハンドルのスコープ軸を指定する axis パラメーターを設定します。このモデルの depth 属性は width や height 属性とは挙動が異なり、中心ポイント周辺のキューブの奥行きを伸縮させます。これを実現するためには、skin = diameterArrow パラメーターを使用します。この設定により、これまでのものとは異なる振る舞いを持ちつつ、両端の 2 つの矢印でキューブ モデルの奥行きを変更できるようなハンドルを作成することができます。
2. 視点を動かすと、ハンドルが他のハンドルやモデルを避けて配置されるのが確認できるはずです。
最後のパラメーター offsetX では、視点を変更しても移動しないハンドルを作成します。
@Handle(shape=ShapeForHandleOnly, axis=x, reference=origin, slip=inside)
attr offsetX = 5
ここでは、このハンドルを仮のスコープのためだけに作成しています。パラメーター slip=inside はハンドルがモデルのシルエットの中に配置され、そして視点を動かしても移動しないように命令します。通常ハンドルは、スコープの定義された軸方向の 4 つのエッジのうちのいずれかに表示されますが、reference=origin はハンドルをスコープの原点に接するエッジにのみ表示するよう設定します。
ShapeForHandleOnly ルールはジオメトリを生成しません。
@Handle(shape=ShapeForHandleOnly,
axis=x, reference=origin, slip=inside, translate={0,0.5,0})
attr offsetX = 5
translate = パラメーターは現在のスコープに合わせてハンドルを移動させます。引数 {0, 0.5 ,0} は、ハンドルを y 方向 (上向き) に scope-y のサイズ (高さ) の 0.5 倍の距離だけ移動させます。
translate = パラメーターがない場合は、 offsetX ハンドルは床に置かれ (左図)、translate = パラメーターがある場合は、ハンドルはキューブの中心に置かれます (右図)。最初の 3 つのハンドルはシルエットの外に配置されるのと対照的に、slip = inside によりハンドルを常にキューブのシルエットの中に置くことができます。
次に、より高度な風車のモデルを使用してハンドルを設定します。
Windmill.cga では、円筒形や他の形状の繰り返しなど、フィーチャ形状を様々にコントロールするための属性が設定されています。このような複雑なジオメトリに対してどのようにハンドルを追加するのかを学習します。
本チュートリアルの Part 1 では、立方形のシェープにハンドルを追加しました。視点の変更に対して、ハンドルはキューブの面の常に同じ平面にスナップされていました。同様の設定を円筒形の風車小屋オブジェクトにも適用できます。
@Handle(shape=UnderRoof)
@Range(min=3, max=100, restricted=false)
attr height = 7
視点を回転させると、このハンドルはあまり効果的ではないことがわかります。視点が回転すると、UnderRoof スコープのコーナーの位置の間をジャンプします。スコープは建物よりも大きく、形状が異なるため、モデルとハンドルの関連付けを追跡することは困難です。
@Handle(shape=UnderRoof, reference=center, slip=screen)
@Range(min=3, max=100, restricted=false)
attr height = 7
パラメーター reference = center はハンドルをスコープの中心に配置します (詳細は、CGA リファレンスをご参照ください)。slip = はモデルの外側へのハンドルを移動する方向を定義します。slip=screen の場合、2 次元の画面上でハンドル自身に対して平行に動くよう指定します。これによって作成されたハンドルはより明確かつスムーズに動きます。
画面の上部と下部に風車小屋の半径をコントロールするハンドルを追加します。
@Handle(shape=UnderRoof, reference=radial, align=bottomLeft)
@Range(min=1.5, max=9, restricted=false)
attr bottomRadius = 2
@Handle(shape=UnderRoof, reference=radial, align=topLeft)
@Range(min=1.0, max=5.1, restricted=false)
attr topRadius = 1
多くのモデルでは、1 つの属性が 1 つ以上のパートに影響することがあります。この風車小屋の例では、bladeLength 属性が風車の 4 つの羽の長さを変更します。
CityEngine はこのようなハンドルをまとめて連結し、各属性の単一のチェーンとして表示します。
@Handle(shape=Blade, axis=x, reference=origin)
attr bladeLength = height * 0.6
視線方向により、表示されるハンドルのチェーンが異なります。この例では、風車の羽に対して、2 つのハンドルを 1 つのチェーンとして表示しています。
@Handle(shape=Blade, axis=x, reference=origin, repeat=none)
attr bladeLength = height * 0.6
windowScale 属性は少し複雑ですが、ドアと窓のサイズを操作できます。
ルール Windoor は単一のルールで窓とドアの両方を作成します。
@Handle(shape=Windoor, axis=y)
@Range(min=0.1, max=1.5, restricted=false)
attr windowScale = 1
height 属性を編集すると、窓の数が増減します。
windowScale 属性のもう 1 つの特徴として、これは縮尺率であって窓のサイズではないということが挙げられます。各窓およびドアのスコープは、この属性値に依存したサイズを持っています。CityEngine は繰り返しエレメント全体に対して 1 つのハンドルのチェーンを配置し、各スコープに合うように各ハンドルの長さをスケールします。このようなライン ハンドルをドラッグすると、(ハンドルの長さとは異なる値の) 実際の長さが表示されます。
本チュートリアルの最後のパートでは、カラー、トグル、そして回転ハンドルおよび、スコープの削除によるハンドルの非表示について見ていきます。
なじみのない CGA コードを使用する場合は、モデル階層を使用して使用可能なスコープを調べると便利なことがあります。
では、先ほど確認した HeadHandle スコープにハンドルを追加します。
@Handle(type=color, shape=HeadHandle^1, axis=y, reference=center)
attr color = "#888888"
ここで、ルール名とルールが取るパラメーターの数 (ここでは shape = HeadHandle^1) でスコープを識別します。前出の例では、パラメーター数は 0 であったため、この識別子を無視することができました。color 属性は文字列ですが、パラメーター type = color を使用することで viewport 内で編集することができます。カラー、トグル、およびセレクター ハンドルはライン ハンドルとは振る舞いが異なります。例えば、axis = y はハンドルを y(up) 方向に動かしますが、reference =center はハンドルをスコープ中心の位置に付与します。
ルールでスコープの生成をコントロールすることにより、ハンドルを非表示にすることができます。人モデルの各腕、および足はインポートされたルール インスタンスにより作成されており、各インポートされたインスタンスは手足の位置をコントロールする 3 つのパラメーターを持っています。しかし、モデルにこれらの 12 個ものハンドルを追加すると紛らわしくなります。そのため、これらのハンドルにブール属性 (showRotateHandels) が true の場合のみ作成されるオプションのスコープを付与します。
@Handle(type=toggle, shape=HeadHandle^1, slip=screen, align=right)
attr showRotateHandles = false
今回は、 slip=screen および align=right を使用してモデルの頭部の右側にハンドルを固定して配置するように設定します。
デフォルトでは、回転ハンドルは表示方向を変更しても動きませんが、横から見ると見えなくなります。モデル周囲で視点を回転させることにより、ハンドルが操作しやすくなることがあります。そうすることにより、モデル上にあるすべてのハンドルを見ることもでき、初心者ユーザーにも属性を理解してもらいやすくなります。ぜひハンドルをモデルに適用して、活用してください!