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】。
[[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