Ocean Blend

FLIP Fluid (シミュレーション) と Ocean Surface (デフォメーション) のブレンド

Flip Tankを使った移動するオブジェクトに対する限定的な領域でのシミュレーションと、Ocean ツールによるより広範囲なデフォメーションの二つをブレンドする方法を紹介。

使用バージョン: Houdini FX 13.0.580

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

基本的な手順

  1. アニメーションオブジェクトとFlat Tank (シミュレーション)の作成
  2. Ocean Waves (デフォメーション)作成
  3. Flat Tank から移動オブジェクト周辺の水面の切り取り
  4. Ocean Waveとの合成
#1と#2の順は特に重要ではなく、どちらが先であっても変わらない。

1. アニメーションオブジェクトとFlat Tank の作成

まず最初に移動するオブジェクトとその周りのシミュレーション用の流体を作る。Flat Tank ツールを使うことで、オブジェクトの動きに追随するシミュレーション用Fluidを作成可能。

  1. Create シェルフから Torus ツールを実行、Enter キーを押して原点に配置。
    • TX に -($FF-1)/5
    • RZ に ($FF-1)*8
    とする。これで torus_object1 が X軸上を -X 方向に進んでいく。

    この時点では、Ocean Surfaceとはまったく干渉していない。 このため、Torus の周りだけに小さなシミュレーション用のFlat Tankを作成。このシミュレーションによる水面と Ocean Surface をブレンドできるようにするのが今回の目的。

  2. 作成された torus_object1 を選択したまま、 Ocean FX シェルフから Flat Tank ツール(一番右)を実行。
  3. Center となっているラベルをクリックするとエクスプレッションと値の表示がトグルされる。エクスプレッションを表示した上で次の編集を行う。
    • X: centroid("../mergefollow", D_X) + ch("sizex")/4.0
    • Y: 0
    • Z: centroid("../mergefollow", D_Z) // そのまま
    これにより、Torus がFlat Tank の前方に配置され、後方により多くのシミュレーション領域が出来る。
  4. Scene ビューに戻りimport_whitewater の表示をオフにする。これは、当分必要ない。
  5. アニメーションの長さも60フレームぐらいでよい。
  6. 再生してみると、Torusの動きに追随する形で Flat Tank が一緒に移動しているのがわかる。

2. Ocean Waves の作成

次にOcean Wavesをつくりシミュレーションよりも広い海面を作成する。後ほど二つをブレンド。

  1. Ocean FX シェルフより Ocean Waves ツールを実行。これにより、ビューポートに Ocean Surface (海面)が現れ、ネットワークビュー (Scene (Object) レベル) に、
    • ocean_surface
    • ocean_interior
    の二つが追加され、デフォルトの状態では、ocean_surface の中身がネットワークビューに表示されている。

    再生ボタンを押すと海面上に波が表現されるが、これはシミュレーションではなくデフォメーションである。再生速度も極めて速い。ただし、Torus も Flat Tank も Ocean Surface とは干渉していない。

  2. 後々のために、ocean_surface ノード内の ocean_render ノードの Volume タブの下の方にある Rest Volumes タブ以下にある Rest Displacement をオンにしておく。

3. 水面の切り取り

  1. flattank_fluid ノードの中に入る。
  2. ノードネットワーク内の keepponlypoints ノードの出力から、bound ノードを追加作成。
    • Lower Padding と Upper Padding の値を調整して、Torus の周りの残したい部分の広さを決定。 ここでは、Upper Padding Y を 0 とする以外、残りはすべて -1。
  3. 追加した bound1 の出力から VDB From Polygons ノードを追加作成。
  4. この結果をすでに存在する convertvdb1 の3番目(一番右)の入力に挿入。

    これにより、ボリューム表面のうち bound1で定義されたところだけが切り取られて表示される。
    もし横幅が広いと思えば、 /obj/flattank_initial/wavetank の Sizeの値を変更するか、 bound1 の Paddingの値を再調整してみる。
  5. convertvdb1 の一つ下流のattribtransfer1の出力から AttribVOP を追加作成。
  6. attribvop1の中に
    • Length
    • Fit Range
    • Bind Export
    の3つのノードを作成。
  7. 以下のように接続する
    • geometryopglobal1 (v) から length1 (vec)
    • length1 (len) から fit1 (val)
    • fit1 (shift) から bind1 (input)
  8. bind1 の parm となっている Name を、mask と書き換える。
  9. fit1 のsrcmin と srcmax を真ん中マウスボタンを使ってPromote Parameter としておけば、VOPノードに入らなくともminとMaxの値を調整可能。
  10. 一つ上に上がって Color ノードを追加。
    • Color Type を Ramp from Attribute に。
    • Attribute を mask に。
    Viewモードを Hide Other Objects とすれば、影響範囲が視覚化されたのが確認できる。

4. Ocean Waveとの合成

シミュレーションによる Ocean (flattank_fluid) とデフォメーションによる Ocean (ocean_surface) をブレンドするためには、ocean_surface 以下の ocean_render ノードをflattank_fluidの中に持ち込んでシミュレーションに組み合わせる必要がある。そのためには、

  1. flattank_fluid ノードの中に入る。
  2. Object Merge ノードを追加作成。まだ接続しない。
    • Transform を Into This Object。
    • 下へスクロールし、Number of Objects を1に、
    • Object 1 に /obj/ocean_surface/ocean_render を指定。
  3. Color (color1)ノードのから AttribVOP (attribVOP2) ノードをもう一つ追加作成。
  4. object_merge1からの出力を左から2番目に接続。
  5. attribvop2の中に入り以下の要領でノードを作成、接続する。
    1. Volume Sample Vector from File を追加作成 (Volume Sample from File ではない)。
    2. geometryopglobal1 と volumesamplevfile1 の間で
      • Outupt2 から filname
      • P から to samplepos
      と接続。
    3. volumesamplevfile1 のパラメータビューで
      • Signature を Primitive Number から Primitive Name に変更
      • Signature Name を restdisplace と指定
    4. Bind ノードを追加作成 (Bind Export ではない)。
      • parm を mask に変更。
    5. Complement ノードを追加作成。
      • bind1 (mask) から complement1 (val) に接続。
    6. Multiply ノードを追加作成。次の順で接続。
      • volumesamplevfile1 の volume 出力を multiply1 の input1 に。
      • complement1 の complement 出力を multiply1 の input2 に。
      • それぞれのデータ形式が異なるため、順番は非常に重要。逆では正しい結果にならない。
    7. Add ノードを追加作成。次の順で接続。
      • multiply1 の product 出力を add1 の input1 に。
      • geometryopglobal1 の P 出力を add1 の input2 に。
      • add1 の Sum 出力を geometryvopoutput1 の Pに。

    8. これで、Flat Tank の表面が Ocean Surface と同じようになる。
    9. 形状が正しく表示された場合、3-10で作成した color1 はBypass するのが良いと思われる。
  6. シーンレベルに戻り、必要であれば、import_whitewater をオンにする。

まとめ

ここまでの長い手順によって、シミュレーションによる水面とデフォメーションによる水面を合わせることが出来た。いくつか考慮する点もある。

  • シミュレーションによって長い航跡を作成し、それをOcean Surfaceと合わせるのであれば、Flat Tankを大きめにする必要がある。
  • マスクの大きさ、強さも検討する必要がある。
  • 非常に荒々しい波のデフォメーションと シミュレーションをあわせるのは現実的ではない。
  • この方法を用いた場合でも、二つの水面を一つとして扱ってレンダリングするのではなく、それぞれ別々にレンダリングし、合成するのが良いとおもわれる。
  • デフォルトでは、Ocean Surface と Flat Tank ではアサインされているマテリアルが異なるので注意が必要。
  • レンダリングおよび合成に関してはまた別の機会に。

参考シーンファイル:

5 件のコメント:

  1. 良い講座よくみました。
    レンダリングについては、いつ頃上がって来るでしょう?
    いつもお世話になっています。ありがとうございます。

    返信削除
    返信
    1. こんにちは・こんばんは。
      しばらくは書く予定がありません。申し訳ございませんが、しばらく(2017年2月頃まで)お待ちください。

      削除
  2. Thank you very much for posting this. Even thought I don't understand Japanese at all but your hip file really helps me. Much appreciate! ;)

    返信削除
    返信
    1. Glad that this helped. Check out the new version of Houdini (16) next month.
      https://www.youtube.com/watch?v=Ry_mD67cO5c
      This workflow should be much easier there.

      削除
    2. Oh yeah, I was on the H16 beta test, it works so much better than 15. Are you work at VFX industry in Japan? I'm wondering how's the industry overthere?

      削除