HDA 講座2回目の今回は、ノードを組む際に便利な機能を紹介しながら前回作成した家をもう少し家っぽい形に改造していきます。
今回 House HDA を改造して追加したい機能は以下の2つです。
まずは、前回保存したプロジェクトを開きます。
「.hip」もしくは「.hiplc」「.hipnc」ファイルをダブルクリックして Houdini プロジェクトを開きます。
複数階の家を作成できるように、 polyextrude SOP で押し出しを行って家の壁を作るところを、複数回連続で実行するようにします。
前回作成した House HDA のdissolve_flat_edges SOP 下に分岐させるようにして「For-Each Number」ブロックを配置します。
dissolve_flat_edges SOP の接続点をクリックし、Tab キーを押して「foreach」と入力し、「For-Each Number」をクリックします。
※お詫び:今回スクリーンショットの Network View の階層が資料作成中のミスで geo1 > House1 となっていますが、#1 の手順で行うと House > house になっているはずです。
そして、すでに接続済みの polyextrude を For-Each ブロックの中に入れます。(ドラッグアンドドロップ可能)
この、「For-Each」ブロックは、反復操作に用います。
例えば、今回の For-Each Number ブロックはオレンジ色のブロックの中(foreach_begin と foreach_end ブロックの間)にあるノードを指定した回数繰り返します。
動作させるにはもう少し準備が必要なので進めて行きます。
For-Each ブロックの上に group SOP をつなぎます。
そして、 polyextrude SOP の「Front Group」の名前(extrudeFront)をコピーし、polyexturde SOP の Group と、group SOP の group にコピーします。
次に、foreach_end SOP の GatherMethod を「Feedback Each Iteration」に変更し、foreach_begin SOP の Method を「Fetch Feedback」に変更します。
ここで、 foreach_end に表示フラグをつける(右端の部分をクリックし、青色にする)と、家が高層ビルみたいな感じになります。(笑)
For-Each は反復を行うブロックで、今回は polyextrude SOP で extrudeFrout グループの Primitive 押し出すという操作を何度も反復させました。
※For-Each ブロックの前に group SOP を挟んだのは、反復の1回目では Primitive に exturudeFront グループが指定されていないため指定する必要があるからです。
For-Each ブロックは設定によりどのように反復を行うかを色々設定できます。
今回はシンプルに同じ操作を繰り返すために使用しましたが、それぞれの Primitive や Point に対して同じ操作を行ったりすることもできます。
高層ビルのようになってしまっているので、 foreach_end ノードの Iteration を 2 に設定し、反復の回数を2回にします。
ノードをつなぎなおし、屋根を生成できるようにします。
これで、 foreach_end ブロックの Iteration を変更するだけで家の階数を変えることができるようになりました。
ノードを整列するには以下のように操作をします。
屋根に軒を作るために屋根を作る前に天井部の大きさを拡張します。
foreach_end ノードのあとに Poly Expand SOP を分岐させるように接続します。
配置した Poly Expand SOP のパラメータを画像のように変更します。
すると、画像のように天井部が拡張されます。
元々配置してあった Poly Expand 2D SOP に新しく配置した Poly Expand 2D SOP をつなぎ、元々配置してあった Poly Expand SOP のパラメータを画像のように変更します。
そして Output ノード(最後のノード)の表示フラグをつけると、モデルが画像のような状態になります。
次に屋根に厚みをつけるため、最後から3つ目の attribwrangle ノードに Poly Extrude SOP を接続します。
そして以下のようにパラメータを設定します。
Poly Extrude SOP に表示フラグをつけると、画像のように屋根の上の部分が破綻してしまっているのが分かります。
これは、先ほどの元々配置されていた Poly Expand 2D SOP で屋根の棟を形作った際に、棟の部分のポイントが接合されていない(重なっているだけになっている)のが原因です。
先ほど配置した Poly Extrude SOP の前に Fuse SOP を差し込むと、屋根の破綻が治ることが分かります。
Fuse SOP は近くにあるポイント同士を結合するノードです。
ここで一度ノードをつなぎなおし、ノードを整列しておきましょう。
ここで、屋根が浮いてしまっている問題が発生しているのでこれを解決します。
屋根を下に移動させればよいのですが、移動させる距離を計算する必要があります。
三角関数を利用して計算することもできます(そちらの方がおそらく動作が軽量です)が、今回は Houdini ならではの方法で解決してみましょう。
ひとまず、屋根の裏側を閉じるために Poly Extrude SOP の Output Back を有効にします。
次に、屋根を移動させる距離を計算するためのノードを組んでいきます。
For-Each ブロックの下に Delete SOP をつなぎ、パラメータを画像の通りに変更します。
すると、天井部分だけが抽出できます。
その次に、 Rest SOP をつなぎます。
Rest SOP はジオメトリスプレッドシートをみると画像のように、ポイントの rest アトリビュートの中に現在の位置を記録してくれます。
(単にアトリビュートを別名でコピーしているだけなので、 point wrangle で v@rest = v@P
としても同じです。)
次に Ray SOP を追加します。
Ray SOP には入力が 2 つあるのですが、左の入力( Input 0 )には rest ノードを、右の入力( Input 1 )には Poly Extrude SOP をつなぎます。
そして、パラメータを以下の画像の手順で変更します。
Direction from を「Vector」に、 Ray Direction を「0, 1, 0」(上向き)に変更するのですが、デフォルトで Ray Direction にエクスプレッションが入力されている(入力欄が緑色になっている)のでパラメータを右クリックして「Delete Channels」を選択し、一度エクスプレッションを無効にする必要があります。
すると、画像のように天井部分が屋根の裏側に張り付きました。
Ray SOP は左の入力の各ポイントを右入力の Primitive に一定の方向で投影するノードです。
簡単に言うとぶつかるまで進ませて貼り付けるという感じです。
そして、この際にどれだけ進んだかを記録することで、壁と屋根の隙間の大きさを測ることができます。
Point Wrangle SOP をつなぎ、次の VEX を入力します。
f@y_diff = v@P.y - v@rest.y;
すると、ジオメトリスプレッドに y_diff アトリビュートが現れ、距離を測ることが出来たことが分かります。
この距離を使って、屋根を下におろします。
Poly Extrude SOP の下に分岐させるように Transform SOP をつなぎます。
そして、画像のように操作を行い「Spare Input」を追加し、先ほどの attribwrangle ノードを接続します。
Spare Input とは本来接続できないノードを入力を増やすことで接続できるようにする機能です。
これにより、 Transform SOP から attribwrangle SOP にアクセスできるようになります。
接続されると、紫の点線が表示されます。
屋根だけを動かすために屋根にグループを設定します。
Poly Exrtrude SOP パラメータを画像のように変更します。
そして、 Transform SOP のパラメータを画像のように変更します。
Translate の y に-point(-1, 0, "y_diff", 0)
と入力すると、入力欄が緑色になり、エクスプレッション(式)が入力されたことが認識されます。
エクスプレッションについては今後もう少し詳しく解説します。
※Translate パラメータをクリックすると、実際の値を見ることもできます。
ノードを画像のようにつなぎなおし、Output の表示フラグを有効にします。
屋根の隙間が無事になくなって、今回の目標が達成できました。
ノードが増えてきたので、ここで一度ノードを整理します。
まず、 wrangle ノードはどういった処理を行ったのかが分かりやすいように、名前を変更しておきます。
上から順番に適当な名前を付けておきましょう。
今回は上から順番に、「distance」「lift_ridge」「y_diff」としました。
また、どのあたりでどういった処理をしているかが分かりやすいように整理を行います。
画像の手順でノードに色を付けます。
そして、次の画像の手順で適当な名前を付けておきましょう。
Sticky Note (付箋)の機能を利用しています。
Stickey Note を整列するには、整列したい付箋をすべて選択し、 Network View の上部メニューから Layout > Align Node Vertically をクリックします。
これで整理完了です。
このように整理を行っておくと、今後この HDA を改良していく際にも分かりやすくて便利です。
今回はここで終了です。
まずは、 HDA を保存します。
HDA を右クリックし、 Save Node Type をクリックします。
次に、Ctrl + S キーでプロジェクトを保存します。
これで、 .hip と .hda がどちらも最新の状態で保存されました。
今回はここで終了です。
お疲れ様でした。