記事の目次

    FLIPの浮力を利用したシミュレーションを紹介します。

    TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
    日本でも指折りのHoudini アーティスト。
    手がけてきた作品は数々の賞を受賞している。
    代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
    www.transistorstudio.co.jp
    blog.junichiakimoto.com


    EDIT_小村仁美 / Hitomi Komura(CGWORLD)

    ●CGWORLD Online Tutorialsにて特別無料配信中!
    【無料】Houdini COOKBOOK +ACADEMY 特別編 ~コロナをやっつけよう!~

    密度の混在

    今回は、FLIPの密度の違いを表現したシミュレーションにチャレンジしたいと思います。前回は粘性の混在をシミュレーションしましたが、今回は密度を混在させて、どのような挙動をするのか検証したいと思います。

    液体の密度は、いわゆる比重に直結するため、その際に浮力に差が生じます。これを利用することで、水と油のような、分離する様子を表現することができます。今回は、もう少しシンプルに、水と空気くらいの密度の差を作って、まるで泡が作られていくようなシミュレーションにしたいと思います。

    ただ、まじめにやると非常に表現が難しいモチーフではあるので、今回は挙動がわかりやすい状態でお見せしていきます。今回のように密度に差をもたせるアプローチがわかれば、今後応用として、空気の層との摩擦などをシミュレーションに採り入れ、もう少し巨大な水の挙動も表現できたりします。

    Houdiniでは非圧縮の空気はシミュレーションできるようになりましたが、空間にある空気層との摩擦などは自動的にシミュレーションできません。ただ、密度の違いを採り入れることで、そういった表現も可能になるので、ぜひ今回のアプローチを足がかりにしていただければと思います。

    今回のHoudiniプロジェクトデータはこちら

    01 Source Setup

    ソースのセットアップを解説します。

    今回のシミュレーションは、コリジョン内部にFLIPで液体を貯めていくしくみを作成します。湧き出すような雰囲気にしたいので、簡単に溜まっていくように、あらかじめベースとなるエリアを指定します。

    まず、コリジョンの形状となるジオメトリを読み込み配置します【A】。これをRemesh SOP【B】を使ってある程度均一なPolygonに変換し【1】、これをClip SOP【C】でカットして、Poly Fill SOP【D】で閉じます【2】。これをVDBへ変換して、少しだけ細らせておきます【E】【3】

    このVDBからFLIP Source SOP【F】で、ベースとなるPointとVolumeを作成します【4】

    このPointに対して、密度のちがいを決めるためのエリアを指定します。この作業にはVOP【G】などを用いて、Noise【H】を使って値を二値化【I】します【5】

    また、初期速度をPoint Velocity SOP【J】を使って、上方向と、Noiseによって、湧き出すような勢いを追加します【6】。これでソースジオメトリの完成です。最後に、ベースのジオメトリをVDB【K】へ変換してCollisionのVolumeとします【7】

    02 Sim Flow

    シミュレーションのフローを解説します。


    続いてシミュレーションの解説です。まず、コリジョンを設定します。Ground Plane DOP【A】を用いて地面を作成します。次にStatic Object DOP【B】でSOPからコリジョンジオメトリを読み込みます。これはVolume Sampleを用いて、Invert Sign【1】を使って反転して使用します。

    次にFLIP Object DOP【C】を作成します。次にVolume Source DOP【D】でソースのPointを読み込みます。この際、Life Expectancyの設定【2】と、Kill Inside SOPの設定【3】をします。Kill Inside SOPの設定は、湧き出すようなシチュエーションの際に役立ちます。

    その後、FLIP Solver DOP【E】で、Volume MotionからDensityをAttibuteで制御できるように設定します【4】。また、Particle Motionでは、Collision Detection【5】とAge Particle【6】を設定します。今回は比重が時間で変化するように設定したいので、ParticleにAgeをもたせて処理します。

    そうして、比重を変化させる為にSOP Solver DOP【F】を使用して、時間変化をシミュレーションします。SOPで設定した比重のエリアAttibuteを用いてGroupを作り、それによってParticleを切り分けます【G】。次に、Wrangle【H】で、AgeとRampを用いて時間変化を構築します【7】。もし、寿命でParticleを消したい場合は、【I】のようにWrangleでAttributeを制御して、Delete SOPで自動的に消失させるしくみを採り入れます。

    最後に、比重が変わらないエリアにもベースのDensityを設定して完了です【J】。また、デフォルトでは、ParticleはVelocityのSpeedが可視化されますが、今回のような場合は、Densityに可視化の設定を変えることで、一目瞭然になります【8】

    次ページ:
    03 Cache Flow

    [[SplitPage]]

    03 Cache Flow

    キャッシュのフローを紹介します。

    最終的にSOPでは至ってシンプルにデータを読み込みます。DOP I/O SOP【A】を用いてFLIPのデータを読み込み、これをFluid Compress SOP【B】を使って圧縮します【1】。データ量が大きいほど、ストレージを圧迫しますので、ここで軽量化しておくと、のちの作業が楽になります。このデータを書き出して完了です【C】


    この後の使用方法は様々ですが、DensityはAttributeに格納されているので【2】、切り分けても良いですし、色分けをしても良いでしょう。メッシュとParticleを切り分けて同時にレンダリングすることで、気泡を含んだような液体にすることも可能です。


    04 Operator

    主要ノードを解説します。

    ●Point Velocity SOP

    今回紹介するノードは、Point Velocity SOPです。

    今回のノードの特徴は、便利なHDAという意味での紹介で、これ自体の説明はほぼ不要だと思いますので割愛します。

    通常、こういった類のノードは、VOPなどを駆使してイチから組み上げて解説することも多いのですが、今回は敢えて使用してみました。実際に良くできているHDAで、今回のシチュエーションにおいては、十分に効力を発揮しています。

    なぜ、いつもはイチから組み上げることが多いかというと、筆者自身、便利さに慣れることが仇となるのを非常に恐れているからです。HDAのようなノードは、いつ大きく改変されてもおかしくないと考えており、あくまでも便利機能のひとつと認識しておかないと、いずれ痛い目を見そう......と考えているのです。

    また、人が作った便利ノードは、かゆいところに手が届かなかったり、パラメータの癖が自身とかけ離れていたりするものです。

    このように、便利機能はあくまでも参考にとどめ、必ず自分で組み上げられる前提で使用することが、Houdiniマスターへの近道だと信じています。


    • 「Houdini COOKBOOK +ACADEMY」
      Houdiniを基礎から楽しく学ぶオンライン講座

      公開日程:毎週金曜日公開(予定)
      価格:1,300円(税込)※セットでの割引販売有
      ※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
      受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
      cgworld.jp/special/houdinicookbookacademy