トランジスタスタジオ・秋元純一氏によるHoudini連載「Houdini Cook Book」がリニューアル! Houdiniをより基礎の部分から解説し、最後にはふり返りとして課題も用意しています。第2回はClip SOPとForを組み合わせたスライスのアプローチについて解説します。
![](/regular/8a64659568f9ff41a33690ef58f8a25d51c0644b.jpg)
![](/regular/26ca9f3e1c9745e7fedf82daffb6f976cd7e7cbd.jpg)
秋元純一 / Junichi Akimoto
株式会社トランジスタ・スタジオ/取締役副社長
2006年に株式会社トランジスタ・スタジオ入社。日本でも指折りのHoudiniアーティスト。手がけてきた作品は数々の賞を受賞している
Clip SOPを核としたスライス
今回のテーマは、「Clip SOPをメインに据えた、スライスの方法」です。
Clip SOPは、大昔からHoudiniではお馴染みのツールのひとつですが、筆者もかなり大好きなツールとして、非常によく使用します。単純に原点と方向を指定して、距離に応じてカット(クリップとも言う)するだけの、非常にシンプルなツールではありますが、そこをHoudiniならではのアプローチに組み込むことで、非常に複雑な結果を得ることが可能になります。
Polygonに特殊な構造やエラーがない場合、かなりの高確率で複雑なPolygonを高速にカットできるため、強引なアプローチを取ることも厭わず、使い勝手が非常に良いです。考え方次第で、使い道は多岐に渡って広がります。
今回は、まっすぐしかカットできないClipの特性を利用して、複雑なプロシージャルモデリングを組んでいきます。また、前回に引き続き、ForとCompileも駆使して、さらに高速化と自動化を図った構造にしてみたいと思います。
今回も、プロジェクトデータを以下からダウンロードして、開いた状態で読み進めるのがオススメです。
01 Main Flow / 全体のながれ
今回の作例のフローは以下のようになります。
![](/regular/images/hcbe/002/bb4c7df5148e8613410ae767a11327286144f6f0.png)
STEP 01
下準備として、スライスしたベースのジオメトリを用意します。今回は、スキャンモデルでテストしたので、PolyReduce SOP【A】である程度軽くしてから使用しています(配布用のサンプルシーンには含まれていません)【1】。
![](/regular/images/hcbe/002/581ded17f13ed4cacc79b4f6dfc7f559e4290c9a.png)
![](/regular/images/hcbe/002/519d9adcc54b9e3aa060b8b4ae55ef165a34a7a9.png)
STEP 02
まず、ベースのジオメトリに対して、Rest Position SOP【B】を使って、現在のPointの座標値を"rest"へ格納しておきます。次に、スライスしたい方向を、Transform SOP【C】で任意に設定します。これは、Clip SOPが一方向への距離でクリップする仕様なので、それに準拠するためです【2】。
![](/regular/images/hcbe/002/61b702fce699b11366e95dd063448863780449c5.png)
![](/regular/images/hcbe/002/bfc1755f1543f95153ca88b86d90f11a0e2f551c.png)
そのジオメトリに対して、Attribute Noise SOP【D】を使って、Pointの座標値にNoiseを加算します。
この手順が今回のコアになるもので、Clip SOPは必ず直線でしかカットできないため、もともとのジオメトリ自体を歪めておき、後々元の位置に戻すことで、仮想的に空間を歪めているような状況をつくり出します【3】。これに対して、Transform SOP【E】で、TYに対し‐$YMINを入れて、Y軸の0位置から下に出ないように調整しておきます。
![](/regular/images/hcbe/002/ce6eda85a1088ba4f23567a68c0ec53baa2d5aaa.png)
![](/regular/images/hcbe/002/6e4b3f4c0cc5e9025f88d3ee2b86a3f015a46ab7.png)
STEP 03
次に、Attribute VOP【F】を使って、Forのための計算を行います。これは敢えてVOPを使う必要もないのですが、今回はわかりやすく図解できるように、VOPを使って計算しています。
![](/regular/images/hcbe/002/9a13850f75adb6c1d3c01ff64ee714e4e09ebc56.png)
まず、VOP内でBounding Box【G】を使って、MinとMaxの値からComponent2にあたるYの値を抜き出し、その絶対値を加算します。そうすることで、Yの長さの最大値が算出されます。
次に、スライスの幅を設定できるParameterを作成し、Yの最大値に対して除算をして、何分割になるかを算出します。この値をFloorで丸めて整数値にします。それをAdd Attribute【H】でDetailのAttributeへ追加します。これでスライスの下準備が整いました。
![](/regular/images/hcbe/002/1e54f8e798d5201d4228455e13a7e8952172c244.png)
STEP 04
Forを行う前に、あらかじめCompile【I】で囲える準備をしてしまいましょう。
通常は、ある程度Forでテストをして問題がなければ高速化を図るためのブラッシュアップをするべきです。ここはそのようにアプローチの優先順位を覚えておく必要があります。ただ、今回は既にわかっている手順なので問題ないとします。
![](/regular/images/hcbe/002/45872692e8320c85d7430aee48433b3c5100d2ae.png)
STEP 05
For Each Number【J】を使って、FetchしたInput【4】に対して、Count【5】で最終的にMerge【6】する方法のForです。
このとき、Countは、VOPで算出したdetailの数値を使用します【7】。これによって、値を変更しても自動的にForのCountをアップデートできます。
ただしこれの注意点としては、値の変更によって、ForのIteration数がとてつもなく巨大になる可能性もはらんでいるため、その旨を理解しておく必要があります。心配であれば、Max Iterationなどの数値を設定して、自分のマシンの限界を加味しておくと良いでしょう。
また、Compileを使用するので、Multithread when Compile【8】にチェックをするのも忘れずに。
![](/regular/images/hcbe/002/448b2ee5e05fea4a99740eeefc0a3f152ff1cf85.png)
![](/regular/images/hcbe/002/b4b073231df071aa8275a6ee4a1acae24b8ea593.png)
![](/regular/images/hcbe/002/2598f63e1ec90cba00c66f741eb76487a204c7e4.png)
STEP 06
Forの内部には、まずClip SOP【K】を配置します。
![](/regular/images/hcbe/002/399429925164c763e929fb93dcf8c56d90e1fd54.png)
今回の要であるClip SOPですが、やれることが限られているノードですので、設定は単純なもので、Iterationを重ねるごとにスライスする幅を増やして行くだけです【9】。これによって、Forで順番にスライス幅の増えたジオメトリが生成されていくはずです。
IterationはSpare Inputで設定したMeta Dataから取得します【10】。
![](/regular/images/hcbe/002/1ba08c13cf5a993ebaf2a6f543e92d95099c2e4e.png)
STEP 07
このスライスされたジオメトリに対して、Divide SOP【L】のRemove Shared Edges【11】を使って、断面だけを抜き出します。これも筆者が大好きな機能です。
![](/regular/images/hcbe/002/7129e10fa4bea4a93fdfc0012a4c47e723c4b546.png)
![](/regular/images/hcbe/002/9e05635664c72330a7cf1f6d71f38436053487cc.png)
ここまでで、まっすぐカットされた面が生成されているはずです【12】。
![](/regular/images/hcbe/002/8bbe012b79f2e4f4eac65f7ba3843172db2966af.png)
STEP 08
このジオメトリに、Wrangle【M】を使って、”P”に対して"rest"を代入します【13】。これによって、元の座標値に戻ります。
![](/regular/images/hcbe/002/393348b0b2c228409f08938e45454119a23b9509.png)
![](/regular/images/hcbe/002/6ffb24db22041192703e8f7cff9f460b73d8d7a1.png)
STEP 09
次に、このときに作成されたEdgeのPointを、Resample SOP【N】を使って、均一に並べます。これは必要に応じてで構いません。
![](/regular/images/hcbe002/75e4312855efbdd0f855e04798c464d983d3c2e0.png)
これを計算すると、まっすぐにだけカットする愚直なClip SOPの結果が、面白いようにうねったものになっているはずです【14】。
![](/regular/images/hcbe/002/4e78892a38bd177e0dcdd4c9522416f6c192fda8.png)
最終的にPolyWire SOP【O】などでPolygonのメッシュを生成してもいいですが、場合によっては重くなるので、慎重なセッティングが必要だと思います【15】。
![](/regular/images/hcbe/002/5f1ded96bf246e3b7f3f94b4c45401e0fc0ce357.png)
![](/regular/images/hcbe/002/c930b29ba976f3029f31977ad39c1fff1312eda3.png)
また、Noiseの具合を調整すれば、うねりを柔らかくしたり【16】、細かい歪みをつくったりすることも簡単にできます【17】。
![](/regular/images/hcbe/002/02beb469910d0c4731cf7c181ffe26600f9cac5b.png)
![](/regular/images/hcbe/002/42b1b14e2c6190853c4e03722319473bd3f00c5e.png)
02 Hints / 制作に役立つヒント
SideFX Labs
![](/regular/images/hcbe/002/bc6293246a9502e9d8fc3eb5d14f6f08a60020be.png)
Houdiniは、あらかじめ用意されている機能すら把握できないことがほとんどと言っていいくらい、その機能は多岐に渡ります。そんななか、さらなる拡張機能として配布されているのがSideFX Labsです。
まだ開発段階のものもありますが、非常に便利な機能が満載で、言ってみれば、公式のアドオン、プラグインと言っていいと思います。これをインストールしておくことは非常にオススメです。
テクニカルスタッフがいない状態でHoudiniを拡張するのは至難の技ですから、特にフリーでHoudiniを使用している方や学生の方にはうってつけの機能と言えます。もちろん、大規模スタジオでも使用する価値のある拡張機能です。ただ、パイプラインに気を付ける必要があるのも事実で、微妙なバージョンのちがいなどで、思わぬエラーが発生する可能性もあるため注意は必要です。
今回の工程でも、キャプチャする際にわかりやすく可視化するために部分的に利用した機能もあります。痒いところに手が届く機能も満載ですので、ぜひ一度試してみてください。特にHDAで組まれていることがほとんどですので、そのアプローチはかなり勉強になると思います。
CurveのVisualization
今回のように、大量のラインが重なるように配置されていたりする場合、その結果が見えにくいことがあります。そういったときに直感的に結果を把握できるようにしておくことは、しくみをつくる上でないがしろにされがちですが、実はプライオリティが非常に高いと考えます。
いくらしくみが素晴らしくても、最終的に調整しにくいアセットであれば、時間ばかりかかってしまいます。そういう細かな自分への配慮も含めて、スマートなフローだと言えるでしょう。今回は、通常のラインの場合、コンスタントな色で非常に見えにくいです【1】。
![](/regular/images/hcbe/002/13b3e32fa100ba4e21378cf50b6fe057a306c7e4.png)
そんなときに、ベースのジオメトリに対して、Labsの、OcclusionをPoint Colorとして作成できるノード【A】を使って、ベースのジオメトリに立体感をもたせます【2】。
![](/regular/images/hcbe/002/120c5048d8a879f759ff436173ea13d2e0a80880.png)
![](/regular/images/hcbe/002/89af605b2dc2c13554195ba2559be44df2562fa6.png)
それをAttribute Transfer SOPでラインに移してあげれば、非常に見やすい状態をつくり出すことができます【3】。
他にも様々なVisualizationの方法はありますが、今回のような少しトリッキーな確認方法なども、引き出しにそっとしまっておくと便利ですよ。
![](/regular/images/hcbe/002/b600667a15015d677af081955884fd9e87f2e6f2.png)
03 Issues / 今回の課題
Issue 01:サイズのマッチング / Modeling ★☆☆☆☆
別のジオメトリとサイズをマッチさせてみましょう。
![](/regular/images/hcbe/002/Issue01.gif)
Issue 02:Boxを転がそう / Animation ★★☆☆☆
Boxが転がる様子を簡易的にTransform SOPで表現してみましょう。
![](/regular/images/hcbe/002/Issue02.gif)
Issue 03:Boxをちゃんと転がそう / Animation ★★★☆☆
擬似的に転がすのではなく、ちゃんと辺の長さに合わせて転がす計算をしてみましょう。ちゃんと計算をすれば、立方体だけではなく、直方体にも対応できるはずです。
![](/regular/images/hcbe/002/Issue03.gif)
Issue 04:出現エフェクトを作ろう / Modeling ★★☆☆☆
今回のテーマを理解できていれば、応用的な表現も可能になります。 徐々に出現してくるような表現を作ってみましょう。
![](/regular/images/hcbe/002/Issue04.gif)
こちらの制作例は、今回のプロジェクトデータ内に用意しています。ひととおり制作できたら、ぜひ確認してみてください。
今回のプロジェクトデータはこちらから>>TEXT_秋元純一 / Junichi Akimoto
EDIT_小村仁美 / Hitomi Komura(CGWORLD)