On this page |
HoudiniのVellumテクノロジーの主な強みの1つは、その相互作用性です。 共通のフレームワーク内で実に様々なマテリアルタイプをシミュレーションすることができます。 例えば、Gain(粒)はソフトボディを変形させることができ、布は水や(ほぼ)剛体のオブジェクトに対して反応します。 また、異なる物理設定の流体同士が正しく相互作用することもできます。 次のワークフローガイドでは、ソフトボディと水の相互作用について説明します。 キノコが浅い水の中に落ちます。衝撃でキノコが変形し、綺麗な飛沫が生成されます。 これらはすべて、通常より10倍遅い240fpsのスローモーションで起こります。
以下の動画がシミュレーションのプレビューです。 十分なディテールと飛沫の構造が得られるように、シーンにはおよそ240万個のパーティクルが含まれています。
DOPまたはSOP ¶
まず問題となるのは、DOPとSOPのどちらのセットアップを使用するかです。 DOPのメリットは、シェルフツールを使用してネットワークを作成できることです。 一方、SOPは手動で組み立てる必要がありますが、1つのGeometry OBJノード内にすべてのノードを配置することが可能です。 Houdiniの中期的な目標は、ダイナミクス(Pyro、流体、Vellum)のセットアップをSOPに移行し、少なくともDOPに相当するものと同じ機能を提供することです。 SOPsの方が今どきなテクノロジーのように思えます。 したがって、ここではSOPを使用したプロジェクトワークフローを紹介します。 DOPまたはシェルフツールを使ったワークフローに興味がある場合は、Vellum Fluidのセットアップページで詳細を確認してださい。 パラメータ設定は、DOPでもSOPでも同じです。
どちらの方法を使用する場合でも、ワークフローはいくつかのタスクに分かれています:
-
キノコのジオメトリをインポートする
-
キノコをVellum Softbodyに変換する
-
浅い水を定義する
-
ソルバをセットアップし、流体とソフトボディを1つにまとめる
-
流体パーティクルサーフェスを作成する
-
シミュレーションデータをキャッシュ化する
キノコのインポート ¶
当然ながら、キノコに限らず、好きなオブジェクトを使用して構いません。 また、ABC、FBX、OBJなど対応しているどのファイルフォーマットも使用することができます。 このシーンでは、いくつかのキノコをランダムに配置し、面白い飛沫が得られるようにセットアップします。 オブジェクトは互いに接触することはできても交差しないようにします。 もう1つ考慮すべき事はスケールです。 この例では、オブジェクトはあらかじめ組み立てられたAlembicとして提供されています。
Note
Quixel Megascansアカウントをお持ちの場合は、キノコをダウンロードすることができます。
そのアセットIDはpdvcB
(Bolete Mushrooms)です。
-
ネットワークエディタで、 obj レベルにいることを確認します。
-
⇥ Tabを押してTABメニューを開きます。TABメニューには利用可能なノードがすべて含まれています。ノードを追加するには、サブカテゴリに進むか、または、検索フィールドに名前の一部を入力します。
-
Geometry OBJノードを作成します。TABメニューで
geo
と入力し、このノードを選択します。 -
そのノードをダブルクリックして中に入ります。これ以降の手順は、すべてGeometry SOP内で行ないます。
-
Alembic SOPを使用すると、ABCファイルをインポートすることができます。FBXまたはOBJファイルを使用する場合は、File SOPを追加します。
-
File パラメータのファイル選択ダイアログを開いて、Alembicファイルを指定します。
キノコのアンパック ¶
キノコを分けて、それらがVellumフレームワークで使用できるようにするには、オブジェクトをアンパックして変換する必要があります:
-
Unpack SOPを追加し、上流のAlembic SOPに接続します。
-
ここでは必ずしも必要ではありませんが、 Transfer Attributes パラメータに
path
と入力します。このpath
アトリビュートには、Alembicファイル内の個々のオブジェクトのパスが格納されています。 -
Convert SOPを追加して、Unpack SOPの出力に接続します。外部ソースのアセットは、ほとんどの場合がPolygon Soupとして取り込まれます。しかし、Vellumはこのタイプのジオメトリを扱うことができません。そのため、 Convert To パラメータを Polygon に設定してキノコを準備します。
-
Transform SOPを使用して、スケールを補正します。このノードを上流のConvert SOPに接続し、必要に応じて Uniform Scale パラメータを
0.03
などに調整します。 Translate パラメータと Rotate パラメータを使用することで、オブジェクトグループの位置を調整することができます。
ソフトボディのキノコ ¶
このシーンでは、キノコのセカンダリモーションを誇張したいです。 ソフトボディをゴムのような挙動にして、より変形しやすくします。 キノコが圧縮されると、流体の大きい部分と相互作用して、より大きい飛沫を生成します。 また、揺れによって、スローモーションの効果が高まります。最終的には、設定は好みに応じて決めてください。 以下に示す設定は、あくまで参考です。 Stiffness値は、Vellum Solver SOPの Substeps と Constraint Iterations にも依存しているため、通常は何回かテストを行なう必要があります。
Note
以下に示す Stiffness 値は、ここで説明しているシーンではうまく機能します。 自分のオブジェクトに適した設定を見つけるには、何回かテストを行なう必要があるでしょう。
-
TABメニューから
Vellum Configure Strut Softbody
を選択します。このマクロは、2個のVellum Constraints SOPノードのセットアップを作成します。1つ目のノードの Constraint Type は Cloth に設定されていて、ベースマテリアルを定義します。2つ目のノードはキノコの内部構造を定義し、ここでの Constraint Type は Struts になっています。 -
Transform SOPの出力を
vellumcloth1
の1番目の入力に接続し、キノコのジオメトリを転送します。 -
vellumcloth1
ノードを選択します。キノコの挙動に関連するパラメータは Stiffness です。このパラメータは、 Stretch および Bend セクションにあります。 Stretch ▸ Stiffness パラメータはそのままにし、 Bend ▸ Stiffness パラメータは、そこに関連付けられているドロップダウンメニューを10000
に設定します。 -
Mass ドロップダウンメニューから Calculate Uniform を選択します。 Density パラメータにアクセスできるようになるので
1000
と入力します。 -
vellumstruts1
ノードを選択し、 Constraints Per Point パラメータを2
に設定して、より密度が高くて堅い拘束メッシュを作成します。 -
Stretch ▸ Stiffness パラメータに
2
と入力し、そこに関連付けられているドロップダウンメニューを1000
に設定します。
あまりリアルな結果にはなりませんが、適切な Time Scale と流体パーティクルを組み合わせることで、自然な挙動が得られます。
水の体積とドメイン ¶
水の体積は、ここではボックスで定義しますが、閉じていれば他の形状でも構いません。 また、水が流れ出ないように水を囲んでおく必要もあります。 シミュレーションを開始すると、重力とパーティクル間の間隔の影響で流体の体積が圧縮されます。 通常は5から8フレーム後に流体は落ち着きます。 流体の体積の寸法は、キノコのスケールと位置に依存します。
また、飛沫を広げるにはある程度の空きスペースが必要であることも考慮しなければなりません。 飛沫の強さは、水深、キノコの衝突速度、水の物理特性などの要因にも依存します。 飛沫(の大部分)をとらえるには、水の体積が十分大きくなければなりませんが、そのためにはより多くのパーティクルが必要となり、シミュレーション時間も長くなります。 ただし、テスト中はより迅速に結果が得られるよう、水の体積やパーティクル数を抑えても良いでしょう。
Note
以下に示すスケール値はあくまで参考なので、他の設定を使用しても構いません。
-
TABメニューから、2個のBox SOPを作成します。1つ目は水用、2つ目は水を囲むコンテナ用です。サイズの調整が一度きりで済むよう2個のBoxが連動するようにさせていきます。
-
1つ目のBox SOPの名前を
water_volume
に、2つ目のBox SOPの名前をwater_domain
に変更します。 -
water_volume
ノードを選択し、パラメータエディタで Size パラメータを1.5
、0.015
、1
に設定します。 -
その Size.Y パラメータを増減させると、ボックスはY軸のプラスマイナス両方向に広がります。これがプラス方向のみに広がるようにしたいので、 Size.Y をクリックし、メニューから Copy Parameter を選択します。
-
Center.Y をクリックし、 Paste Relative Reference を選択します。
-
パラメータが緑になり、
ch("sizey")
というエクスプレッションが含まれます。このエクスプレッションは、 Size.Y パラメータへの変更が Center.Y にも反映されるようにするものです。 -
最後にボックスの底が常に
0
に設定されるように、そのエクスプレッションに/2
を追加します。ボックスの高さを変更する度に、シーンのベースラインに自動的に揃うようになります。
water_volume
ノードとwater_domain
のXとZの寸法を同じにしたいです。
同様に、water_domain
の底も0
に配置したいです。再度、相対参照を通していくつかの値を連動させます。
-
water_domain
ノードを選択します。 -
Size.X に
ch("../water_volume/sizex")
と入力し、water_volume
ノードの Size.X 値を取得します。 -
同様に Size.Z に
ch("../water_volume/sizez")
と入力します。 -
Center.Y に
ch("sizey")/2
と入力して、ドメインとシーンのベースラインを揃えます。
水の特性 ¶
水の特性は、見た目と雰囲気だけなく、パーティクルの数にも影響します。 例えば、非常に粘性の高い流体は、水というよりも、油やクリーム、シロップのような挙動になります。 パーティクルの数は、あなたの求めるディテールの細かさに関係します。 解像度の低い流体は、不自然に見えたり、水滴が欠けたりしがちなので、パーティクル数が多いことに恐れることはないです。
-
TABメニューからVellum Configure Fluid SOPを追加します。よく見ると、これは実際にはVellum Configure Grain SOPです。
-
その1番目の入力を
water_volume
の出力に接続します。パーティクルをそのボックスのボリュームから生成します。 -
パーティクルの数は、 Particle Size で決まります。テスト用には、(ドメインのサイズに応じて)
0.01
から0.005
の間の値を使用します。値が大きすぎないようにしてください。値が大きいとすべてのディテールが失われ、シミュレーションを評価できなくなってしまいます。最終シミュレーションでは、0.002
くらいの値を使用すると、適切なパーティクル数になります。 -
Physical Attributes セクションの Viscosity チェックボックスと Surface Tension チェックボックスをオンにします。
-
Surface Tension パラメータに約
50
の値を設定します。 Surface Tension(表面張力) は、流体を収縮させ、パーティクル同士が離れないようにします。 Viscosity(粘度) と組み合わせて使用することで、微小な水滴が大量に発生するのを防ぐことができます。
ストリームのマージ ¶
どのVellumノードにも Geometry 、 Constraints 、 Collisions 用の3本の出力ストリームが備わっています。
キノコのストリームと流体のストリームを一つにしてVellum Solver SOPに接続したいです。
さらに、衝突オブジェクトとしてwater_domain
も接続したいです。
-
3個のMerge SOPノードを追加し、それぞれの名前を
merge_geo
、merge_con
、merge_col
に変更します。 -
vellumstruts1
ノードの 1番目 の出力とvellumfluid1
ノードの 1番目 の出力をmerge_geo
の入力に接続します。 -
同様に 2番目 と 3番目 の出力も手順2を繰り返し、それぞれ
merge_com
とmerge_col
の入力に接続します。 -
最後に、
water_domain
ノードの出力をmerge_col
の入力に接続します。
Vellum Solver ¶
ソルバは、シミュレーションの中心的存在で、実際のシミュレーションを実行します。 また、ソルバは時間に関するすべてのパラメータも処理します。 ソルバはソフトボディと流体を同時に扱うことができますが、両方のマテリアルには別々の設定が必要です。
Note
他のSOPベースのワークフローガイドでは、Vellum Source DOPが紹介されています。 このノードでは、 Emission Type パラメータに素早くアクセスできます。 1フレームで放出するのか、または、途切れなく放出するのかを選択することができます。 この例では、すべてのパーティクルをフレーム1で1回だけ生成するので、 Emission Type は不要です。
-
TABメニューからVellum Solver SOPを追加します。
-
その3つの入力をそれぞれ
merge_geo
、merge_con
、merge_col
の出力に接続します。 -
Solver タブを開きます。
-
Time Scale を
0.1
に設定します。標準フレームレートが24fpsならば、時間が10倍に引き伸ばされて実質的なフレームレートは240fpsになります。 -
Substeps を
10
に上げます(これが流体に適した値です)。 -
Constraint Iterations を
20
に設定します。これらの反復はサブステップ毎に適用されるので、ソフトボディには十分な剛性が生成されるはずです。 -
流体には Smoothing Iterations は不要ですが、ソフトボディの拘束とバランスを取るのには役立ちます。お勧めの値は
5
です。
逸脱パーティクルの削除 ¶
基本のシーンセットアップができたので、シミュレーションして第一印象を確認します。 ボタンをクリックします。 おそらく、ドメイン外に逸脱パーティクルが観測されることでしょう。 これらのパーティクルは削除する必要があります。 以下の画像では、低解像度でドメインから抜けるパーティクルが確認できます。
-
Vellum Solver SOPをダブルクリックして中に入ります。
-
ノード内部でTABメニューを開いてPOP Kill DOPを追加します。
-
出力を
FORCE
ノードの入力に接続します。 -
Boundary タブを開き、 Enable チェックボックスをオンにします。
-
Bounding Type ドロップダウンメニューで Bounding Object を選択します。
-
SOP Path パラメータで、ノード選択アイコンをクリックして
water_domain
ノードを選択します。 -
最後に、 Invert チェックボックスをオンにして外側のパーティクルを削除します。
サーフェス化 ¶
サーフス化は非常に独特なプロセスで、満足のいく結果を得るには時間がかかる場合があります。 以下に示すヒントは普遍的なものではありません。 他のシミュレーションでは、別の設定が必要になるでしょう。 流体パーティクルサーフェスの最大の問題の1つは、ジッター(微震)です。 この効果はスローモーションのシミュレーションで発生することが多く、パーティクル間の距離は、時間の経過と共にほとんど変化しません。 穴が現われ、次のフレームで消え、1フレーム後に再び現われるような瞬間が時々あります。 また、近くのパーティクルが1つの水滴として扱われ、次は分離した水滴として扱われ、再度1つの構造として扱われることもあります。
ジッター(微震)効果のもう1つの原因は、ポリゴン数が十分でないことで、これはParticle Fluid Surface SOPの Particle Separation パラメータで制御します。 Particle Separation パラメータは、少なくともVellum Configure Fluid SOPの Particle Size と同じにする必要があります。 値を少し小さくすると、ディテールが増え、より細かい水滴をとらえます。デメリットは、メッシュが重くなることです。
ジッター(微震)効果を弱めるもう1つの方法は、できるだけ多くのパーティクルを水滴にまとめることです。 このためには、まず Influence Scale を上げます。 このパラメータは、パーティクルが相互作用する最大距離を決定します。 Droplet Scale パラメータは、 Distance Scale パラメータより小さくする必要がありますが、近い値でも構いません。 Droplet Scale パラメータは、パーティクルとサーフェス間の距離を表わします。 ここでは、やや厚いメッシュになっています。 Filtering タブのパラメータを使用すると、メッシュを薄くしたり、サーフェスの凸凹を滑らかにしたり、さらにはジッター(微震)効果を軽減することができます(重要です)。 ただし、フィルタリングはディテールを損なうため、極端な値は避けてください。 また、パーティクルサーフェスの厚みを利用すると、特定のタイプの流体を再現することもできます。 例えば、牛乳やジュースの滴は、ぽってりと厚みがあるものです。