2016-01-11

FLIP Fluid でオブジェクトの浮遊


2017-10-03: Houdini 16 対応のため内容を更新。

Houdini のFLIP Fluid 上にオブジェクトを浮かばせる方法を

  1. 単一オブジェクトの場合
  2. 複数オブジェクトの場合
と別けて紹介。


使用バージョン: Houdini FX 16.0.736 (H15 時の記事はこちら)

参考シーンファイルへのリンクは一番下にあり。

I. 単一オブジェクトの浮遊

Torus 一つと FLIP タンクの場合:

  1. Create シェルフから Torus をクリック、Enter キーを押して確定。原点に配置後、0,3,0に移動。
  2. Rigid Bodies シェルフから RBD Hero Object (左から2番目) を実行。
      再生すれば、落下する。
  3. Particle Fluids シェルフから FLIP Tank (左から2番目) を実行。Enter キーを押して確定。とりあえず大きさはそのまま。
      再生すれば、Torusは落下しFLIP Tank 水面と干渉するが、浮かずにそのままTankを突き抜けてしまう。
  4. AutoDopNetwork の中に入り、fliptank (FLIP Object) を選択。Particle Separation を 0.1 に変更 (デフォルトの値は 0.25)。
  5. flipsolver1 を選択。Volume Motion タブの下の部分にある Solver タブ 以下、Feedback Scale を 0 から 1 に変更。
  6. 同じく flipsolver1 の Substeps タブ以下の Max Substeps の値を 2 から 1 に変更。

    RBD と Flip の相互衝突判定が行われる必要があり、この場合、Substeps を 1 にした方が安定した結果になる。
  7. 再生すると、落下した Torus は水中中ほどで止まりその後浮上してくる。
  8. 同じく AutoDopNetwork 以下の torus_object1 (RBD Object ノード) を選択。Physical タブにある Density を1000から 500 に下げると、Torus は軽いオブジェクトとなる。(やらなくとも良い)。
単一のオブジェクトであれば、このようにオブジェクトを水面に浮かばせることが可能。
ここまでが h16_01_floatSingleObject.hip (Density は 1,000 のまま)。

II. 複数オブジェクトの浮遊

正しいノードの接続方法を早く理解するには新しいシーンでやるのが良いと思われる。よって、

  1. File->New。
  2. Create シェルフの Torus をクリック、Enter キーで確定。torus_object1 ができる。原点に配置後、0,3,0 に移動。
  3. torus_object1 の中に入り、Grid ノードを作成。grid1 ができる。
      シェルフから行う場合は、ツールを実行する前にTool Options を Create in context とし、作成される Grid が torus_object1 内に作成するようにする。
    grid1の
    • Size をそれぞれ 9、
    • Rows と Columns をそれぞれ 5
    とする。
  4. Copy to Points ノードを作成
    • torus1 を copy1 の左に接続
    • grid1 を copy1 の右に接続
    • Pack and Instance をオンに
    • Transform Using Template Point Attributes をオフ
    にする。
      これにより、コピーした 25 個すべてのTorus の向きが最初の Torus と同じになり、また Torus はすべてパックされた状態になる。
  5. Scene ビューに戻り、 torus_object1 を選択したまま、Rigid Bodies シェルフから RBD Fractured Object を実行。
    すると RBD Packed Objects を作成するか RBD Fractured Objects を作成するか訊かれる。

    ここでは RBD Fractured Objects を選択。
      Packed Object を選択すると、のちの FLIP との衝突判定が単一方向になり、Fractured Objects を選択すると双方向になる。
  6. 単一オブジェクトの時と同様、Particle Fluids シェルフから FLIP Tank (左から2番目) を実行。Enter キーを押して確定。
  7. /obj/fluidtank_initial/fluidtank の中で Size を 14, 4, 14 とする。
      これで、作成した25 個の Torus より大きなFLIP コンテナが出来た。
  8. AutoDopNetwork の中に入り、fliptank (FLIP Object) を選択。Particle Separation を 0.1 に変更。
  9. flipsolver1 を選択。
    Volume Motion タブの下の部分にある Solver タブ 以下、Feedback Scale を 0 から 1 に変更。
  10. 同じく flipsolver1 の Substeps タブ以下の Max Substeps の値を 2 から 1 に変更。
  11. AutoDopNetwork 以下の torus_object1 (RBD Object ノード) を選択、
    1. Display Geometry をオフ
    2. Collisions タブ -> Bullet Data の Show Guide Geometry をオン。
    3. Geometry Representation を Concave に変更。
    4. これで再生すると、25個の Torus が落下し、すべてバラバラに FLIPと干渉する。
    これできれいなシミュレーションができた。

ここまでが h16_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 は、双方向で衝突判定しないので使えない。

参考シーンファイル:


最終更新: 2017-10-03

0 件のコメント:

コメントを投稿