トランジスタスタジオ・秋元純一氏によるHoudini連載「Houdini Cook Book Entry」。Houdiniをより基礎の部分から解説し、最後にはふり返りとして課題も用意しています。第8回はForceのカスタマイズについて解説します。


秋元純一 / Junichi Akimoto
株式会社トランジスタ・スタジオ/取締役副社長
2006年に株式会社トランジスタ・スタジオ入社。日本でも指折りのHoudiniアーティスト。手がけてきた作品は数々の賞を受賞している
カスタムForceで独自のParticleシミュレーションを作成
今回もParticleのシミュレーションについて解説していきますが、特にフォーカスを当てたいのはForceのコントロールです。Particleの動きは、主にVelocityの更新によって決まります。このVelocityを更新する方法としては、Velocity自体を直接コントロールするか、またはForceを使ってコントロールする方法が一般的です。
Houdiniには、あらかじめ多数のForceが用意されており、これらを利用することで多くの表現が可能になります。ただし、既存のForceだけでは、表現に制約があったり、コントロールが難しかったりする場合もあります。そのような場合、自分に合ったアプローチを実現するために、カスタマイズされたForceを作成することがHoudiniの強みです。特に、カスタムForceを作成することで、より精密なコントロールが可能になります。
今回は、SOPとPOPを組み合わせて、新たなカスタムForceを活用し、独自の動きをもつParticleシミュレーションを作成していきたいと思います。
01 All Flow / 全体のながれ

STEP 01
まず始めにベースとなるジオメトリをインポートします【A】【1】。
このジオメトリに対して、VDB from Polygons SOP【B】を使ってSDFに変換します。またこのとき、Exterior Band Voxelsを広めに設定しておきます【2】。これは後にForceとして使用する際に判定する範囲を広く取りたいためなので、適宜調整してください【3】。

このSDFをVDB Analysis SOP【C】を使用してScalarからVectorへ変換し【4】、カスタムな名称に変更します【5】。これにより、Surfaceに向いたベクトルを作成することができます【6】。

STEP 02
続いて、ベースのジオメトリに対して、VOP【D】を使ってAttributeを作成します。Noiseを2種類使用して【E】、Particleが発生する際のエリア【7】と、ForceをブレンドするためのAttribute【8】を作成します。
STEP 03
次に、DOP Network【F】を作成して、POPのフローを組んでいきます。このとき、POP Networkで作成すれば、あらかじめPOPの下準備がされたDOP Networkを作成することが可能です。

POP Object DOP【G】とPOP Solver DOP【H】を作成して、シミュレーションの準備をします。POP Source DOP【I】を作成し、SOPで作成したSourceを選択します。
次に、Emission AttributeにSOPで作成したAttributeを設定します。これにより、Noiseで作成した情報を基にParticleを発生させることができます。 必要に応じて、Groundplane DOPとStatic Solver DOP【J】を組み込み、床の衝突を追加します。
続いて、大きな動きを作成するForceを追加します。
POP Axis Force DOP【K】を作成します。このForceは、設定したエリアと軸に対して、回転を追加するForceになります。その後、POP Force DOP【L】を追加し、Noiseを追加します。それに対して、激しい動きを抑えるために、POP Drag POP【M】を追加します。

最後に、カスタムメイドのForceを作成します。POP VOP【N】を使って、SOPで作成したSDFのFieldを読み込み【9】、それを利用したForceを作成します。


VOPの内部では、Volume Sample VOP【O】とVolume Sample Vector VOP【P】を使用します。SDFのScalarではSurfaceからの距離を取得します。VectorからはSurfaceに対しての向きを取得します。
Surfaceの距離をFit Range VOP【Q】でコントロールしていきます。最終的には、発生時にもって生まれたAttributeを読み込み【R】、VelocityとMix【S】をしてSurfaceに吸い付くようなForceとしてコントロールします【10】。

STEP 04
シミュレーションのセットアップが完了したら、DOP Import Field SOP【T】を使って、Particleをインポートします。これに、File Cache SOP【U】を使ってキャッシュをとります。

キャッシュを取ったParticleに対して、レンダリング用のAttributeを作成するためのVOP【V】を、サンプルとして作成してあります。このVOPでは"id"を使ってランダムな数値でParticleのスケールを設定したり、カラーを設定したりしています。


本来レンダリング用の設定はレンダリングフローに合わせて調整する必要があるため、これが正式なアプローチではなく、あくまでもサンプルです【11】。

02 Hints / 制作に役立つヒント
VOP Networkでのセッティング
VOP NetworkをNetwork Viewで操作する際には、色々とカスタマイズした方が、ヒューマンエラーを回避できる可能性があります。これはある意味慣れや好みの問題が大きいので、あくまでも参考程度にしていただければと思います。
VOP Networkでは、横軸のコネクションになると、VOPの数が多くなり、煩雑になる可能性が高いです。そのため、ネットワークのWireがノードに重なってしまい、非常に見づらいです。そのため、VOPだけは必ずWireをRoundにすることで、すっきりと整理することができます。これは、Network View Display Optionsで設定します【A】。

また、VOPノードを移動させる際に、Wireに対して自動的に接続されてしまい、思わぬエラーを引き起こすことが多々あります。これは[Network View→Tools→Allow Dropping Nodes on Wires]をOFFにすれば回避できます【B】。この機能は便利な反面、エラーの確率の方が高いため、筆者は必ずOFFにしています。

03 Issues / 今回の課題
Issue 01:Particleの分離 / Effect ★★☆☆☆
おさらいとして、Particleの分離をしてみましょう。
衝突したParticleが分離するような設定を作成してみましょう。グループのタイミングと分離のタイミングが重要です。
Issue 02:Velocityのコントロール / Effect ★★☆☆☆
Particleの動きを、Source側でVelocityを作成しコントロールをしてみましょう。
Issue 03:Surfaceに沿わせる / Effect ★★★☆☆
今回のテーマをおさらいして、球体の周りを這うラインエフェクトを作成してみましょう。
こちらの制作例は、今回のプロジェクトデータ内に用意しています。ひととおり制作できたら、ぜひ確認してみてください。
今回のプロジェクトデータはこちらから>>TEXT_秋元純一 / Junichi Akimoto
EDIT_小村仁美 / Hitomi Komura(CGWORLD)