On this page |
位相(Phase)を使用すれば、Vellumは粘度と表面張力を別々に計算して、様々な種類の流体をシミュレーションすることができます。 このオプションは流体にのみ利用可能で、例えば、Phaseを介してGrainと水を組み合わせることはできません。 また、2つの位相に制限されていません。 Vellum Configure Grain SOPノードの Physical Attributes セクションに Phase パラメータがあります。 Type は必ず Fluid に設定することに注意してください。 もちろん、2つの流体をセットアップして位相を無視することも可能ですが、その結果は期待通りにならない可能性があります。 設定によって変化する流体の挙動:
-
Phase 値は等しいが、 Viscosity および/または Surface Tension の設定が異なる場合、接触する領域で流体同士がくっつきやすくなります。
-
Phase 値は異なり、 Viscosity が等しい場合、2つの流体は相互作用するものの、流体同士の間に摩擦がないような挙動になります。
-
Phase 値が異なり、 Viscosity および/または Surface Tension も異なる場合、流体は分離し、ほとんどくっつきません。
以下の例では、お椀に3本の流体が注がれたシーンを作成します。 1つ目の流体は、少しホイップクリームに似た挙動をし、2つ目の流体は液体のチョコレートで、3つ目の流体はキャラメルに近いです。 すべてをもっと面白くするために、ミキサーで材料をかき混ぜます。 これらの流体は物理的に正しくある必要はないことを前提にしています。 このプロジェクトの主な目的は、流体の位相の概念に実際に触れて、様々な物質がどのように相互作用するのかを示すことです。 そのため、他のパラメータと組み合わせて使ってみるのも良いでしょう。
このプロジェクトは、主に以下のようにパーツが別れています:
-
お椀のジオメトリ
-
ソースオブジェクト
-
流体ネットワークテンプレートの作成
-
ソルバの設定
-
流体とソルバの接続
Note
このページの最後には、ダウンロードして利用できる2個のサンプルを載せています。 1つ目のサンプルには、お椀とミキサーのオブジェクトのみが含まれています。 2つ目のサンプルは、参考用の完全なプロジェクトです。 以下では、その1つ目のサンプルのノードに基づいて説明をしています。
お椀とミキサー ¶
お椀は回転体オブジェクトで、流体用の衝突オブジェクトとして作用させます。
-
サンプルファイルを読み込んで、
fluid
Geometry SOPノードをダブルクリックして中に入ります。 -
そこには、お椀の形状を表現した4個のノードがあります。
-
ミキサーは、Box SOPだけで表現されています。
-
そのBoxノードを選択して、 Rotate.Y パラメータに
$FF*15
と入力します。このエクスプレッションは、オブジェクトをY軸で回転させます。$FF
は実フレーム番号を意味し、その値に15
の係数を乗算しています。この係数を変更することで、ミキサーの回転を遅くしたり速くすることができます。
ソースオブジェクト ¶
流体ソースには、3個の同じ球を使用し、それらの球をお椀の中心を基点に周回させます。 それらの球の位置にキーフレームを打つのではなくて、エクスプレッションを使用します。 これによって、非常に簡単に周回の速度、開始位置、半径を変更することができます。
-
Sphere SOPを追加します。
-
Uniform Scale パラメータを
0.1
に設定します。 -
Center.Y を
0.2
に変更します。 -
⌃ Ctrl + Cと⌃ Ctrl + Vを使用してSphereノードを2回コピーアンドペーストします。これで球が3個になりました。
-
各Sphereノードの名前を
source_cream
、source_chocolate
、source_caramel
に変更します。
モーションのエクスプレッション ¶
周回モーションは、サイン関数とコサイン関数で表現することができます。
今回のシーンでのパラメータのエクスプレッションは、sin($FF*speed+offset)*distance
とcos($FF*speed+offset)*distance
です。
-
speed
は係数で、値を高くすると球が速く周回します。 -
offset
は球の周回開始位置をずらします。 -
distance
はシーンの原点までの距離で単位がメートルです。
球の Center.X にサイン関数を使用したエクスプレッションを、 Center.Z にコサイン関数を使用したエクスプレッションを追加します。
どちらのエクスプレッションも反時計回りで円を描く動きをします。反時計回りで円を描く動きをさせるには、どちらかのエクスプレッションを-
(マイナス)記号で開始させる必要があります。
-
source_cream
の Center.X にsin($FF*7+160)*0.2
、 Center.Z にcos($FF*7+160)*0.2
を使用します。 -
source_chocolate
の Center.X にsin($FF*6)*0.3
、 Center.Z にcos($FF*6)*0.3
を使用します。 -
source_caramel
の Center.X にsin($FF*4+100)*0.1
、 Center.Z にcos($FF*4+100)*0.1
を使用します。
流体テンプレート ¶
シーンには、3つの異なる種類の流体を含めるので、それぞれの材質を別々に定義する必要があります。 手っ取り早い方法は、1つ目の流体のネットワークを作成し、それをコピーアンドペーストして、個々の設定をすることです。
-
⇥ TabメニューからVellum Configure Fluid SOPを追加します。このノードを見ると、元はVellum Configure Grain SOPになっていることがわかりますが、それを流体用に事前設定されています。
-
テスト用として Particle Size は大きくしても良いでしょう。ここでは
0.01
の値を入力します。最終シミュレーションでは、このパラメータを0.005
まで下げます。この値だと最終パーティクル数は53万ポイントほどになります。細かいな構造や滴を生成したいのであれば、十分な数のパーティクルが必須になります。 -
Physical Attributes セクション下のパラメータは、生成したい流体のタイプを定義します。後でこれを設定します。
Particle Size 値を割りと大きくしても、最終シミュレーションに近い良い結果が得られます。スライダをドラッグして以下の画像を比較してください:
以下のアトリビュート調整系ノードとカラーノードは必ずしも必要ではありませんが、ランダムさを増したり、流体を視覚的に分けるのに役立ちます。
-
Attribute Adjust Vector SOPを追加します。このノードは、パーティクルが均一なルックにならないようにそのパーティクルの位置にランダムさを加えます。
-
その入力をVellum Configure Grain SOPの1番目の出力に接続します。
-
General セクションで、 Attribute Name パラメータの
v
エントリーを削除します。次に、位置を変更するためにP
と入力します。 -
Adjustment Value セクションで、 Adjust with パラメータのドロップダウンメニューから Noise を選択します。
-
Range Values パラメータのドロップダウンメニューから Min/Max を選択します。
-
Min Value パラメータを
-0.02
、 Max Value パラメータを0.02
に設定します。これらの設定は、パーティクル生成時にそのパーティクルの位置をランダムに変位させます。 -
Animation セクションで、 Animate Noise チェックボックスを有効にします。
-
Color SOPを追加し、その入力をAttribute Adjust Vector SOPの出力に接続します。
-
Null SOPを2個追加します。
-
1個目のNull SOPの入力をColor SOPの出力に接続します。このNull SOPは、ノードチェーンの終端として使用し、パーティクルを格納します。
-
2個目のNull SOPの入力をVellum Configure Grain SOPの2番目の出力に接続します。このNull SOPには拘束を格納します。
次に、テンプレートノード(Vellum Configure Grain、Attribute Adjust Vector、Color、Null)を矩形ドラッグで選択します。
-
⌃ Ctrl + Cを押してそれらのノードをコピーし、2回⌃ Ctrl + Vを押してペーストします。
-
新しくペーストした2個のColor SOPに対して、チョコレート用には Color パラメータを茶色に、キャラメル用には Color パラメータをオレンジ色に設定します。
-
3本の流体別にネットワークが分かれるようにそれらのネットワークを整理します。
これでクリーム用、チョコレート用、キャラメル用の3つのネットワークが揃いました。
コネクションとノード名 ¶
各Vellum Configure Grain SOPの1番目の入力を、それに呼応するソースの球(source_cream
、source_chocolate
、source_caramel
)の出力に接続します。
異なるネットワークを区別しやすくするために、Null SOPに名前を付けます:
-
Color SOPの出力に接続したNull SOPの名前は、それぞれ
GEO_CREAM
、GEO_CHOCOLATE
、GEO_CARAMEL
にします。 -
Vellum Configure Grain SOPの2番目の出力に接続したNull SOPの名前は、それぞれ
CON_CREAM
、CON_CHOCOLATE
、CON_CARAMEL
にします。
ネットワークセットアップが下図のようになっているはずです:
流体の設定 ¶
1つ目のネットワークは、ちょっとしたホイップクリームをシミュレーションをします。
-
(
source_cream
に接続されている)1つ目のVellum Configure Grain SOPを選択してパラメータエディタを開きます。 -
Physical Attributes セクションを開きます。
-
Density パラメータを
1100
に設定します。これは、水の密度よりも若干濃いです。 -
Phase が
1
に設定されているかどうか確認してください。このパラメータは、物理設定が異なる複数の流体を使用することをソルバに伝え、パーティクルの間隔が良くなるように世話します。 -
Viscosity チェックボックスを有効にし、
50
の値を設定します。 -
Surface Tension チェックボックスを有効にし、
40
の値を設定します。
チョコレート用には、以下の設定を使用します:
-
Density パラメータを
1300
に設定します。 -
Phase を
2
に変更します。 -
Viscosity チェックボックスを有効にし、
250
の値を設定します。 -
Surface Tension チェックボックスを有効にし、
10
の値を設定します。
キャラメル用には、以下の設定を使用します:
-
Density パラメータを
1600
に設定します。 -
Phase を
3
に変更します。 -
Viscosity チェックボックスを有効にし、
2000
の値を設定します。 -
Surface Tension チェックボックスを有効にし、
5
の値を設定します。
コリジョン ¶
Vellum Configure Grain SOPには3番目の出力( Collisions )が用意されています。 パーティクルは、お椀と回転するミキサーにも相互作用させたいです。
-
⇥ Tabメニューから、Merge SOPを追加します。
-
お椀のノードチェーンのTransform SOPの出力とミキサーのBox SOPの出力をMerge SOPの入力に接続します。
-
各Vellum Configure Grain SOPの3番目の出力をMerge SOPの入力に接続します。これでMerge SOPには5本の入力が接続されているはずです。後で、このMerge SOPをソルバに接続してコネクションを確立させます。
-
デフォルトでは、コリジョンジオメトリは表示状態になっています。コリジョンジオメトリを非表示にしたいのであれば、Vellum Solverの Visualize タブに進んで、 Show Collision を無効にしてください。
ソルバの設定 ¶
Vellum Solver SOPはネットワークの中心部です。
これは、GEO
ノードとCON
ノード、コリジョンオブジェクトからの入力情報を処理します。
-
Vellum Solver SOPを追加し、その3番目の入力( Collisions )をMerge SOPの出力に接続します。最初の2本の入力は必須ですが、ここでは空っぽのままにしておきます。パーティクルジオメトリと拘束をソルバに接続するのは、後ほど行ないますが、Vellum Solver SOP内部で
GEO
とCON
のNull SOP経由で接続します。 -
Solver タブに進んで、 Substeps を
7
に変更します。流体で推奨される最小値は5
ですが、高い粘度のシミュレーションだとパーティクルを安定化させるのには Substeps を高くする必要があります。 -
流体の場合、 Constraint Iterations は約
20
にしてください。 -
Smoothing Iterations は、ここでは不要なので
0
に設定して構いません。
パーティクルと拘束とソルバのコネクションを確立するには、さらにノードを追加する必要があります。ソルバをダブルクリックして中に入ります。
-
⇥ Tabメニューから、Vellum Source DOPとMerge DOPを追加します。
-
Vellum Source DOPの出力をMerge DOPの入力に接続してから、そのMerge DOPの出力を
SOURCE
の入力に接続します。 -
Vellum Source DOPを選択してパラメータエディタを開きます。
-
SOP Path パラメータの右側にあるオペレータ選択ボタンをクリックします。ノードツリーから
GEO_CREAM
を選択します。 -
Constraint SOP Path パラメータにも同じ操作をしますが、
CON_CREAM
を選択します。 -
Emission Type パラメータを Each Substep に変更します。このパラメータは、Vellum SOPネットワーク内で直接アクセスすることができませんが必要です。そのため、パーティクルと拘束のコネクションをソルバの入力から確立することができません。 Emission Type パラメータを変更しなかった場合、流体はフレーム1の時でしかソーシングされません。
チョコレートとキャラメルのネットワークでもコネクションが必要です。
-
Vellum Source DOPを⌃ Ctrl + Cでコピーし、2回⌃ Ctrl + Vを押してコピーを2個作成します。
-
それら2個のコピーをMerge DOPの入力に接続します。
-
1個目のコピーの SOP Path パラメータを
/obj/fluid/GEO_CHOCOLATE
、 Constraint SOP Path パラメータを/obj/fluid/CON_CHOCOLATE
に変更します。 -
2個目のコピーの SOP Path パラメータを
/obj/fluid/GEO_CARAMEL
、 Constraint SOP Path パラメータを/obj/fluid/CON_CARAMEL
に変更します。
ソースのアクティブ化 ¶
デフォルトでは、すべての3つの流体に対してパーティクルソーシングはフレーム1で開始します。 しかし、開始フレームと停止フレームを変えることで、シミュレーションはもっと良い感じのルックになります。 Activation パラメータのアニメーションとソーシングの制御の手っ取り早い方法は、エクスプレッションを使うことです。
Note
ソーシングの制御方法の詳細は、放出メソッドのページを参照してください。そこには、たくさんのサンプルとセットアップがあります。
-
クリーム用のVellum Source DOPでは、フレーム
42
から120
の間でパーティクルを生成させたいです。 Activation パラメータに進んで、if($FF>42 && $FF<120,1,0)
と入力します。このエクスプレッションは、指定したフレーム範囲では、そのパラメータ値を0
から1
に切り替えます。 -
チョコレート用のVellum Source DOPの Activation パラメータには
$FF<131
と入力します。ここでは、ソーシングはフレーム1
で開始し、フレーム130
で停止します。 -
キャラメル用のVellum Source DOPの Activation パラメータには
if($FF>24 && $FF<122,1,0)
と入力します。 -
fluid 階層内に戻ります。
脱線パーティクルの削除 ¶
いくつかのパーティクルが非常に速く加速してしまい、お椀から抜け出てしまいます。 このような脱線パーティクルは、Vellum Solver SOP内部にPOP Kill DOPを使用することで削除することができます。
-
Vellum Solver SOPをダブルクリックして中に入ります。
-
⇥ TabメニューからPOP Kill DOPを追加し、その出力を
FORCE
ノードの入力に接続します。 -
POP Kill DOPのパラメータエディタの Rule タブで、 Enable を有効にして VEXpression フィールドを編集できるようにします。
-
以下のエクスプレッションを入力します:
if (length(@v) > 1.7) { dead = 1; }
この短いエクスプレッションは、各パーティクルのv
Velocityベクトルから長さ(=速度)を計算し、それを閾値と比較します。
パーティクルの速度が1.7
より大きい場合に条件が満たされ、パーティクルが削除されます。
この閾値は、いくつかのテストシミュレーションの結果から決めたものです。
摩擦 ¶
流体をお椀の表面上に付着させるには、摩擦を追加すると良いでしょう。
Vellumには2通りの方法(パーティクル単位の摩擦、オブジェクト摩擦)が用意されています。
vellumfluid1
ノードのパラメータを見ると、 Friction と Dynamic Friction があるのがわかります。
これらのパラメータは、呼応するVellum Solver SOPの Static Threshold と Dynamic Scale で乗算されます。
このシーンでは、オブジェクトベースの摩擦を使用します。
-
Attribute Create SOPを追加します。
-
このAttribute Create SOPは、お椀のノードチェーン内のRevolve SOPとTransform SOPの間に挿入して接続します。
-
Attribute Create SOPのパラメータエディタで、 Name パラメータに
dynamicfriction
と入力します。 -
Vellumはジオメトリをポイントとして解釈するので、必ず Class を Point に設定してください。
-
Value フィールドの1番目のコンポーネントに
4
と入力します。
キャッシュ化 ¶
シーンのシミュレーションには時間がかかるので、その結果をディスクに保存するべきです。 Vellumには、ジオメトリ、拘束、コリジョンを一工程でキャッシュ化できる専用ノードが用意されています。
-
fluid 階層内で、Vellum I/O SOPを追加し、その3本の入力をVellum Solver SOPのそれぞれ呼応する出力に接続します。
-
Vellum I/O SOPはデフォルト設定のままで、 Save to Disk ボタンまたは Save to Disk in Background ボタンをクリックします。これらの方法の違いは、後者の方はHoudiniのUIの応答があります。
下図が完成したネットワークセットアップです:
これでシミュレーションを開始する準備が整いました。
プレイバーにあるボタンを押します。
すべてが期待通りに動作すれば、その結果は以下の動画と同じようになるはずです。
パーティクルが異なる位置と時間でソーシングされているのがわかります。
摩擦によって流体はお椀の表面に付着し、より自然なルックになっています。
クリームの流体は Density が最も低いので、他のチョコレートとキャラメルの流体よりも上に浮きます。
以下の動画は、 Particle Size を0.002
に設定したシミュレーションです。
以下の動画では、すべての Phase パラメータが1
です。
流体がさらに混ざるようになり、ほとんどの表面構造が消えてしまいました。
特に白いクリームのパーティクルの挙動が完全に異なっています。
ファイル ¶
このサンプルには、 Viscosity と Surface Tension の設定が異なるVellum流体を相互作用させるセットアップの作成を始めるのに必要なオブジェクトが含まれています。
このサンプルには、 Viscosity と Surface Tension の設定が異なるVellum流体を相互作用させる完全なセットアップが含まれています。