Gas Project Non Divergentについて


本記事は、Houdini Apprentice AdventCalendar 2021 18日目の記事になります。

本記事では、煙や水などの流体計算においてDivergence(発散)を制御するGas Project Non Divergent DOPノードについてご紹介します。

▼ こちらの記事では、サンプルファイルを配布しています ▼
サンプルファイルは、下記のリンクからダウンロードすることができます。

※こちらの記事では、Houdini19.0.383を使用しています。

1.Gas Project Non Divergent DOPノードについて

煙や炎、液体のシミュレーションを行う際には、計算領域が必要となります。この計算領域は境界(Boundary)や場(Field)、グリッドなど様々な呼び方をされますが、基本的には同じ領域を指しています。これらシミュレーションは「グリッドベースシミュレーション」と呼ばれ、名前の通り格子状に区切られた計算領域内でベクトル計算を行います。

Divergence(発散)はこの計算領域内において、外部からの流体の流入量と流出量を計算することで求められる情報です。Houdiniに限らず、流体の計算を行う上では、”流入量 – 流出量 = 0”である必要があり、流入と流出が等しく、質量保存則に従っている必要があります。この状態が「Divergence-Free(発散なし)」と呼ばれる状態です。

シミュレーションを行う際には計算負荷の軽減のため、流体は体積そのものが膨張や収縮をしないという前提で計算が行われます。そのため、発散ありの状態で計算を行った場合、流体らしい振る舞いが再現しづらくなります。

流体の挙動自体は最終的にはVelocity Fieldで制御されますが、ここに渦を生成するためには「Divergence-Free(発散なし)」の状態に設定する必要があり、その役割を担うノードがGas Project Non Divergent DOPノードになります。

2.関連ノード/機能

関連ノード:
Gas Project Non Divergent Adaptive DOP
Gas Project Non Divergent Multigrid DOP
Gas Project Non Divergent Variational DOP

上記の3つのノードはいずれもVelocityフィールド を受け取り、Divergenceがこれらのノードのパラメータより指定されたフィールドと一致するように調整します。

またこれらのノードは、DOP階層内でSolverを構成するノード(Micro Solver)として組み込まれており、それぞれトレードオフの関係にあります。

Gas Project Non Divergent Variational:

こちらのノードではボクセル間の正しい流束を計算し、合流点を適切に方程式に組み込むことができるようになります。
流体シミュレーションでは、圧力の計算が非常に重要です。

また、シミュレーション領域(境界)の定義が適切に行われない場合、アーティファクトが発生する可能性があります。
例えば、容器が密閉されいるのに中の水が漏れ出してくる、物体の表面を流体が流れるときにボクセルの形状が目立つ(アーティファクトが発生する)など)が該当します。

のちに、このノードは他のGas Project Non Divergence系のノードの機能を含むようになりました。

Gas Project Non Divergent Adaptive:

こちらのノードの機能は、Variational DOPとよく似ています。
Variational DOPとの違いは、このノードが一様なボクセルではなく、Voxel Octreeを扱うことが可能であることです。

このノードでは、表面から離れたボクセルを粗く保持することができ、ボクセルのサイズを均一に保持するよりも計算パフォーマンスが向上します。
(極端ですが例えば水のシミュレーションで、目視で確認しやすい表面をより正確に計算し、内部を簡略化して計算するといった場合に有効です。)

上記のGas Project Non Divergent Variational と Gas Project Divergent Adaptiveは与えられたSurfaceフィールドの内側に圧力投影を行います。
アルゴリズム的には、共役勾配法を使用して線形システムを計算します。

使用例としましては、Flip Solver DOPノード内で粘性を計算する際に用いられます。

Gas Project Non Divergent Multigrid:

こちらノードでは、スピードとスケーラビリティを優先しており、VariationalやAdaptiveと同等の正確性を持った境界の定義を犠牲にしています。

また、こちらのノードでは、Surfaceフィールドの入力パラメータがありません。 つまり、流体の表面位置をフィールドとして維持しなくてよい煙や炎のシミュレーションで使用できるノードになります。

内部的には、反復直交投影(“iterated orthogonal projections”(IOP))と呼ばれる技術を使用しています。 このノードでは、マルチグリッド法と呼ばれる微分方程式の解法を使用して、線形システムの計算を行います。

また、こちらのノードを使用することで、Divergence-Free(発散なし)の状態に設定することができます。

3.使用例

Pyro Solver SOPノード、Smoke Solver SOPノードなどのアセットノードでは、既にGas Project Non Divergent DOPノードが組み込まれているので、新たにGas Project Non Divergent DOPノードを接続した場合、変化が分かりづらいかと思います。

ここでは、Micro Solverを使用して、簡易的に煙をシミュレートして変化を確認したいと思います。

1. Sphere SOPノード、Pyro Source SOPノード、Attribute Noise SOPノード、Volume Rasterize Attributes SOPノードを使用してSource Volumeを作成します。(パラメータの数値は、サンプルファイルをご確認ください。)

2. DOP Networkを作成し、ノード内に入ります。

3. DOP階層内で入力データの計算をタイムステップごとに計算するため、メインソルバーとしてMultiple Solver DOPノードを作成し、Output DOPノードに接続します。

4. Multi Solver DOPノードの第1入力はシミュレーションオブジェクトを入力します。Smoke Object DOPノードを作成して、第1入力に接続します。

5. この後接続する各マイクロソルバーを1つずつ処理できるようにするため、Gas Substep DOPノードを追加し、Multi Solver DOPノードの第2入力に接続します。

また、変更したパラメータは以下の通りです。
Velocity Field:vel
Default Operation:Set Always

6. SOP階層内のSource Volumeを読み込むため、Volume Source DOPノードを作成し、Gas Substep DOPノードの第2入力へ接続します。

また、変更したパラメータは以下の通りです。
Input:First Context Geometry
Source Volume①:temperature
Target Field①:temperature
Source Volume②:density
Target Field②:density

7. Gas Advect Field DOPノードを追加します。
こちらのノードはvelocityによって他のフィールドを駆動(Advection[移流])するために用います。 velocity自身も1フレーム前のデータから更新を加える必要があるので、Advectionを行う対象に含まれます。
また、各フィールドごとにGas Advect Field DOPノードを設定します。

変更を加えたパラメータは、以下の通りです。
Field:Advectionするフィールドの名前 (vel、density、temperatureなど)
Default Operation:Set Always

8. velocityの初期値が設定されていないので、現状では煙がその場に留まり続けます。 そこでGas Buoyancy DOPノードを追加し、velocityを更新できるようにします。

9. ここまで設定したシミュレーションは発散しており、単純にY軸方向のvelocityによってdensityとtemperatureが移流されている状態です。 そのため、渦がありません。 ここで、Gas Project Non Divergent DOPノードを追加し、発散を除去します。

今回の記事は以上になります。

Houdini19のリリースに伴い、SOP Solverが更に充実してきていますが、コアはDOPシミュレーションであることは変わりありません。

Gas Project Non Divergent DOPノードは直接的に扱う機会が少ないノードかもしれませんが、カスタマイズを行う際には必要な機能です。
サンプルファイルもございますので、合わせてご確認いただければと思います。

また、弊社Youtubeチャンネルにて、Houdini19.0 PyroFXの紹介を行っております。
Divergenceに関する内容には触れておりませんが、Pyro関連の新機能のご紹介をさせていただいております。
合わせて、以下もご覧いただければと思います。

INDYZONE CAFE 第10回目:Houdini 19.0 PyroFXの紹介 

Part1:Source Point/Source Volumeの作成 
https://www.youtube.com/watch?v=b858BBfK-og&t=60s

Part2:シミュレーション 
https://www.youtube.com/watch?v=xG1kWWWlruY

Part3:Post-Process、その他の機能紹介 
https://www.youtube.com/watch?v=MjNelmZhNjM&t=3s

ここまで読んで下さり、誠にありがとうございました。

次回のHoudini Apprentice Advent Calendar2021 19日目は、「bechica」さんの記事になります。