低コストなFluidの使用方法を解説します。
TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
日本でも指折りのHoudini アーティスト。
手がけてきた作品は数々の賞を受賞している。
代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
www.transistorstudio.co.jp
blog.junichiakimoto.com
EDIT_小村仁美 / Hitomi Komura(CGWORLD)
POPでFluid
Houdiniには、これまで大きく3種類のフルイドシミュレーションが存在しました。比較的広範囲で穏やかな動きに最適なVolumeベース、比較的小規模でリアルなディテールに最適なSPH、VolumeとSPHの長所を併せもつハイブリッドタイプのFLIPの3種類です。どれも一長一短があり、シチュエーションによって使い分けます。
ただ、近年ではFLIPの登場回数が増えたと思われます。それはやはりディテールを出しやすいことと、それでいて低コストだからに他なりません。今回紹介するPOP Fluidはひっそりと登場したものの、設計は非常に新しく、リアルな結果よりもそれらしいものを低コストで手に入れたい場合に最適な手法です。
また、POPをベースに構築できるのも魅力的で、操作性にも優れています。今後さらに発展していくであろうこのPOP Fluidは、新しくなったWhitewater Solver DOPのために開発されたPOPノードの1つです。ただ、PBDをベースに設計されており、さらにそのコアのソルバはOpenCLをベースにしているため、非常に高速です。イメージとしては、Particleの動きをそのままPBDベースのFluidに変換してしまうような雰囲気で扱うことが可能になっています。
今回のHoudiniプロジェクトデータはこちら01 SOP Flow
まず、SOPでシミュレーションの下準備をします。今回は、基本的にはPOPのシミュレーションをベースに構築します。動きの軸にはカーブを使ったForceを使用したいので、ベースとなるカーブから作成していきます【A】。作成したカーブを適量でResampleした後、Sweep SOP【B】でメッシュを張ります。その際、NURBSのサーフェスになるように、Cross SectionのCircle【C】をNURBSで作成しておきます。
Sweep SOPのセッティングは、Ramp Parameter【1】とFloat Parameter【2】を追加して、メッシュの形状をコントロールします。chramp()のExpressionを使用して形状にRampの形を流し込みます【3】。
このように作成したNURBSのサーフェス【4】を、Carve SOP【D】でカーブをExtractします【5】。これで、螺旋状のカーブを作成することができました。次に、新たにCarve SOP【E】【F】を使って、始点と終点のPointをExtractします。ここに、SourceとなるPointとSinkとなるジオメトリ【G】をコピーします【H】。Source Pointは、Point from Volume SOP【I】を使って作成します。
Point Separation【6】は、DOP内の数値をリファレンスします。Jitter Scale【7】を大きくして、Jitter Seed【8】は$Tで毎フレーム変動するように設定します。Sink用のジオメトリは、終点でコリジョンになるような大きさのPolygonを用意します。これで下準備は完了です【9】。
02 POP Simulation
まず、通常のPOPによるParticleシミュレーションフローの構築をします。POP Object DOP【A】を作成し、POP Solver DOP【B】に接続します。続いて、POP Source DOP【C】を作り、Emission TypeはAll Pointsに設定します。これで、SourceのPointからParticleが発生します。Lifeの設定などはせず、基本的にデフォルトのままで問題ありません。
次に、Forceの設定をします。POP Curve Force DOP【D】を使って、SOPで準備したカーブを読み込みます【1】。これにより、カーブに沿った動きになります。この際、3つの値をメインに調整していきます。Follow【2】はカーブに沿って進む力、Suction【3】はカーブに吸い寄せられる力、Orbit【4】はカーブを軸に回転する力になります。これらのバランスで見た目が決まってきます。
また、このParticleにPOP Force DOP【E】を使ってNoiseのForceを追加します。これで、動きにさらなるバリエーションを追加します。POP Drag DOP【F】は動きが激しくなりすぎないように、抵抗をかけるForceです。これも好みで調整しましょう。
最後に、POP Collision Detect DOP【G】を使って、カーブの終点でParticleを削除します。BehaviorのResponseをDieにすることで、衝突したParticleが消されます。これでベースシミュレーションフローが完了です【5】。Velocityの値を可視化することで、より動きを調整しやすくなります。今回、わかりやすいようにVOP【H】でCdの値に変換していますが、Vizualizeの方法は様々です【6】。
[[SplitPage]]
03 POP Fluid
ベースのフローが完了したら、最終的にPOP Fluid DOP【A】を使って、ParticleをFluidへ変換します。追加するノードは1つですが、実際は数多くのMicro Solverの集まりで、PBDをベースにした設計になっています。これ1つで、動きに対して非常に簡単にFluidの質感を出すことができます【1】。
実際にディテールを見てみると、通常のParticleにメッシュを貼ったもの【2】と、Fluidに貼ったもの【3】では、一目瞭然のちがいが見て取れます。
設定も非常にシンプルです。パラメータの解説は後述しますが、基本的にFluidの特性をもたせ、凝集と張力をシミュレーションし、ParticleそれぞれのPositionを更新するといったものです。元々はWhitewater Solver DOPの内部にひっそりと使用されているものですが、今後発展してメインでも使用していくようなアプローチになると考えられます。SPHのような粒子法を用いたシミュレーションがそのコストの高さから嫌われがちではありますが、PBDのアプローチとOpenCLの存在がある昨今、ディテールを求めるようなシチュエーションでは、非常に有用だと考えます。
04 Operators
主要ノードを解説します。
●POP Fluid DOP
今回紹介するノードは、POP Fluid DOPです。Particle間を凝集や張力といった特性を考え、フォースでその距離を保ちます。シンプルな流体を表現するのにはうってつけのノードです。
Projection Type:主にUpdate Positionsを使用します。Particleの位置とVelocityを更新します。
Particle Separation:近接しているParticleとのターゲット距離の値です。
Constraint Iterations:Particle間の距離を正確に保つための精度です。
Constraint Stiffness:Partcie間の距離を保とうとする力です。
Maximum Acceleration:Constraintによって加速する最大の速度です。高いほど、Constraintが不安定になる可能性があります。
Tensile Radius:Particleが凝集しすぎないようにする最小の距離です。
Tensile Strength:凝集したParticleが反発する力の大きさです。
Viscosity:Velocityを拡散し、近接するParticleの動きを寄せて、動きを粘着質にします。
Vorticity Confinement:Vorticityを維持し、エネルギーが中和されないようにします。
Use OpenCL:シミュレーションの際に、OpenCLを使用します。環境にもよりますが、シミュレーションが高速になる可能性が高いです。
-
「Houdini COOKBOOK +ACADEMY」
Houdiniを基礎から楽しく学ぶオンライン講座
公開日程:毎週金曜日公開(予定)
価格:1,200円(税込)
※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
cgworld.jp/special/houdinicookbookacademy