H16 以降はこちら
2016-01-06: Houdini 15対応のため内容を更新。
Houdini のFLIP Fluid 上にオブジェクトを浮かばせる方法を I) 単一オブジェクトの場合と II) 複数オブジェクトの場合 とに別けて紹介。
使用バージョン: Houdini FX 15.0.346 (オリジナルは13.0.566)
参考シーンファイルへのリンクは一番下にあり。
I. 単一オブジェクトの浮遊
Torus 一つとFLIP タンクの場合:
- Create シェルフから Torus をクリック、Enter キーを押して確定。原点に配置後、0,3,0に移動。
- Rigid Bodies シェルフから RBD Object (一番左) を実行。
再生すれば、落下する。 - Particle Fluids シェルフから FLIP Tank (左から2番目) を実行。Enter キーを押して確定。とりあえず大きさはそのまま。
再生すれば、Torusは落下しFLIP Tank 水面と干渉するが、浮かずにそのままTankを突き抜けてしまう。 - AutoDopNetwork の中に入り、fliptank (FLIP Object) を選択。Particle Separation を 0.1 に変更 (デフォルトの値は 0.25)。
- flipsolver1 を選択。Volume Motion タブの下の部分にある Solver タブ 以下、Feedback Scale を 0 から 1 に変更。
- 同じく flipsolver1 の Substeps タブ以下の Max Substeps の値を 2 から 1 に変更。
Feedback Scale を 1 にした場合、Substep 数は個々のソルバで設定するのではなく、AutoDopNetwork のSubsteps で一括管理するのが望ましい。そうしないと不安定な結果になる。 - 同じく AutoDopNetwork 以下の torus_object1 (RBD Object ノード) を選択。
Physical タブにある Density を1000から 500 に下げる。追加設定により、とりあえず変更は不要。 - 再生すると、落下した Torus は水中中ほどで止まりその後浮上してくるが、135フレーム目ぐらいで完全に静止してしまう。
- AutoDopNetwork 以下の torus_object1 を選択。Collisions タブ-> Bullet Data タブの下から2番目にある Linear Threshold を0.6に下げる (デフォルトは0.8)。
ここまでが 01_floatSingleObject.hip。
Collision オブジェクトの確認
Torus 以外のオブジェクトや複数のオブジェクトを扱う際に RBD シミュレーション (落下) と FLIP シミュレーション (流体) がどのように衝突判定をしているのかを確認するためには以下のことが可能。
試す場合は、ビューポート右上の Show or Hide Other Objects のスイッチを Hide Other Objects にしておくと良い。
- RBD シミュレーション
- AutoDopNetwork の中に入り、torus_object1 を選択。
- Display Geometry をオフにする。
- Collisions タブ > Bullet Solver タブ > Volume タブの Show Guide Geometry をオンにする。
- Geometry Representation を Concave に設定。
- これによって、RBD Solver による衝突判定オブジェクトが可視化可能。
Bulletの影響下にある間は青で、影響がなくなると赤くなる(上記の通りに行えば109 フレーム目から)。さらに動き続けさせるには、Linear Threshold の値を 0.2 などに下げる。
RBD Solver タブにも Show Collision Guide Geometry があるが、どちらを使うかは、AutoDopNetwork にある rigidbodysolver1の Solver Engine の値次第。これが Bullet なら Bullet を、RBD ならRBD。
いずれにせよ、これらは FLIP シミュレーションが使っている衝突判定オブジェクトの元にはなっているが、そのものではない。
- FLIP シミュレーション
結局のところ、挙動を決定する上で最も重要な FLIP 流体のパラメータは Particle Separation である。衝突オブジェクトが正しく干渉しない場合、Substeps などを変更する前に、この値を調整することが肝要。上記の複数オブジェクトの例の場合、以下の方法が有効。- ネットワークエディタで /obj/AutoDopNetwork の中に入り、torus_object1 を非表示にする。
赤枠で囲まれたフラグで非表示化が可能。勿論これを使わずに Display Geometry と Show Guide Geometry をオフにしても良い。 - fliptank ノードの Guide タブ -> Visualization タブで以下のように設定。
- Particles をオフ
- Collision をオン
- Pressure をオン
最初のフレームでは何も表示されないが、シミュレーションが進むと以下のように表示される。下は複数オブジェクトの場合の例。
左は Particle Separation = 0.1 @60 フレーム目、右は 0.25 @21フレーム目。
中央の色分けされたプレーンの格子の大きさがシミュレーションの解像度を示している。また、青紫のオブジェクトは、Fluid が認識する衝突オブジェクトの様子。この例の場合、 Particle Separation が 0.25 (デフォルト) では非常に荒い。よって可能な限り小さな値にする。
注意: Particle Separation を半分にすると解像度は2倍になるが、必要になるメモリは3次元なので 8 倍 (2x2x2) になる。桁を一つ落とせば1000倍。大きな FLIP オブジェクトの解像度をいきなり上げると著しくメモリを消費することになる。
- ネットワークエディタで /obj/AutoDopNetwork の中に入り、torus_object1 を非表示にする。
II. 複数オブジェクトの浮遊
正しいノードの接続方法を早く理解するには新しいシーンでやるのが良いと思われる。よって、
- File->New。
- Create シェルフの Torus をクリック、Enter キーで確定。原点に配置後、0,3,0 に移動。
- 作成された torus_object1 の中に入り、Grid ノードを作成。
シェルフから行う場合は、ツールを実行する前にTool Options を Create in context とし、作成される Grid が torus_object1 内に作成するようにする。
grid1の- Size をそれぞれ 9、
- Rows と Columns をそれぞれ 5
- Copy ノードを作成
- torus1 を copy1 の左に
- grid1 を copy1 の右に
- Transform Using Template Point Attributes をオフにする。
これにより、コピーした 25 個すべてのTorus の向きが最初の Torus と同じになる。 - Scene ビューに戻り、 torus_object1 を選択したまま、Rigid Bodies シェルフから RBD Fractured Object を実行。
すると RBD Packed Objects を作成するか RBD Fractured Objects を作成するか訊かれる。
ここでは RBD Fractured Objects を選択。Packed Object を選択すると、のちの FLIP との衝突判定が単一方向になり、Fractured Objects を選択すると双方向になる。 - 単一オブジェクトの時と同様、Particle Fluids シェルフから FLIP Tank (左から2番目) を実行。Enter キーを押して確定。
- /obj/fluidtank_initial/fluidtank の中で Size を 12, 5, 12 とする。
これで、作成した 25 個の Torus より大きなFLIP コンテナが出来た。 - AutoDopNetwork の中に入り、fliptank (FLIP Object) を選択。Particle Separation を 0.1 に変更。
- flipsolver1 を選択。
Volume Motion タブの下の部分にある Solver タブ 以下、Feedback Scale を 0 から 1 に変更。 - 同じく flipsolver1 の Substeps タブ以下の Max Substeps の値を 2 から 1 に変更。
- AutoDopNetwork 以下の torus_object1 (RBD Object ノード) を選択、
- Display Geometry をオフ
- Collisions タブ -> Bullet Data の Show Guide Geometry をオン。
- Geometry Representation を Concave に変更。
- これで再生すると、25個の Torus が落下し、すべてバラバラに FLIPと干渉するが、この設定では、84フレーム目から Torus の一部が静止し始め、96フレーム目までにすべての Torus が静止してしまう。
左が 84 フレーム目、右が 96 フレーム目。青が動いているオブジェクト、赤が静止したオブジェクト。 - 単一オブジェクトの例では Linear Threshold を使用して動きを調整したが、ここでは /obj/AutoDopNetwork の Simulation タブの Sub Steps を 2 に設定して再度シミュレーションを実行する。
https://vimeo.com/150880567
ここまでが 02_floatMultiObjects.hip
まとめ
ここまで単一または複数オブジェクトをFlip 流体に浮べる方法を示した。
- 挙動を決定する上で最も重要な FLIP 流体のパラメータは Particle Separation である。衝突オブジェクトが正しく干渉しない場合、Substeps などを変更する前に、この値を調整することが肝要。
- FLIP fluid が他のオブジェクトと干渉するためには、FLIP Solverノードの Feedback Scale が0以上である必要がある。そして Feedback Scale を 1 にした場合、Substep 数の設定は個々のソルバで行うのではなく、AutoDopNetwork で一括管理するのが望ましい。よって、FLIP Solver の Max Substeps は 1 にする (デフォルトは 2)。そうしないと非常に不安定になる。
- 浮力は、浮かせるオブジェクトの Densityと Feedback Scale とを調整して行うが、Fluidタンクのパーティクル数が変わると Densityの値も再調整する必要あり。
- シェルフツールを使うと、単一オブジェクトの場合 AutoDopNetwork 内の torus_object1 は RBD Object ノードタイプであるのに対し、複数オブジェクトは、上記の方法で作成した場合、作成されたノード名が同じであっても、ノードタイプは RBD Fractured Object である。よって単一オブジェクトを (RBD Objectで) 作った上で Geometry ビューで Torus の数を複数にしても単一オブジェクトとして動作する。ここは注意が必要。
- RBD Packed Objectは FLIP は、双方向で衝突判定しないので使えない。
- Houdini 15 ではメモリはディスクに負担をかけずに解像度を上げる様々な機能が追加されたがこれに関してはまた別途紹介したい。
参考シーンファイル:
- H16 以降はこちら
- H15: h15_flipfluidfloat.zip (352KB)
- H13: flipfluidfloat.zip (308KB)
最終更新 2017-10-04
0 件のコメント:
コメントを投稿