【Houdini HDA 講座】#2 ノードを組む際の便利な機能

技術共有
2024-06-06 ツノ

今回の目標

HDA 講座2回目の今回は、ノードを組む際に便利な機能を紹介しながら前回作成した家をもう少し家っぽい形に改造していきます。

今回 House HDA を改造して追加したい機能は以下の2つです。

  • 2階建てなどの複数階の家を作れるようにする
  • 屋根に軒や厚みなどを付けてリアリティを増す

プロジェクトを開く

まずは、前回保存したプロジェクトを開きます。

038.jpg

「.hip」もしくは「.hiplc」「.hipnc」ファイルをダブルクリックして Houdini プロジェクトを開きます。

For-Each ブロック(反復)

複数階の家を作成できるように、 polyextrude SOP で押し出しを行って家の壁を作るところを、複数回連続で実行するようにします。

前回作成した House HDA のdissolve_flat_edges SOP 下に分岐させるようにして「For-Each Number」ブロックを配置します。

dissolve_flat_edges SOP の接続点をクリックし、Tab キーを押して「foreach」と入力し、「For-Each Number」をクリックします。

000.png

※お詫び:今回スクリーンショットの Network View の階層が資料作成中のミスで geo1 > House1 となっていますが、#1 の手順で行うと House > house になっているはずです。

001.png

そして、すでに接続済みの polyextrude を For-Each ブロックの中に入れます。(ドラッグアンドドロップ可能)

003.gif

この、「For-Each」ブロックは、反復操作に用います。

例えば、今回の For-Each Number ブロックはオレンジ色のブロックの中(foreach_begin と foreach_end ブロックの間)にあるノードを指定した回数繰り返します。

動作させるにはもう少し準備が必要なので進めて行きます。

For-Each ブロックの上に group SOP をつなぎます。

004.png

そして、 polyextrude SOP の「Front Group」の名前(extrudeFront)をコピーし、polyexturde SOP の Group と、group SOP の group にコピーします。

005.gif

次に、foreach_end SOP の GatherMethod を「Feedback Each Iteration」に変更し、foreach_begin SOP の Method を「Fetch Feedback」に変更します。

006.gif

ここで、 foreach_end に表示フラグをつける(右端の部分をクリックし、青色にする)と、家が高層ビルみたいな感じになります。(笑)

007.jpg

For-Each は反復を行うブロックで、今回は polyextrude SOP で extrudeFrout グループの Primitive 押し出すという操作を何度も反復させました。

※For-Each ブロックの前に group SOP を挟んだのは、反復の1回目では Primitive に exturudeFront グループが指定されていないため指定する必要があるからです。

For-Each ブロックは設定によりどのように反復を行うかを色々設定できます。

今回はシンプルに同じ操作を繰り返すために使用しましたが、それぞれの Primitive や Point に対して同じ操作を行ったりすることもできます。

高層ビルのようになってしまっているので、 foreach_end ノードの Iteration を 2 に設定し、反復の回数を2回にします。

008.jpg

ノードをつなぎなおし、屋根を生成できるようにします。

009.gif

これで、 foreach_end ブロックの Iteration を変更するだけで家の階数を変えることができるようになりました。

ノードの整列

010.gif

ノードを整列するには以下のように操作をします。

  1. 整列したいノードを複数選択
  2. 基準にしたいノードの上にマウスを移動
  3. 「A」キーを長押ししながら整列したい方向に(ある程度勢いよく)ドラッグ

011.gif

屋根に軒を作る

屋根に軒を作るために屋根を作る前に天井部の大きさを拡張します。

foreach_end ノードのあとに Poly Expand SOP を分岐させるように接続します。

012.png

配置した Poly Expand SOP のパラメータを画像のように変更します。

013.png

すると、画像のように天井部が拡張されます。

014.png

元々配置してあった Poly Expand 2D SOP に新しく配置した Poly Expand 2D SOP をつなぎ、元々配置してあった Poly Expand SOP のパラメータを画像のように変更します。

015.png

そして Output ノード(最後のノード)の表示フラグをつけると、モデルが画像のような状態になります。

016.png

次に屋根に厚みをつけるため、最後から3つ目の attribwrangle ノードに Poly Extrude SOP を接続します。

そして以下のようにパラメータを設定します。

  • Group を inside
  • Distance を 0.1

017.png

Poly Extrude SOP に表示フラグをつけると、画像のように屋根の上の部分が破綻してしまっているのが分かります。

018.png

これは、先ほどの元々配置されていた Poly Expand 2D SOP で屋根の棟を形作った際に、棟の部分のポイントが接合されていない(重なっているだけになっている)のが原因です。

先ほど配置した Poly Extrude SOP の前に Fuse SOP を差し込むと、屋根の破綻が治ることが分かります。

Fuse SOP は近くにあるポイント同士を結合するノードです。

019.png

ここで一度ノードをつなぎなおし、ノードを整列しておきましょう。

020.gif

Spare Input

ここで、屋根が浮いてしまっている問題が発生しているのでこれを解決します。

屋根を下に移動させればよいのですが、移動させる距離を計算する必要があります。

三角関数を利用して計算することもできます(そちらの方がおそらく動作が軽量です)が、今回は Houdini ならではの方法で解決してみましょう。

ひとまず、屋根の裏側を閉じるために Poly Extrude SOP の Output Back を有効にします。

022.png

次に、屋根を移動させる距離を計算するためのノードを組んでいきます。

For-Each ブロックの下に Delete SOP をつなぎ、パラメータを画像の通りに変更します。

022-2.png

すると、天井部分だけが抽出できます。

022-3.png

その次に、 Rest SOP をつなぎます。

023.png

Rest SOP はジオメトリスプレッドシートをみると画像のように、ポイントの rest アトリビュートの中に現在の位置を記録してくれます。

(単にアトリビュートを別名でコピーしているだけなので、 point wrangle で v@rest = v@P としても同じです。)

次に Ray SOP を追加します。

Ray SOP には入力が 2 つあるのですが、左の入力( Input 0 )には rest ノードを、右の入力( Input 1 )には Poly Extrude SOP をつなぎます。

024.png

そして、パラメータを以下の画像の手順で変更します。

Direction from を「Vector」に、 Ray Direction を「0, 1, 0」(上向き)に変更するのですが、デフォルトで Ray Direction にエクスプレッションが入力されている(入力欄が緑色になっている)のでパラメータを右クリックして「Delete Channels」を選択し、一度エクスプレッションを無効にする必要があります。

025.gif

すると、画像のように天井部分が屋根の裏側に張り付きました。

026.gif

Ray SOP は左の入力の各ポイントを右入力の Primitive に一定の方向で投影するノードです。

簡単に言うとぶつかるまで進ませて貼り付けるという感じです。

そして、この際にどれだけ進んだかを記録することで、壁と屋根の隙間の大きさを測ることができます。

Point Wrangle SOP をつなぎ、次の VEX を入力します。

f@y_diff = v@P.y - v@rest.y;

025-2.png

すると、ジオメトリスプレッドに y_diff アトリビュートが現れ、距離を測ることが出来たことが分かります。

この距離を使って、屋根を下におろします。

Poly Extrude SOP の下に分岐させるように Transform SOP をつなぎます。

026_2.png

そして、画像のように操作を行い「Spare Input」を追加し、先ほどの attribwrangle ノードを接続します。

027.gif

Spare Input とは本来接続できないノードを入力を増やすことで接続できるようにする機能です。

これにより、 Transform SOP から attribwrangle SOP にアクセスできるようになります。

接続されると、紫の点線が表示されます。

屋根だけを動かすために屋根にグループを設定します。

Poly Exrtrude SOP パラメータを画像のように変更します。

028.png

そして、 Transform SOP のパラメータを画像のように変更します。

029.png

Translate の y に-point(-1, 0, "y_diff", 0)と入力すると、入力欄が緑色になり、エクスプレッション(式)が入力されたことが認識されます。

エクスプレッションについては今後もう少し詳しく解説します。

※Translate パラメータをクリックすると、実際の値を見ることもできます。

029-2.png

ノードを画像のようにつなぎなおし、Output の表示フラグを有効にします。

030.gif

屋根の隙間が無事になくなって、今回の目標が達成できました。

031.jpg

ノードの整理

ノードが増えてきたので、ここで一度ノードを整理します。

まず、 wrangle ノードはどういった処理を行ったのかが分かりやすいように、名前を変更しておきます。

上から順番に適当な名前を付けておきましょう。

今回は上から順番に、「distance」「lift_ridge」「y_diff」としました。

032.png 033.png 034.png

また、どのあたりでどういった処理をしているかが分かりやすいように整理を行います。

画像の手順でノードに色を付けます。

035.gif

そして、次の画像の手順で適当な名前を付けておきましょう。

Sticky Note (付箋)の機能を利用しています。

036.gif

Stickey Note を整列するには、整列したい付箋をすべて選択し、 Network View の上部メニューから Layout > Align Node Vertically をクリックします。

これで整理完了です。

aaa.gif

このように整理を行っておくと、今後この HDA を改良していく際にも分かりやすくて便利です。

037.png

保存

今回はここで終了です。

まずは、 HDA を保存します。

HDA を右クリックし、 Save Node Type をクリックします。

038.gif

次に、Ctrl + S キーでプロジェクトを保存します。

これで、 .hip と .hda がどちらも最新の状態で保存されました。

今回はここで終了です。

お疲れ様でした。