Vellumを使って複合的なシミュレーションを行なっていきます。

Vellumの組み合わせ

今回は、VellumのConstraintを組み合わせたシミュレーションを行なっていきます。Vellumは統合型のシミュレータとして進化しており、様々な表現をすることが可能です。簡単にセットアップができる反面、シミュレーション速度などに若干の問題を感じる部分もまだまだありますが、それは今後に期待するとして、どのように組み合わせていくか検証してみたいと思います。今回は、Vellumを剛体として扱えるShape Matchを使用して、柔らかいものと硬いものを組み合わせていきましょう。

少し複雑で低速なシミュレーションになるため、今回の形状はシンプルな卵型で検証しています。殻を破るような表現と中から出てくるような表現をどのように組み合わせるかを紹介しつつ、実践的なワークフローとして1つの引き出しになればと考えています。Vellumの表現力はどんどん進化していますので、ここで置いていかれないよう、ぜひチャレンジしてみてください。

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

01 All Flow

全体のフローになります。今回は、卵型のモチーフを3つ作成し、それぞれタイミングをずらしてシミュレーションをしています。シミュレーション自体は同時に行なっていますので、それを可能にするための下準備を整える必要があります。

大まかなながれとしては、まず卵型の殻を3パターン作成しています【A】。それをあらかじめキャッシュを取っておきます。次に、3パターンそれぞれの殻のジオメトリをVelllumのGeometryおよびConstraintsに変換するフローです【B】。ここでは、殻が破れるタイミングを作成するAttribute用のジオメトリも同時に作成します。内部の風船状の弾性体も3パターン作成します。これも膨らむタイミングをずらしたかったので、3つ作成しています【C】。最後に、Velllumのシミュレーションのフローです【D】。ここでは、あらかじめ準備したVellumのデータを同時にシミュレーションできるように内部にも設定を施しています。

まず、ベースとなる卵型のジオメトリを作成します【E】。SphereをEditで調整し、SubdivideをかけてからRemesh SOPで均一なメッシュへ変換します。必要に応じてUVを作成します。Peek SOPで少し縮めて、それをBooleanを使ってくり抜きます。これで、薄い殻が作成できました【1】

次に、この殻を割っていきます。まず、殻の表面にPointをScatterで作成しますが、必要に応じて、VOPのNoiseを使って“density”を作成し、ムラをつくってあげると、よりリアリティのあるヒビをつくることができます【F】【2】

このPointを使って、RBD Material Fracture SOPで殻を割り、キャッシュを取ります【G】。RBD Material Fracture SOPは、多少計算に時間がかかりますが、簡単に複雑なクラックを作成することができます【3】

このタイミングで、Transformを使ってレイアウトしていきます【H】【4】。レイアウトしたジオメトリを一度Packに変換します【I】。これは、ひび割れのタイミング用のジオメトリを作成するためのものですが、トポロジーが変わってしまうので、Vellum側のジオメトリもこれと同じものをUnpackして使用します。さらに切り分けられるようにGroupも作成します【J】

殻のジオメトリは、Vellum Constraint SOP【K】を使い、Shape Matchに設定します。また、殻をつなぎ合わせるために、Vellum Constraint SOP【L】でGlueをつくり、ヒビの部分にConstraintsを作成します【5】。これをVellum Pack SOP【M】でPackにしておきます。

次に、タイミング用のジオメトリを作成します。Rest SOP【N】で"rest"を作成し、VOPを使ってNoiseでデフォームさせます【O】。PrimitiveのPhere【P】で殻が破れるスタート地点を指定し、範囲を確定します【6】。このPointからVOP【Q】を使って距離【R】を計算し、徐々にエリアが拡大していくAttributeを作成します。

Wrangleなどで"rest"の位置に戻し、Unpackをします【S】。この際、作成した"area"のAttriuteをTransferして完了です【7】

続いて、殻の内部の風船状のジオメトリを作成します。殻の内側のジオメトリを利用して、Peek SOPで少し内側に入れてキャッシュを取ります【T】。少し縮めておくことで、シミュレーションの際に、Collisionのエラーを回避しやすくなります。

Group【U】を作成し、殻のレイアウトで使用したTransformをReferenceして同等の位置にレイアウトします【V】。Vellum Constraintで、Cloth【W】とPressure【X】を設定します。このとき、PressureはそれぞれでGroup名を変えておき、後々タイミングをそれぞれでずらせるようにしておきます【8】

これもVellum Pack SOP【Y】でPackにして完了です【9】

02 Vellum Simulation

Vellumをシミュレーションします。

シミュレーションの設定をしていきます。PackしたVellumを一気にMerge【A】して、それをVellum Unpack SOP【B】で解凍して、GeometryとConstraintsに分けます。それぞれをVellum Solver SOP【C】に接続します。Groundを設定し、Substepは3~5程度まで増やしておくと、シミュレーションの精度を保てます。

Solver内部では、SOP Solver DOP【D】を使って、Geometryにタイミングをながし込みます。こうすることで、アニメーションしているAttributeを毎Substepでながし込むことが可能です。

SOP Solver内部では、Geometryをそれぞれで切り分け【E】、それぞれに対応したタイミングのGeometryをObject Merge SOP【F】で読み込みます。それらをAttribute Copy SOP【G】で"area"をコピーしてMergeします。

VOP【H】を使って、"area"の値で【I】数値をMix【J】します。このとき、止まっているものは0の値になるようにします【K】。また、動き出すものは、Massの値を作成しますが、Balloonよりも軽い値の方が、良い結果になります【L】。それらを"mass"としてエクスポートします【M】。最後に、BalloonのGeometry【N】とMergeして、タイミングの動きは完了です。

次に、Balloonが膨らむアニメーションを付けていきます。Vellum Constraint Property DOP【O】を使って、それぞれでタイミングを作成していきます。Groupで、対応するBalloonのConstraintsである、Pressureを選びます【1】。膨らむ挙動は、Rest Length Scale【2】に対してアニメーションを付けて完了です。

これで、Balloonが膨らんで、殻が破れていくシミュレーションが行えます。殻の破れる抵抗は、前項で解説したGlueで行いますが、BreakingのThreshold【3】を調整することで、その抵抗力を調整することが可能です。

殻はShape Matchで行なっているので、変形が強い場合は、Vellum Post-Prosess SOP【P】のShape Match Regidity【4】を調整して、元の形状に戻すことが可能です。

最後にキャッシュを取ってシミュレーションの完了です【Q】【5】。Normalがなくなってしまうので、レンダリング向けに再度Normalを計算すると良い結果になります【6】

03 Operaters

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

●Velum Post-Process SOP

今回は、Shape Matchと言う、Vellumの中でも若干特殊な、剛体をつくるためのしくみを解説しました。それを可能にするために、Velum Post-Process SOPが必要になってきます。Shape Matchは、場合によっては変形が起きてしまいますが、それを元の形状に戻す上では、このしくみが欠かせません。これと同等で、Collisionに対する結果を微調整したり、Subdivideや厚みを付けたりなど、シミュレーションの後処理として役に立つオペレータとなっています。

またそれだけではなく、シミュレーションの結果をビジュアライズすることで、負荷を確認したり、シミュレーションに付随する様々な情報を取得することも可能です。Houdiniにおいては、シミュレーションの前後のフローもかなり重要になることが往々にして発生します。むしろその方が作業量は多いこともしばしば。そういった痒いところに手が届くだけでなく、デバッグ向けの重要な機能を兼ね備えているノードの1つですので、ぜひ、シミュレーションに組み込んで有効活用してみてください。

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

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

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