チュートリアル 18: ハンドル

チュートリアル データ

チュートリアル データは、[Help] メニュー → [Download Tutorials and Examples…] を選択し、[CityEngine Tutorial] からダウンロードできます。

概要

このチュートリアルは、主にモデルにハンドル機能を追加したい CGA ルール作成者向けです。ハンドルを設定すると、[Viewport] ウィンドウ内でCGA 属性を編集することができます。モデル編集を簡易化し、どの属性をコントロールできるかを視覚的に確認することができます。

演習
Part 1: 基本的なライン ハンドル
Part 2: 高度なライン ハンドル
Part 3: その他のハンドル タイプ

Part 1: 基本的なラインハンドル

ハンドルを作成する前に、以下の作業を行ってください。

  1. チュートリアル 18 の scenes フォルダーから、part 1.cej ファイルを開きます。
  2. [Scene] ウィンドウ内で、モデルを生成します。
  3. キューブ モデルを選択し、[Inspector] ウィンドウで depth、height、offsetX、width を確認します。
  4. rules/cube.cga ファイルを開きます。

ハンドルの作成

キューブの高さを調節するハンドルを作成します。

  1. height (高さ) 属性にアノテーションを追加します。
@Handle(shape=Cube)
attr height = 10

これでキューブの高さを変更できるハンドルが追加されます。

  1. キューブ モデルを選択し、 [Shapes] メニュー → [Generate] をクリックして、ハンドルを表示させます。

ハンドルはモデルの外側に配置されます。ビューを回転させるとハンドルも合わせて最適な位置に移動するので、モデルに隠れたりしません。ハンドルのオレンジ色の矢印をクリックしてドラッグさせると、属性の値を編集することができます。また、ハンドルをドラッグさせると、属性の値が表示されます。

  1. ビューをズームインします。するとハンドルはモデルの外側ではなく、モデル上に配置されます。

幅ハンドルの作成

次にキューブの幅をコントロールするハンドルを作成します。

  1. width 属性に以下のアノテーションを追加します。
@Handle(shape=Cube, axis=x, skin=sphere, color="#6666ff")
attr width = 10

これでシェープ Cube に幅用のハンドルが追加され、位置と表示をカスタマイズする追加のパラメーターも使用されています。

  • axis = x ハンドルの方向がキューブのスコープに対して x 軸にするように指定します。
  • skin = sphere オレンジ色の矢印を球体に変更します。
  • color=”#6666ff” 球体ハンドルの色を青に変更します。
  1. モデルを再生成し、追加されたハンドルを操作し、変更を確認します。

奥行きハンドルの作成

続いて、キューブの奥行きをコントロールするハンドルを作成します。

  1. depth 属性に以下のアノテーションを追加します。
@Handle(shape=Cube, axis=z, skin=diameterArrow)
attr depth = 10

ここでもハンドルのスコープ軸を指定する axis パラメーターを設定します。このモデルの depth 属性は widthheight 属性とは挙動が異なり、中心ポイント周辺のキューブの奥行きを伸縮させます。これを実現するためには、skin = diameterArrow パラメーターを使用します。この設定により、これまでのものとは異なる振る舞いを持ちつつ、両端の 2 つの矢印でキューブ モデルの奥行きを変更できるようなハンドルを作成することができます。

2. 視点を動かすと、ハンドルが他のハンドルやモデルを避けて配置されるのが確認できるはずです。

オフセット ハンドルの作成

最後のパラメーター offsetX では、視点を変更しても移動しないハンドルを作成します。

  1. 下記のアノテーションを追加します。
@Handle(shape=ShapeForHandleOnly, axis=x, reference=origin, slip=inside)
attr offsetX = 5

ここでは、このハンドルを仮のスコープのためだけに作成しています。パラメーター slip=inside はハンドルがモデルのシルエットの中に配置され、そして視点を動かしても移動しないように命令します。通常ハンドルは、スコープの定義された軸方向の 4 つのエッジのうちのいずれかに表示されますが、reference=origin はハンドルをスコープの原点に接するエッジにのみ表示するよう設定します。

ShapeForHandleOnly ルールはジオメトリを生成しません。

  1. この新しいハンドルがキューブの中心に配置されるよう編集します。
@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 によりハンドルを常にキューブのシルエットの中に置くことができます。

Part 2: 高度なラインハンドル

次に、より高度な風車のモデルを使用してハンドルを設定します。

  1. チュートリアル 18 の scenes フォルダーから、part 2.cej ファイルを開きます。
  2. [Scene] ウィンドウ内でモデルを生成し、属性を確認します。
  3. rules/windmill.cga ルール ファイルを開きます。

Windmill.cga では、円筒形や他の形状の繰り返しなど、フィーチャ形状を様々にコントロールするための属性が設定されています。このような複雑なジオメトリに対してどのようにハンドルを追加するのかを学習します。

基本的な風車小屋ハンドルの作成

本チュートリアルの Part 1 では、立方形のシェープにハンドルを追加しました。視点の変更に対して、ハンドルはキューブの面の常に同じ平面にスナップされていました。同様の設定を円筒形の風車小屋オブジェクトにも適用できます。

  1. 基本ハンドルを作成するアノテーションを追加します。
@Handle(shape=UnderRoof)
@Range(min=3, max=100, restricted=false)
attr height = 7

視点を回転させると、このハンドルはあまり効果的ではないことがわかります。視点が回転すると、UnderRoof スコープのコーナーの位置の間をジャンプします。スコープは建物よりも大きく、形状が異なるため、モデルとハンドルの関連付けを追跡することは困難です。

  1. 風車小屋モデル用のハンドルを作成するアノテーションに編集します。
@Handle(shape=UnderRoof, reference=center, slip=screen)
@Range(min=3, max=100, restricted=false)
attr height = 7

パラメーター reference = center はハンドルをスコープの中心に配置します (詳細は、CGA リファレンスをご参照ください)。slip = はモデルの外側へのハンドルを移動する方向を定義します。slip=screen の場合、2 次元の画面上でハンドル自身に対して平行に動くよう指定します。これによって作成されたハンドルはより明確かつスムーズに動きます。

半径ハンドルの追加

画面の上部と下部に風車小屋の半径をコントロールするハンドルを追加します。

  1. 半径ハンドルを作成するアノテーションを作成します。
@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. 視点を回転させます。 視点を回転させると、2 つのハンドルがモデルのジオメトリに対してより適切な位置に動くのが分かります。reference=radial は円筒の半径を調整するハンドルを配置し、align= は画面上の任意の位置にハンドルを配置するよう設定します。align を使うことによって、画面上での各ハンドルの位置を固定することができます。これを定義しない場合 bottomRadius ハンドルはモデルの上部に配置されてしまいます。

チェーン ハンドルの作成

多くのモデルでは、1 つの属性が 1 つ以上のパートに影響することがあります。この風車小屋の例では、bladeLength 属性が風車の 4 つの羽の長さを変更します。

CityEngine はこのようなハンドルをまとめて連結し、各属性の単一のチェーンとして表示します。

  1. bladeLength 属性に Handle アノテーションを追加します。
@Handle(shape=Blade, axis=x, reference=origin)
attr bladeLength = height * 0.6

視線方向により、表示されるハンドルのチェーンが異なります。この例では、風車の羽に対して、2 つのハンドルを 1 つのチェーンとして表示しています。

  1. repeat=none パラメーターを使用し、チェーンの振る舞いをオフにします。
@Handle(shape=Blade, axis=x, reference=origin, repeat=none)
attr bladeLength = height * 0.6

ドアと窓のハンドルを追加

windowScale 属性は少し複雑ですが、ドアと窓のサイズを操作できます。

ルール Windoor は単一のルールで窓とドアの両方を作成します。

  1. 属性をコントロールするハンドルを作成します。
@Handle(shape=Windoor, axis=y)
@Range(min=0.1, max=1.5, restricted=false)
attr windowScale = 1

height 属性を編集すると、窓の数が増減します。

windowScale 属性のもう 1 つの特徴として、これは縮尺率であって窓のサイズではないということが挙げられます。各窓およびドアのスコープは、この属性値に依存したサイズを持っています。CityEngine は繰り返しエレメント全体に対して 1 つのハンドルのチェーンを配置し、各スコープに合うように各ハンドルの長さをスケールします。このようなライン ハンドルをドラッグすると、(ハンドルの長さとは異なる値の) 実際の長さが表示されます。

  1. ハンドル上にカーソルを載せると、ハンドルが付与されているスコープがハイライトされます。この挙動はすべてのハンドル タイプで起こります。ここでは、Windoor スコープがオレンジ色になっています。

  2. さまざまな方向からハンドルの位置を確認しましょう。

Part 3: その他のハンドルタイプ

本チュートリアルの最後のパートでは、カラー、トグル、そして回転ハンドルおよび、スコープの削除によるハンドルの非表示について見ていきます。

  1. チュートリアル 18 の scenes フォルダーから、part 3.cej ファイルを開きます。
  2. [Scene] ウィンドウ内で、モデルを生成し、属性を確認します。
  3. rules/biped.cga ルール ファイルを開きます。 本チュートリアルの Part 1Part 2 では、様々なライン ハンドルを使用しました。これらのタイプに追加して、他のタイプの属性をコントロールできるハンドルもあります。それではモデルの頭上にカラー ハンドルを追加してみましょう。

モデルにスコープを追加

なじみのない CGA コードを使用する場合は、モデル階層を使用して使用可能なスコープを調べると便利なことがあります。

  1. [Window] メニュー → [Show Model Hierarchy] をクリックし、Model Hierarchy にアクセスします。
  2. 編集ツールから Inspect model ボタンをクリックします。
  3. モデルの頭部をクリックし、Model Hierarchy 内でスコープを表示します。
  4. 階層をたどり、固有名を持つ適切なスコープを探します。X は他の場所でも使用される少し特殊なものなので、ここでは、HeadHandle がハンドルに適したスコープです。
  5. HeadHandle 上にカーソルを載せると、このルールがパラメーターを 1 つ持っていることが分かります。

カラー ハンドルの作成

では、先ほど確認した HeadHandle スコープにハンドルを追加します。

  1. 以下のアノテーションを追加します。
@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 はハンドルをスコープ中心の位置に付与します。

  1. モデルを生成します。スクリーンにはカラー ハンドル (左図) が表示され、ハンドルをドラッグすると、color 属性を編集できるカラー ホイールが表示されます (右図)。 三角形内をドラッグすると、色の彩度と輝度を変更でき、大きな円内でドラッグすると、色調を選択できます。以前選択した色はホイールの外側に小さい丸で表示されます。

ハンドルの表示コントロール

ルールでスコープの生成をコントロールすることにより、ハンドルを非表示にすることができます。人モデルの各腕、および足はインポートされたルール インスタンスにより作成されており、各インポートされたインスタンスは手足の位置をコントロールする 3 つのパラメーターを持っています。しかし、モデルにこれらの 12 個ものハンドルを追加すると紛らわしくなります。そのため、これらのハンドルにブール属性 (showRotateHandels) が true の場合のみ作成されるオプションのスコープを付与します。

  1. 属性をコントロールし、手足のコントロール ハンドルを表示するために、type=toggle ハンドルを作成します。
@Handle(type=toggle, shape=HeadHandle^1, slip=screen, align=right)
attr showRotateHandles = false

今回は、 slip=screen および align=right を使用してモデルの頭部の右側にハンドルを固定して配置するように設定します。

  1. トグル ハンドルの操作は、単にクリック、またはクリック後上か下にドラッグします。ハンドルを使用して、showRotateHandlestrue にセットすると、各手足を動かすための回転ハンドルが表示されます。この回転ハンドルを使用することにより、人モデルにポーズをとらせることができます。

デフォルトでは、回転ハンドルは表示方向を変更しても動きませんが、横から見ると見えなくなります。モデル周囲で視点を回転させることにより、ハンドルが操作しやすくなることがあります。そうすることにより、モデル上にあるすべてのハンドルを見ることもでき、初心者ユーザーにも属性を理解してもらいやすくなります。ぜひハンドルをモデルに適用して、活用してください!