パート3で紹介した頂点カラーを元にした Switch の切替をマテリアルのアサイン情報を元にオブジェクトを切り替えられるようにする。
1. 元シーンファイルの作成
新たにシーンを作成 (File->New)、Grid にマテリアルを3種類アサインする。
- Grid の作成
- Create シェルフで Grid を Ctrl キーを押しながらクリック、原点に配置。ネットワークビューで grid_object1 の中に入る。grid1 がある。
- Size を48 x 48
- Rows と Columns はそれぞれ 10 (デフォルトのまま)
- SHOP Network ノードの作成
- マテリアルの作成
- グループの作成
作成したマテリアルをコンポーネント(面)単位でアサインするには、グループの定義が必要。(マテリアルのアサインの詳細に関してはこちらを参照してください)- ネットワークビューで /obj/grid_object1 に戻り、grid1 を選択。
- ビューポートにカーソルを移動、スペースバー+2で Top ビューに移る。
- 選択ツールで面選択モードになっていることを確認(下記画像の赤枠)、Grid の右側 1/3 を選択。
- 選択を保持したまま、ビューポート上で TAB->groupとタイプして Group ノードを作成。
ビューポートでの選択が作成された Group ノード (group1) に反映される。 - 残りの面を2度に分け、中央部分、左側と1/3ずつ選択、Group ノードの作成を繰り返し、結果として group ノードが3つ出来るようにする。ネットワークは以下のようになる。
- マテリアルのアサイン
- ネットワークビューで group3 の出力から Materialノードを作成。material1 が出来る。
- material1 ノードの「1」タブで、Group に group1 を指定。
- Material 脇の Open floating Operator Chooser ボタンをクリック
- red を選択。
- Export Relative Path をオンにして Accept ボタンをクリックし確定する。
これでマテリアルへのパスが "../shopnet1/red" と相対パスで記述される。 - material1 の Number of Materials を '+' ボタンを2度押すか直接入力するかして 3 にする。タブ数が3つになる。
- 同じ要領で「2」タブで Group に group2、Material に "../shopnet1/green"、「3」タブで group3 と "../shopnet1/blue" を指定。
- ビューポートにカーソルを移動、スペースバー+1 で Perspビューに戻ることが出来る。
これで元となるシーンが作成終了。ここまでが 03_copy_stamp_material_begin.hip。このマテリアル配置を元にオブジェクトをアサインしていく。
2. 配置オブジェクトの作成とアトリビュートの設定
前のシーン同様、Copy ノードと Switch ノードによりオブジェクトの配置を行うが、最初に配置するオブジェクトの作成とその元となるアトリビュートの設定を行う。
- 配置するオブジェクトの作成
- /obj/grid_object1 内に torus, box, sphere を作成。
- Switch ノードを作成。torus1, box1, sphere1 の順でswitch1 の入力に接続。
- Copy ノードを作成。左の入力に switch1、右の入力に material1 を接続。copy1 の Transform Using Template Point Attribute をオフにする。
ここまでのネットワークの様子は以下の通り。
ビューポート上では以下の通りで、まだマテリアルによって切り替えられてはいない。
Switch Input の値を変えれば、一括で切り替えることは可能。これをマテリアル情報を元に切り替えられるようにしたい。
- ポイントの追加とアトリビュートの継承
上の画像をみてわかるように、マテリアルは面 (primitive) 単位でアサインされ、コピーは点 (point) 単位で行われている。- material1ノードを選択、Geometry Spreadsheet へ行き、Primitive ボタンをクリックすると各面がそれぞれ shop_materialpath というアトリビュートを用いて面へのパスが文字列で定義されていることが確認できる。
この shop_materialpath は primitive (面タイプ) アトリビュートであり、このままでは点から参照することは出来ない。しかもこのアトリビュートは基本的には Mantra で使用するためのアトリビュートなので、絶対パスで記述されている (IFD には常に絶対パスで記述される)。これも Houdini Engine などと併用して他のパッケージにもって行く場合には宜しくない。 - Attribute Wrangle ノード (attribwrangle1) を作成
- material1 と copy1 の間に挿入。
- Run Over を Primitive に設定。
- VEXpression として以下のコードを記入
string path, mat; splitpath(s@shop_materialpath, path, mat); string materials[] = { "red", "green", "blue" }; i@switch = 0; for (int i = 0; i < len(materials); ++i) { if (materials[i] == mat) { i@switch = i; break; } }
このコードの解説はこちら。これで、文字列によるマテリアルの設定を整数アトリビュートである switch に、red=0, green=1, blue=2 の要領で変換することが出来た。
- Attribute Promote ノード (attribpromote1) を作成。attribwrangle1 と copy1 の間に挿入。
- Original Name に switch を指定。
- Original Class を Primitive に。
- New Class を Point (デフォルトのまま)
- Promotion Method を First Match にする。
- Scatter ノードを作成、Force Total Count を 100前後に。 attribpromote1 と copy1 の間に挿入。これにより、オブジェクトがエッジの交点以外の場所に配置されるようになった。
ここまでのネットワークは以下の通り。
- material1ノードを選択、Geometry Spreadsheet へ行き、Primitive ボタンをクリックすると各面がそれぞれ shop_materialpath というアトリビュートを用いて面へのパスが文字列で定義されていることが確認できる。
3. Copy と Switch の設定
Scatter によるポイントと switch の値でオブジェクトが切り替わるようにする。
- Copy の設定
- Switch の設定
- switch1 を選択、Select Input に以下のエクスプレッションを入力。
stamp("../copy1", switch, 0) - Merge の作成
merge ノード (merge1) を作成、material1 と copy1 を接続し、このノードに表示フラグを設定。こうすうることで、マテリアルのついた Grid とコピーされたオブジェクト群の両方が常に見えるようにする。
- switch1 を選択、Select Input に以下のエクスプレッションを入力。
まとめ
シーンファイル:
copy_stamp.zip (105KB) ここで使っているファイルは
- 00_initial_setup.hip: パート1 シーン設定時
- 01_end_of_copy_stamp.hip.hip: パート1 終了時
- 02_end_of_copy_stamp_color.hip: パート2 終了時
- 03_copy_stamp_material_begin.hip: パート3 シーン設定時
- 03_copy_stamp_material_end.hip: パート3 終了時
0 件のコメント:
コメントを投稿