Vellumを使用したエミットシミュレーションを紹介します。

Vellumのコントロール

今回は、Vellumのジオメトリを発生させるシミュレーションにチャレンジしていきたいと思います。また、Houdini 19から新たに搭載されたVellumのFluid機能も同時に使用して、弾性体と液体の両方を同時にシミュレーションしていきます。

VellumはHoudini 19からトータルで様々なマテリアルに対応する統合的Solverとして改良され、速度も向上し、非常に高度なシミュレーションを行うことができます。また、液体に関してはPBDを使用した粒子法を用いており、小規模な液体に対してのアプローチがFLIPより簡単で、アーティストフレンドリーになり、よりユーザビリティの向上へと繋がっています。

Vellumは通常単体のジオメトリに使うことが多いかもしれませんが、実はエミットするためのしくみが搭載されており、非常に簡単にジオメトリを発生させることが可能です。そのしくみを上手く使用して、今回のようなシチュエーションへどうアプローチすれば良いかに迫りたいと思います。

今回のHoudiniプロジェクトデータはこちら

01 Vellum Source

Vellumのベースを作成します。


まず、ベースとなるジオメトリを準備して、サイズ等を調整して配置します【A】【1】。さらに、シミュレーションをしやすいメッシュへRemesh SOP【B】を使ってポリゴンを均一にします【2】。これは、Vellumの特性上Pointの間隔を均一にした方が、シミュレーションの精度が向上しやすいためです。Pointの密度が疎らの状態だと一部の結果を担保できなくなるため、可能な限りきれいなメッシュで望みましょう。

今回は、Tetrahedralを使用したConstraintを使用した弾性体のシミュレーションを行います。まず、Tet Conform SOP【C】を使って、メッシュをTetrahedralにコンバートします。これは、元のPolygonを利用して三面体で構成することで、内部構造を構築します【3】。それをVellum Constraints SOP【D】を使って、Tetrahedral StretchのConstraintに設定します【4】。これによって、内部構造をもったVellum Constraintsを作成することができます。この際に、Density【5】で質量、StretchのStiffness【6】で柔らかさを設定します。

続いて、Fluidのソースを作成します。メッシュをVDB from Polygons SOP【E】でVDBのSDFに変換し、VDB Reshape SOPやVDB Smooth SDF SOP【F】を使って、外側に滑らかに厚みを作ります。それをVDB Combine SOP【G】を使って、元の形状で内部をくり抜きます。こうすることで、メッシュの外側の厚みを作ることができます【7】。このVolumeに対して、Volume from Points SOP【H】でPointを作成します【8】

作成したPointを、Vellum Configure Grain SOP【I】を使って、PointをVellum様のGrainまたはFluidに変換します。このノード単体でもVolumeからPointを作成することができますが、今回は厚みをコントロールしたかったので、敢えてこのようなセットアップにしています。このとき、Volume from Points SOPとVellum Configure Grain SOPのPoint SeperationとParticle Sizeは合わせておきます【9】。また、液体の性質もここで設定します。特にDensityで質量を調整します【10】。ここでは、弾性体と液体の比重が現実世界から大きく異なると、同時シミュレーションした際に不具合が生じますので注意が必要です。また、今回はViscosity【11】とSurface Tension【12】で粘性をもたせています。これによって、必要なPointのAttributeが付加されます。

最後に、Fluid用のPointにGroup【J】を作成し、ジオメトリとConstraintそれぞれに対してNullで選択しやすいように名前を付けて準備完了です【K】

02 Vellum Emit

Vellumを発生させます。

まず、エミットするためのエリアを適当なPrimitive等で指定します【A】。そのジオメトリに対して、POP【B】を使ってParticleを発生させます。Particleの量で、Vellumの発生量をコントロールします。POP Source DOP【C】のConstant Birth Rate【1】で、1秒間に発生するおおよその数を決めます。その際、Particleの寿命を1フレームに指定するために、1秒をFPS、すなわちフレームレートで割ります【2】

これで発生したParticleに、エミットで飛ばしたい方向にPoint Velocity SOP【D】でVelocityを作成します【3】。必要に応じてNoiseも追加します。

Attribute Delete SOP【E】で"id"と"velocity"以外の余分なAttributeを削除します。また、これも必要に応じてですが、Attribute Randomize SOP【F】で“N”をバラバラにして、発生時に回転がランダムになるように設定します。

今回のVellumはVellum Solver SOPを使用せずに、DOP Networkでイチから構築します。まず、Vellum Object DOP【G】を作成し、Vellum Solver DOP【H】に接続します。

次に、Vellum Source DOP【I】でTetrahedral Stretchのジオメトリを読み込みます。同じように、Vellum Source DOP【J】でFluidのPointを読み込みます。方法は、それぞれのSOP Path【4】を指定して、Constraintも同等にそれぞれ読み込みます【5】

発生の際のセッティングは、Emission TypeをInstance on Points【6】に設定し、Instance Pointsを指定します【7】。さらに、引き継ぎたいInstance PointsのAttributeを必要に応じて指定します【8】

今回はおまけ程度に使用していますが、Vellum Constraint DOP【L】を使って、シミュレーション中にGlueの設定を追加しています。コリジョンは、今回はGround Planeを使用しています【M】

最後にGravity DOP【N】で重力をかけて完了です。シミュレーションの精度を上げるため、Substepは3~5程度まで上げることが望ましいですが、マシンのスペック、シミュレーション時間等を考えて設定する方が良いでしょう。

これで、簡単にVellumをエミットさせることができます【9】。また、弾性体と液体の同時シミュレーションも1つのSolverで同時に行うことができます【10】

03 Post Simulation

最終的なジオメトリの整理を行います。

シミュレーション終わりに、レンダリングに向けたポストセッティングを行います。今回は、Dopnet【A】でVellumのシミュレーションを行なったので、DOP Import SOP【B】を使ってVellum ObjectをSOPに読み込みます。Attribute Delete SOP【C】を使って、余分なAttributeを整理してキャッシュを取ります【D】

Split SOP【E】で、弾性体と液体へ切り分け、それぞれで設定をします。弾性体の方は、低解像度Polygonでシミュレーションを行なっていますので、高解像度へ戻す作業が必要です。そのため、あらかじめ移行しておいた"id"のAttributeをPrimitiveへプロモートします【F】。それを使って、For【G】でAttributeごとにPoint Deform【H】をします。その際、戻したいジオメトリを準備します。今回はある程度PolyReduceして使用しています【I】。また、シミュレーション前の、動いていない低解像度のジオメトリをRest Geometryとして使用します【J】

最後に、For内部で抽出されたシミュレーションジオメトリの形状に変形します【1】。この方法はある程度の精度しか出ませんので、確実に変形させたい場合は、もう少し検討の余地はありますが、通常であれば、概ね問題はないと思われます。

続いて、FluidのParticle【2】にメッシュを張っていきます。これは簡単に、Particle Fluid Surface SOP【K】を使用してメッシュを張ります。

それぞれのジオメトリのキャッシュを取って完成です【3】

04 Operators

主要ノードを解説します。

●Vellum Source DOP

今回は、Vellumを発生させるためのアプローチを紹介しました。非常に簡単に発生をコントロールすることができますが、Vellum Solver DOPでも同等のセッティングを行えるように改良されています。今回は、コントロールの概念を紹介する目的で、敢えてDopnetを使った設定にしました。

重要なのは、Vellum Source DOPの存在です。内部を見ると、しくみとしてはSOP Solverを利用したもので、そこまで複雑なものではありませんが、シンプルな構造でも必要最低限の要素は押さえられています。カスタマイズもおそらく難しくはないので、必要かどうかはさておき、POP Sourceなどに倣った方法を採り入れたBirthのしくみ等にも改良できます。

Vellumが特殊なのは、GeometryとConstraintの関係性なので、そのDataをどのように扱うかを理解できると、格段に納得感が出て、カスタマイズへ向けての下地が整うと思います。逆にVellum Solver SOPを使用しているだけで理解しきるのは難しいので、まずは1から組み上げて、細かいData等にも目を配って学習するのが、実は一番の近道と言えます。

秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/取締役副社長)

日本でも指折りのHoudini アーティスト。
アーティスト業務の傍ら、Houdiniアーティスト育成や布教活動に勤しむ

www.transistorstudio.co.jp
blog.junichiakimoto.com