本記事では、Houdini17.5からHoudini18.0にアップデートされた際に追加されたPyroシミュレーションおよびSparse Pyro シミュレーションで使用可能なノードや機能の紹介を、4回分に分けてご紹介します。
今回は第1回目としまして、Sparse Pyro シミュレーションについてのご説明と、新しく追加されたダイナミクスノードについてご説明させていただきます。
1. Sparse Pyro シミュレーションとは
Sparse Pyro シミュレーションは、「Sparse Volume」という形式のボリュームを用いることができるPyroシミュレーションです。「Sparse Volume」は、必要のない領域のデータをメモリ内に保持しないボリュームになります。そのため、シミュレーション全体としてこれまでよりも処理が速くなります。
画像1は、Houdini18.0からシェルフツールとしてPyro FXタブ内に用意された「Campfire」を使用し、「Smoke Object (sparse) ダイナミクスノード」のビジュアライズ機能を用いて計算領域を可視化したものです。
画像1. 領域の可視化
画像1における赤いワイヤーフレームで囲まれた領域が計算領域全体を表示したもので、緑のワイヤーフレームで囲まれた内側の領域が現フレームにおいて実際に計算されている領域になります。
2次元の図で示した場合、下の画像2のようなイメージになります。
画像2. 計算領域のイメージ➀
Houdini17.5までのPyroシミュレーションでは、画像2の赤い枠で囲まれた領域全体を計算対象としていました。
画像3. 計算領域のイメージ➁
一方、Houdini18.0に搭載されたSparse Pyroシミュレーションでは、煙や炎が存在するボクセルのみに焦点を当て、このボクセルを大まかに囲む範囲(画像2の緑の枠内)が計算する領域となります。
従って、上の画像3の青い斜線の領域は、現フレームにおいて考慮しなくて良いということになります。炎の動きにより、フレームごとに変動はあるかもしれませんが、それでもグリッド内全体を計算対象とするよりも断然軽くなります。
次の2章では、Houdini18.0で追加されたダイナミクスノードとその機能についてご紹介します。
2. ダイナミクスノード
Houdini18.0では目玉機能として、Pyroシミュレーションに新しく「Sparse Solver」が追加されました。
Houdini18.0を使用してこれまで通りのシミュレーションを行う場合は、Houdini17.5で使用していた「Pyro Solver ダイナミクスノード」や「Smoke Object ダイナミクスノード」がHoudini18.0でも用意されていますので、そちらを使用することができます。
Sparse Pyroシミュレーションを行いたい場合は、下の画像4のようにノード名に「sparse」と名前がついているノードを使用します。
画像4. Sparse Pyro シミュレーション用ノードとPyroシミュレーション用ノード
DOP階層内で使用可能なダイナミクスノードとして、下記の画像5のノードが新たに追加されました。これらは全てノード名に「sparse」と書かれているので、Sparse Pyroシミュレーションを行う際に使用できるノードであることが分かります。
・Smoke Object (Sparse) ダイナミクスノード
・Smoke Solver (Sparse) ダイナミクスノード
・Pyro Solver (Sparse) ダイナミクスノード
画像5. 追加されたダイナミクスノード
次の2.1節では、まず「Smoke Solver (Sparse) ダイナミクスノード」入力につきましてご説明させていただき、2.2節では「Pyro Solver (Sparse) ダイナミクスノード」のご説明を致します。
2.1 Smoke Solver (Sparse) ダイナミクスノード
まず、「Smoke Solver (Sparse) ダイナミクスノード」からご説明します。
画像6. Smoke Solverの入力
上の画像6のように、「Smoke Solver ダイナミクスノード」と「Smoke Solver (Sparse) ダイナミクスノード」を見比べた際に、入力の個数が異なることにお気づきになるかと思います。
まずおさらいとなりますが、「Smoke Solver ダイナミクスノード」に用意されている入力の役割について確認します。
<Smoke Solver ダイナミクスノード>
Objects :
流体を動作させるための計算領域(グリッド)を定義するノード(Smoke Object ダイナミクスノード)の入力用に使用されます。
Pre-Solve :
流体計算はナビエストークス方程式に従って行われます。その方程式を解く際にいくつか処理の段階があるのですが、その一連の処理を開始する前に行う計算があります。例えば、計算領域の最適化などが該当します。そのような計算を行うためのノード(Gas Resize Fluid dynamic ダイナミクスノード)を接続する際に使用されます。
Velocity Update :
Velocity フィールドの編集のために使用されます。ユーザーがカスタマイズしたフォースをVelocityフィールドに反映させる際に使用します。
Advection :
移流に関する設定を行うための入力です。例えば、ポイントを移流させたい場合、この入力でポイントを動かすために使用するフィールドを指定することができます。
Sourcing :
フィールド作成やコリジョン作成のもととなるボリュームデータを読み込むための入力です。
次に、「Smoke Solver (Sparse) ダイナミクスノード」の入力について見ていきます。
<Pyro Solver (Sparse) ダイナミクスノード>
Objects :
「Smoke Object (Sparse) ダイナミクスノード」を使用することによって、必要な計算領域を定義します。通常の「Smoke Object ダイナミクスノード」では動作しません。
Advection :
「Pyro Solver ダイナミクスノード」の「Advection」と同様に、移流の処理を行う場合に使用します。
Sourcing :
「Pyro Solver ダイナミクスノード」の「Sourcing」と同様に、フィールドやコリジョン作成のもととなるボリュームデータを読み込むための入力です。
Force :
マイクロソルバを使用するなどして、フィールドの操作を行うための入力になります。
従来のバージョンから搭載されている「Smoke Solver ダイナミクスノード」では「Pre-Solve」に「Gas Resize Fluid dynamic ダイナミクスノード」を接続して、Paddingの設定を行います。
一方で、「Smoke Solver (Sparse) ダイナミクスノード」では、下の画像7のようにAdvancedタブからResizingタブを開くことでPaddingの設定が可能です。
画像7. Paddingの設定
また、ユーザーのカスタマイズしたVelocityやFieldを接続して、煙や炎の動きを調節したい場合、「Smoke Solver ダイナミクスノード」では「Velocity Update」を使用します。
一方で、「Smoke Solver (Sparse) ダイナミクスノード」の場合は「Force」を使用します。
ここでは試しに、「Force」に対して「Gas Turbulence ダイナミクスノード」を接続し、動きを確認したいと思います。
「Gas Turbulence ダイナミクスノード」のパラメータは以下のように「Scale」と「Swirl Size」のみ、変更しています。
このノードは従来のバージョンから用意されているものですので、新しく追加されたノードではありません。
画像8. 「Gas Turbulenceダイナミクスノード」のパラメータ
画像9. Gas Turbulenceによる比較
接続した「Gas Turbulence ダイナミクスノード」はVelocityフィールドに対して乱流を与えるノードです。
「Force」に対して「Gas Turbulence ダイナミクスノード」のようなフィールドの操作を行うことができるノードを接続した場合、画像9のように挙動を変化させることができます。
従いまして、「Force」から入力するフィールド情報の作成が、Sparse Pyro シミュレーションを行う上では重要になります。
2.2 Pyro Solver (Sparse) ダイナミクスノード
「Pyro Solver (Sparse) ダイナミクスノード」は、「Smoke Solver (Sparse) ダイナミクスノード」を拡張したノードです。内部はSmoke Solverを中心としてネットワークが構成されています。
下の画像は、「Pyro Solver (Sparse) ダイナミクスノード」の内部ですが、「Smoke Solver (Sparse) ダイナミクスノード」が用意されています。
画像10. Pyro Solver (Sparse) ダイナミクスノードの内部ネットワーク
画像11. Pyro Solverの入力比較
こちらも2.1節でご紹介しました、「Smoke Solver (Sparse) ダイナミクスノード」と同じ入力が用意されており、それぞれの役割も同様です。
基本的に「Smoke Solver (Sparse) ダイナミクスノード」と「Pyro Solver (Sparse) ダイナミクスノード」の異なる点は、炎の動きを再現するためのフィールドを操作するパラメータが用意されているかどうかです。
下の画像12は、「Smoke Solver (Sparse) ダイナミクスノード」と「Pyro Solver (Sparse) ダイナミクスノード」のパラメータを並べたものです。
画像12. Pyro Solver(左) とSmoke Solver(右)のパラメータ比較
FlamesタブとShapeタブが「Pyro Solver (Sparse) ダイナミクスノード」では用意されています。これは炎の表示に関わるFlameフィールドを操作するためのパラメータです。
この制御ポイントが予め用意されているかが、大きな違いとなります。
また、Sparse Pyro シミュレーションで使用されるフィールドにつきましては、2.4節でご説明します。
2.3 Smoke Object (Sparse) ダイナミクスノード
Sparse Pyro シミュレーションを行う場合は、専用のSmoke Objectが必要です。Smoke Objectは、シミュレーションを行う上での計算領域を定義するために用意されています。
つまり、Sparse Volume で計算を行うか、従来のStandard Volumeを使用するかの制御ポイントはSmoke Objectにあるということです。
画像13. 「Smoke Object (Sparse) ダイナミクスノード」のパラメータ
上の画像13は「Smoke Object (Sparse) ダイナミクスノード」のパラメータになります。ここでは、PropertiesタブとGuidesタブを表示している状態です。
赤線が引かれている「Enable Sparse Solving」にチェックを入れることで、Sparse Pyro シミュレーションを行うことができるようになります。チェックを入れない場合は、通常のPyro シミュレーションと同様の処理が行われます。
つまり、領域全体が計算対象となります。
また、Sparse Pyro シミュレーションの場合、デフォルトで領域のサイズを決めるパラメータに数値が設定されていません。領域の最大サイズを決めたい場合は、Max Sizeパラメータを有効にし、サイズを決定する必要があります。
2.3.1 Boundary Conditions
領域の細かい位置につきましては、「Boundary Conditions「で設定が可能です。
デフォルトでは、以下のように「Treat X as」、「Treat Y as」、「Treat Z as」全てが「Open」と設定されているため、原点が計算領域の中心となります。
下の画像はTop View表示で、炎の計算領域を真上から俯瞰した画像を、5フレーム毎に並べたものです。画像の中心が座標の原点となります。
画像14. 「Open」に設定した場合
次に、「Treat X as」と「Treat Z as」を「Closed Below」に設定した場合です。 設定した座標値未満の範囲(ここでは0未満の範囲)が、計算領域から除外されます。
画像15. 「Treat Y as」以外を「Closed Below」に設定した場合
最後に、「Treat X as」と「Treat Z as」を「Closed Above」に設定した場合です。
こちらは先ほどの「Closed Below」とは逆で、設定した座標値より大きい範囲(ここでは0より大きい範囲)が、計算領域から除外されます。
画像16.「Treat Y as」以外を「Closed Above」に設定した場合
値を変えたり、軸によってモードを切り替えるなど調節を行うことで、Copy ParameterとPaste Relative Referencesなどの機能を使用して領域の設定を行うよりも簡単に、計算領域の設定ができると思います。
2.3.2 Wind Tunnel Direction
「Smoke Object (Sparse) ダイナミクスノード」のFieldタブでは、計算領域内にVelocityフィールドに対して初期値を設定する機能があります。
どの向きにどの程度の値を持たせるのかを設定するパラメータが「Wind Tunnel Direction」です。
画像17. 「Wind Tunnel Direction」のパラメータ比較
ただし、「Wind Tunnel Direction」を使用してしまうと、その後の処理で影響を受け続けてしまいます。常に影響を与えたい場合を除き、使用する場面は限られてくるかと思います。
2.4 フィールドについて
炎や煙のシミュレーションを行う際には必ずベースとなるボリュームデータが必要となります。Sparse Pyroシミュレーションでは、必要となるアトリビュートおよびフィールドの名称が、従来のPyro シミュレーションとは少し異なります。
どのようなフィールドが作成されているかについては、「Smoke Object(Sparse)ダイナミクスノード」のGuidesタブ内にあるVisualizeタブで確認できます。
画像18. 「Smoke Object(Sparse)ダイナミクスノード」のVisualizeタブ
Domainは、Max Sizeパラメータを有効にした場合にのみ使用できます。計算領域のワイヤーフレームを表示させるためのオプションです。
Active Regionは、Enable Sparse Solvingを有効にした場合に使用できます。現在のフレームにおいて実際に計算されている領域(Active Region)をワイヤーフレームで表示するためのオプションです。
2.4.1 Flame Field
Flameは、flameフィールドを可視化するためのオプションです。
従来からのPyro シミュレーションでは、Heatフィールドが炎の発光度合(Emission Scale)を調節するためのフィールドとして使用され、temperatureフィールドが発光色(Emission Color) の設定用として利用されていたかと思います。
一方で、Sparse Pyro シミュレーションにおいては、Emission Scaleを調節するためにfalmeフィールドが使用されます。Emission Colorにつきましては、temperatureフィールドが使用されます。
例として、Sparse Pyro シミュレーションによる炎を、「Volume Visualization ジオメトリノード」を使用してSOP階層で可視化します。
ここでは、DOP階層から必要なフィールドを取り出した後、Smokeタブ内のDensity Fieldパラメータに「density」と入力し、Emissionタブ内でEmission Fieldパラメータに「flame」と入力します。
また、Density Scaleの値は0に設定しています。
画像19. Smokeタブの設定(左)とEmissionタブ(右)の設定
densityフィールドがベースとなっておおよその形状を決め、flameフィールドが発光度合いを決めます。なので、Emission Scaleを調節することで、シーンビュー上における明るさが変化します。
画像20. Emission Scale の比較➀
加えて、Emissionタブ内のEmission Color Fieldパラメータに「temperature」と入力し、ここではModeを「Physical Blackbody」に設定しています。
画像21. Emission Color Fieldの設定とModeの変更
すると、flameフィールドによるEmission Scaleを維持した状態で、temperatureフィールドの勾配に従って配色が行われます。
画像22. Emission Scaleの比較➁
以上から、Sparse Pyro によるシミュレーションを行う際には、flameフィールドが必要となることがわかります。
今回の記事では、Sparse Pyro シミュレーションに関するご説明と、新たに追加されたダイナミクスノードの大まかな説明を行いました。
考え方としては、従来のPyroシミュレーションと似通っていますが、全体的に制御ポイントとして予め用意されているパラメータが少なくなった印象があります。
逆に、Sparse Pyro シミュレーションを使用して複雑な調節を行う場合は、マイクロソルバーを組み合わせて制御する、あるいはSOP階層内でソースとなるボリュームをカスタマイズする必要性が、従来のシミュレーションと比較した場合に高くなったと言えるのかもしれません。
次回の記事では、新しく追加されたPyroシミュレーションに関するジオメトリノードについてご紹介します。