インディゾーンHoudini情報日本語ブログでは、
インディゾーンでのHoudini購入者様向けにアセット配布を行う記事を投稿していくことになりました。
今回は初回ということで、1週間だけ記事の方は一般公開させて頂くことになりました。
※5月21日以降は、当記事の閲覧にはメールにて購入ユーザー様に配布されているパスワードが必要となります。
今回の記事では、Houdiniバージョン17.0以降のPyroシミュレーションを行う際の変更点の紹介と、カーブを用いた燃え広がりの表現について紹介します。
構成としては、新規追加のジオメトリノード3つ、バージョンアップに従って変更されたダイナミクスノード1つを紹介したのちに、これらのノードを使った例を1つ紹介するという形になります。使用したHoudiniのバージョンは17.0になります。
図1.接続の比較
16.5以前のPyro シミュレーションは、発生源となる初期ジオメトリに続けてFluid Source ノードを接続し、ジオメトリをスカラーまたはベクトル付きのボリュームに変換するボリュームベースの手法で、作成されたボリュームはSource Volume ノードを使用して、直接DOP内に取り込むという方式をとっていました。
一方、17.0以降のPyroシミュレーションでは、Pyro Source ノードを使用し、初めに初期ジオメトリに対してポイントを表面上あるいは内部に散布します。このポイントに対して、FuelとTemperatureのアトリビュートを作成し、このアトリビュート付きのポイントを使ってVDBを生成してからDOP内に読み込むという方式がとられるポイントベースの手法となっています。
そのため、Pyroシミュレーションを行う際にSOPによるセットアップの段階で、新規に追加されたPyro Source ノードとVolume Rasterize Attributeノードを使用する必要があります。
また、シェルフを使用した際には、先ほどの2つのノードに加えてAttribute Noiseノードが配置されるのですが、これはVOPやWrangleノードで代用することが可能です。 しかし、どのような機能があるのかを知っておくことは大切なので、これも含めて紹介したいと思います。
1. ジオメトリノード
まず初めに、新規追加されたシミュレーションを行う前のセットアップで使用する3つのジオメトリノードの紹介です。
Pyro Source geometry node
Pyro Sourceノードの第1入力に接続されたジオメトリを炎や煙のシミュレーション用のソースに適したポイントに変換するためのノードです。炎のシミュレーションを行う場合は、変換されたポイントに対してFuelアトリビュートとTemperatureアトリビュートを作成します。これは後でシミュレーションを行う際に必要なものです。
Initializeタブではどのシミュレーション用に使用するのか設定することができます。ここではPyroシミュレーションを行うので、Source Fuelとしておきます。
図2.Initializeタブの切り替え
FuelとTemperatureアトリビュートを設定し、それぞれのスケール値を1.9としています。因みにこれは、シェルフで作成した際のデフォルトの値です。
図3.アトリビュートのスケール値調整
Geometry Spreadsheetで確認すると、きちんと作成されていることがわかります。
(下の画像の赤枠で囲まれている部分です。)
図4.作成されたアトリビュートの確認
またParticle SeparationとParticle Scaleの積が、散布されたポイントのpscaleの値として代入されます。炎の燃え上がり方を調節する際に、pscaleの値を調節すると結果が変わるので、状況に応じて調節すると効果的です。
ノードの第2入力はジオメトリを接続するとポイントアトリビュートの複製であるrestアトリビュートが作成されます。他の記事と重複しますが、オブジェクトのデフォルトの位置を記録するためのアトリビュートなので、ここでは使いません。
Pyro Sourceノードの接続後、シーンビューでは下の画像のように表示されます。
図5.プリミティブからポイントへの変換
Attribute Noise geometry node
アトリビュートに対してノイズを加えるためのノードです。これと同じことはVEXやVOPでも行えます。スクリプトが書けるという方はそちらの方法も使用できます。
Attributesの入力スペースに入力したアトリビュートに対してノイズがかかります。ここでは、fuelアトリビュートとtemperatureアトリビュートに対して、simplexノイズを与えています。また、Noise Typeから適用したいノイズを選ぶことができます。
図6.Attribute Noiseノードのパラメーター①
図7.Attribute Noiseノードのパラメーター②
Animatedはチェックを入れておくことで、生成されるノイズを時間とともに、徐々に変化させてくれます。また、Distributionのグラフを調節することで、ノイズの分布を調節することができます。
ノイズを適用させてから再びGeometry Spreadsheetを確認すると、数値にバリエーションができていることがわかります。これによって燃料や温度の分布に対して乱れを作ることができます。
図8.ノイズ適用後の値の変化
下の画像のように、シミュレーションを行った際に、違いが生まれます。
図9.シミュレーションの比較
Volume Rasterize Attributes geometry node
ポイントを入力として受け取り、そのポイントの持つアトリビュートからVDBを生成します。ここで特に設定する必要がある項目はGroupとAttributesです。
図10.Volume Rasterize Attributeノードのパラメーター
Groupでは、ラスター化するポイントグループを作成します。実はPyro Sourceノードを作成した段階で、作成された全てのポイントは自動的にparticlesという名前のグループに入れられます。なので、ここでは新しくグループを作成する必要はありません。particles というグループ名をGroupの項目に入力するだけです。
図11.入力スペースの拡大画像
図12.particlesグループの確認
Attributesには、DOP内に読み込むVDBを生成する際に使用するアトリビュートの名前を入力します。ここでは、炎の生成に必要なfuelとtemperatureを読み込んでいます。
Voxel SizeはPyro SourceノードのParticle SeparationやDOP内にあるSmoke ObjectノードのDivision Sizeと同じ値にしておくと、ディテールを保ちやすいようです。
図13.ポイントからVDBへの変換
2. ダイナミクスノード
続けて、ダイナミクスノードの変更箇所に関する紹介です。今回は、Pyroシミュレーションで特に設定が必要な項目のみ説明させていただきたいと思います。
Source Volume dynamics node
Houdini17.0以降でPyroシミュレーションを行う際のDOP内における変更点として、Volume Sourceノードの変更が挙げられます。17.0以降ではSource Volumeノードと名前が変わり、パラメーターがいくつか削除されました。Pyroシミュレーションで使用する場合は、先ほどジオメトリノードを使用して作成したVDBをDOP内に読み込む役割を持ちます。
図14.Volume Sourceノードのパラメーター
入力ジオメトリを第何入力から読み込むのかをInputタブで設定します。また、データを読み込む際にはSOP Pathに読み込みたいノードの位置を示すパスを入れることで読み込むことも可能です。
上の画像の場合、InitializeがSource Smokeとなっていますが、Pyroの場合はSource Fuelとしておきます。
Field to MatchはCreate Missing Fieldsのチェックボックスをオンにした際に、Field to Matchの欄に入力された名前のフィールド(上の画像ではdensity)をDOPフィールドのサイズとサンプリング数に合わせるための項目です。
(フィールドとは、ボクセルによって構成された計算領域のことです。Houdiniの場合、Smoke ObjectノードのDivisionsやDivision Sizeなどの数値を変更することでDOP内のボクセルの数やサイズが変更できます。また、ボクセル一つ一つには数値が保存されており、これを参照してシミュレーションや可視化を行っています。)
デフォルトではチェックボックスがオンになっていますが、普通にシミュレーションする分には特に影響がないので、オフにしておいても構いません。
VolumesタブのOperationsでは作成する入力スペースの数を指定します。例えば、3と入力すれば3つ分の入力スペースが作成され、それぞれに読み込むVDBの名前やスケール値を入力していくことになります。Source Volumeには、読み込むVDBの名前を入力します。Target Fieldには更新するフィールドの名前を入力します。
図15.入力スペースの作成
上の画像のように、Operationsを3にした場合、3つの入力スペースが作成されます。
3. 作例
ここからは、これまで紹介したノードを使用し、シミュレーションを行った例を紹介させていただきます。今回は、カーブを用いて炎の広がりを表現しました。
図16.レンダリング結果
動画はこちらよりご覧いただけます。
こちらの例で行っていることを、簡単ではありますが、紹介致します。まずは好きなカーブを配置します。
図17.カーブの配置
これをリサンプルしてカーブ上のポイント数を増やし、Pyro Sourceノード、Attribute Noiseノード、Volume Rasterize Attributesノードを接続します。接続後は、下の画像のようになります。
図18.VDBへの変換
今回の炎の広がりは、温度変化による広がり方なので、着火剤のような役割を持つ炎の発生源となるオブジェクトが別途必要です。初歩的ですが、発生源にはスフィアオブジェクトを使い、サークル上にある指定した番号のポイントに対してコピーする形をとっています。
図19.発生源の配置
ここまで作成したら、DOPに読み込みます。このとき、カーブを使用したVDBとスフィアを使用したVDBは分けて読み込みます。
図21.DOP内のネットワーク
カーブから作成されたVDBを読み込んだVolume Sourceノードのtemperatureのスケール値は、あらかじめ0に設定しておきます。これによって徐々に温度の値が0から上がっていき、燃え広がる表現ができます。
図22.Volume Sourceノードのパラメーター
図23.使用するカーブの形状による違い
このように使用するカーブの形状によって、様々な燃え広がり方が再現できます。また、キャッシュはFile Cacheジオメトリノードを使用して取得できるようにしました。
図24.FileCacheノード
今回の記事は以上になります。説明しきれていない部分があるかと思いますが、こちらのデータは限定公開しておりますので、興味を持たれた方は是非、ダウンロードしてみて下さい。
ダウンロードはこちらより行えます。(当記事閲覧に必要なパスワードの入力が必要となります。)