今回は、Vellumを用いて、花びらのシミュレーションを制作します。
Information
![](/regular/images/hcb/FgtTm1zUYAMskMl.jpeg)
「HOUDINI COOK BOOK +」
CGWORLD Online Tutorialsは、これからHoudiniを学習しようとしている方に向けて「Houdini COOKBOOK +Academy」を改訂しHoudini 19.5をベースとしたオンライン講座「HOUDINI COOK BOOK +」をリリースしました。
![](/regular/8a64659568f9ff41a33690ef58f8a25d51c0644b.jpg)
DOP Networkを用いたVellumのアプローチ
今回は、Vellumを用いて、花びらのシミュレーションを行いたいと思います。
Vellumは、様々なシチュエーションで用いることができるXPBDベースのシミュレーションで、非常に高速で結果を求めることが可能です。今回はその特性を活かして、柔らかい花びらを大量に発生させるシミュレーションを行います。
場合によってはParticleに対してコピーをして済ませるような場合がほとんどかもしれませんが、Vellumを用いることで、空気抵抗や挙動を簡単にシミュレーションすることが可能になります。また、花びら同士の干渉や重なりなども再現できるので、リアリティのある動きを作り出すことができます。
VellumはSOPベースでもシミュレーション可能なようにオプティマイズされていますが、今回はDOP Networkを用いて、少しアドバンスなセッティングでアプローチをしていきたいと思います。
今回の手法は、花びらだけではなく、様々なシチュエーションで利用可能なものです。特に薄いものの空気抵抗をリアルに再現するにはうってつけです。
01 SOP Flow / SOPのながれ
![](/regular/images/hcb/202303-hcb-129/A01.png)
まず初めに、テクスチャからTrace SOP【A】を用いて、花びらの形状を作成します【1】。このオペレータは、テクスチャの閾値から輪郭を作成することができます。
![](/regular/images/hcb/202303-hcb-129/A02.png)
Texture UV SOP【B】でUVを作成しておきます。Resample SOP【C】で輪郭のPointを整理し、Remesh SOP【D】でPolygonを再計算します【2】。向きや位置を調整して【E】ベースのジオメトリは完了です。
![](/regular/images/hcb/202303-hcb-129/A03.png)
次に、Iterationを指定したFor【F】を使って、ジオメトリのパターンを作成します。まずBend SOP【G】を使って、丸まった形状を作成します【3】。
今回は、正負の方向への曲げをそれぞれ作り、Switch SOP【H】で切り替えています。別の方向へのBend【I】は1方向のみとしました。
![](/regular/images/hcb/202303-hcb-129/A04.png)
Bendのバリエーションは、Meta Data【J】を用いて、参照したいノードをSpare Inputに指定します【4】。回転の値【5】やツイストの値【6】はそれぞれDetail関数から"iteration"を用いて、ランダムな回転数を計算しています。
![](/regular/images/hcb/202303-hcb-129/A05.png)
Noise【K】も同様のバリエーション付けを行います【7】。また、それぞれのIterationに対して、Wrangle【L】を用いてIterationごとに【8】"variance"というAttributeを作成しておきます【9】。これは後にコピーする際に使用します。
発生させたいエリアをSphere等で作成します【M】。これをFogに変換し【N】、そこにScatter SOP【O】でPointを作成します。このときの数がフレームごとに発生する数となります。その際、Random Seedがフレームごとに変わるように設定しておきます。
このPointに対して、Wrangle【P】を用いてPointにランダムな"variance"の値を作成します【10】。ランダムの幅は、【F】のForのIterationの回数に準じた数値にします【11】。
![](/regular/images/hcb/202303-hcb-129/A08.png)
このPointに対して、Attribute Random SOP【Q】を使って、"pscale"を作成します【12】。Dimensionsは1で、最小値と最大値を指定します【13】。”N"も同様に作成します【R】。
![](/regular/images/hcb/202303-hcb-129/A09.png)
次にPointに対してジオメトリをCopyします【S】。このとき、Piece Attribute【14】は"variance"を指定します。これで、ランダムにジオメトリを選択することができます【15】。
![](/regular/images/hcb/202303-hcb-129/A13.png)
![](/regular/images/hcb/202303-hcb-129/A10.png)
最後に、コピーしたジオメトリをVellum Constraint SOP【T】を用いて変換します。今回はClothを用いました【16】。
重要なセッティングポイントとして、Dragがあります。Normal Drag【17】は高い数値にすることで、法線方向への抵抗を強くします。Tangent Drag【18】は弱くて構いません。こうすることで、花びらが自然とヒラヒラ舞ってくれます【19】。
![](/regular/images/hcb/202303-hcb-129/A11.png)
![](/regular/images/hcb/202303-hcb-129/A12.png)
最後に、必要に応じてコリジョン用のジオメトリを用意します【U】。また、シミュレーションの高速化を図るため、PolygonはPolyReduce【V】で軽量化しています。
02 Simulation Flow / シミュレーションフローの解説
![](/regular/images/hcb/202303-hcb-129/B01.png)
今回のVellumのシミュレーションはVellum Solver SOPを用いず、DOP Network【A】を作成して行います。 シミュレーション後は、Dop Import SOP【B】でVellumのジオメトリをインポートし、キャッシュを取って完了です【C】。
![](/regular/images/hcb/202303-hcb-129/B02.png)
DOPのフローを解説します。まず、Vellum Object【A】を作成し、Vellum Solver【E】へ接続します。
次に、Vellum Source【F】を作成し、Emission Type【1】をEach Frameにして、毎フレーム発生させます。SOP PathとTarget Path【2】はSOPで作成したVellumのジオメトリを設定し、Constraint SOP Path【3】はVellumのConstraintのジオメトリを選択します。
![](/regular/images/hcb/202303-hcb-129/B04.png)
次に、SOP Network【G】を作成します。その内部で、Dop Import SOP【H】を使い、Vellum ObjectからジオメトリをFetchします。Vellum Post Process SOP【I】で厚みを付け【4】、VDB from Polygon SOP【J】でSDFへ変換します。また、Bound SOP【K】でVellum Objectのバウンディングボックスを作成しておきます。
![](/regular/images/hcb/202303-hcb-129/B03.png)
![](/regular/images/hcb/202303-hcb-129/B05.png)
次にGround Plane【L】で地面を作成し、Static Object【M】でコリジョンを設定します。
また、Static Object【N】を使って【G】のSOP Networkからジオメトリを読み込み【5】、Defroming Geometry【6】として設定し、コリジョンはVolumeのModeにします【7】。
Proxy VolumeはSOP Network【8】のSDFを指定します。これで、Vellum ObjectがSDFとして認識できます。Static Solver【O】も併せて作成します。
![](/regular/images/hcb/202303-hcb-129/B06.png)
次に、Smoke Object【P】を作成し、Sizeを環境に合わせて調整しておきます。Smoke Solver【Q】も作成し、Gas Resize Fluid Dynamic【R】を用いて、SOP Network【G】のバウンディングボックスにてサイズがリサイズされるように設定します【9】。
![](/regular/images/hcb/202303-hcb-129/B07.png)
最後に、VellumのForceを作成します。POP Drag【S】で全体の抵抗を作成し、POP Advect By Volume【T】で、Smoke Objectで作成したVelocityのDataを直接指定します【10】。ForceをFieldからアップデートします【11】。
POP Force【U】を用いて風やNoiseを追加し、Gravity【V】で重力を追加して完了です【12】。
![](/regular/images/hcb/202303-hcb-129/B08.png)
![](/regular/images/hcb/202303-hcb-129/B09.png)
今回のシミュレーションには、空気抵抗をSmokeのVelocityを用いて計算しています【13】。花びらなのであまり効果としてはわかりにくいですが、他のシチュエーションでは、非常に強力な効果をもたらすと思います。
![](/regular/images/hcb/202303-hcb-129/B10.png)
03 Operator / 今月のオペレータ
●Trace SOP
![](/regular/images/hcb/202303-hcb-129/C01.png)
今回のオペレータはTrace SOPを紹介したいと思います。少々本線からは外れていますが、非常に面白いノードのひとつで、他では味わえないトリッキーな結果を得ることができます。
画像の閾値でPolygonの輪郭を作成することができ、使い方次第ではかなり面白いことができます。かなり歴史のあるノードのひとつではありますが、筆者も非常に好きなノードで、困ったときのお助けツールとしても役立ちます。
例えば、今回のように綺麗に輪郭を抜き出すだけではなく、シーケンス画像から動きのあるジオメトリを自動的に作り出すことも可能です。準備する画像次第では、その後平面から変形を加えて奥行きを付けることも、Houdiniであればまったく問題がなく、例えばAfter Effectsなどと組み合わせて、トリッキーな演出やエフェクティブなモーショングラフィックを作ることもできます。
非常にシンプルですが、他では見られない機能なので、ぜひ使ってみてください。
![](/regular/images/hcb/akimoto_photo_w300x300.jpg)
秋元純一 / Junichi Akimoto
株式会社トランジスタ・スタジオ/取締役副社長
2006年に株式会社トランジスタ・スタジオ入社。日本でも指折りのHoudiniアーティスト。手がけてきた作品は数々の賞を受賞している
TEXT_秋元純一 / Junichi Akimoto
EDIT_小村仁美 / Hitomi Komura(CGWORLD)