GithubおよびArtstationのSideFX Labsにて、Vertex Animation Textures 3.0をPDGに組み込んだサンプルが公開されました。
サンプルは下記からダウンロード可能です。
https://www.artstation.com/artwork/1xq9k8
ダウンロードしたシーンを開き、オブジェクト階層をみるとmodelとdestruction2つのノードで構成されていることがわかります。
modelは、名前の通り破壊する壁を作成しています。
今回中心となるのはdestructionとなり、modelで作成したノードを読み込み、そこに破壊エフェクトを追加します。
destructionの中に入り、一番上にあるglassノードを選択します。
このモデルにはプリミティブアトリビュートとしてclassが作成時にmodelノード内で定義されています。
classアトリビュートをビジュアライズすると下記のようになります。
各1まいの板ごとにclassアトリビュートが設定されています。
その下のWrangleノードでは、classを使用してnameアトリビュートが定義されています。
その下は二手にわかれますが、右側ではこの板を破壊するためのポイントを作成しています。
その後、その下にあるreduce_ptsというノードのパラメーターを確認します。
ここではその上で作成したポイントの中から、reductionというアトリビュートを使用して比率を選択するようになっています。
このreductionアトリビュートを定義している場所がネットワーク下部にあるtopnet1の中ん
wedge_reduction_and_versionというWedge PDG ノードです。
HoudiniにおけるWedge PDGノードは、パラメータの異なる複数のバリエーションを自動的に生成し、それらを並行して処理するために使用されます。PDG(Procedural Dependency Graph)は、Houdiniのワークフローを拡張し、より効率的なデータ処理とタスクの実行を可能にするためのフレームワークです。
Wedgeノードは、特定のタスクやシミュレーションに対して、異なる入力パラメータや設定を試すために用いられます。例えば、シミュレーションの品質を変えたり、異なる素材特性をテストする場合などです。Wedgeノードはこれらの異なるバリエーションを自動的に生成し、それらをバッチ処理として一度に実行することができます。これにより、手動で一つずつパラメータを変更し、処理する手間が省け、効率的なワークフローを実現できます。
ここでは下記のように2つのアトビュートを作成しています。
reductionでは0と0.8の2つの値を生成し、versionでは、v1,v2という文字列のアトリビュートを作成しています。
右クリックからCook Nodeを選択します。
実行すると
2つの緑のポイントが生成されます。このポイントがワークアイテムとなります。
ワークアイテムをダブルクリックすると、設定されたアトリビュート確認することができます。
TOPの外に出ます。
SOPに上記のようなActive Work Itemというメニューが表示され、2つのワークアイテムを切り替えることができます。
reduce_ptsノードのパラメーターを表示し、Ratioを左クリックするとアトリビュートの結果を表示することが可能です。
ワークアイテムを切り替えることで、Ratioに入る数字が変わることがわかります。
glass_fracture1ノードを選択し2つのワークアイテムの結果を表示してください。
このような方でどこで破壊されるのかバージョンを指定した分作成することが可能です。
RBD Bullet SolverにDisplayフラグを設定すると、破壊シミュレーションができていることがわかります。
ここまでの結果をキャッシュしたいと思います。
今回、破壊方法は2つありキャッシュもわけて作成する必要があります。
ただ、SOPをみるとキャッシュのロードはあるものの、キャッシュの作成は行われていません。
キャッシュはTOPs内で作成されています。
ROP Geometry Outputノード "cache_sim "がNullノード "RDB_SIM "からシミュレーションフレームをキャッシュします。File Cache SOPを使用してシミュレーションをキャッシュするのと似ていますが、この方法では、PDGがキャッシュを完全に制御します。
cache_simノードの上にcreate_out_pathノードがあります。ここでは異なるバリエーションを異なるディレクトリに保存できるように、out pathアトリビュートを作成しています。
更にcreate_out_pathノードのアトリビュート値の中でversionアトリビュートが指定されています。
このversionアトリビュートは、一番最初のwedge PDGノードで作成したアトリビュートになります。
cache_simノードのROP Geometryタブに読み込むSOP Pathと出力するファイル名を指定することができます。
Output Fileがキャッシュの出力先になります。
out_pathアトリビュートで指定したディレクトリ+SOP内のload_cacheノードのcache_nameパラメーター値を取得し、ファイル名を決定します。
また、これはシミュレーションのキャッシュ生成なのでROP FetchタブでAll Frames in One Batchを有効にしてください。
こちらをクックすると
キャッシュの作成が始まります。
Task Graph Tableを開くことができます。
キャッシュ作成が完了しましたが、TOPs内ではフレーム分ワークアイテムがわかれています。そこで、フレームをバリエーションごとにグループ化する必要があります。
Partion by Attributeを使用し、アトリビュート名でグループに分けることができます。
アトリビュートとしてはversionを指定します。
Cookします。
Partitionノードを使用するとワークアイテムのアイコンが縦長になるのは、Partitionノードが複数のワークアイテムを単一のワークアイテムに結合するためです。この縦長のアイコンは、Partitionノードが生成したワークアイテムが、複数の元のワークアイテムから構成される「パーティション」であることを視覚的に示しています。
versionは2つの値を持っていたため、ここでも2つのワークアイテムに結合されました。
SOPのLoad cacheノードにディスプレイフラグを設定し、Partionのワークアイテムを選択すると、ビューポートにてキャッシュの結果を確認することも可能です。
つまり下流のVATノードはバリエーションごとに1回だけ実行すればよいようにします。
最後にこれをVATにしていく必要があります。
ropnet1の中に入ります。
ropnet1の中にはVATノードが一つ用意されています。
Input Geometryには
OUT_RBDが読み込まれてるようになっています。
更にExportとして、PDGアトリビュートである@versionを使用して2つのVATが異なる名前で作成されるようになっています。
このVATを生成するにために再度TOPsに入ります。
PDGグラフの処理順序により、VATノードが処理を開始する際には必要な入力ジオメトリのフレームが既にキャッシュされていて読み込まれれている必要があるのでご注意ください。
シーンファイル内にVATノードが1つだけ存在する場合でも、PDGは複数の個別インスタンスを生成し、それぞれがROP Fetchノード「render_vat_rop」上のワークアイテムによって表されます。
これらのワークアイテムは、それぞれに関連付けられたPDGアトリビュートを使ってキャッシュとアセットのパスを区別します。
ファイルノード「load_cache」はワークアイテムの@out_pathに基づき、ディスクから特定バージョンのキャッシュをロードし、
VATノードは@versionに基づきアセットを特定のエクスポートディレクトリにレンダリングします。
VATノードをPDGで処理しているのがROP Fetchノードです。
処理するノードとしてropnet1の中のVAT_RBDを取得し
VATノードのrenderallパラメーターを実行します。
Cookします。
Partionノードによりバリエーションごとにフレームをグループ化され、下流のVATノードがバリエーションごとに一度だけ実行するようになっています。
Cookが終了すると指定したディレクトリにバリエーション毎のVATとメッシュができていることがわかります。
これまではネットワークの説明と各PDGの挙動を確認するため、一つずつCookしていましたが、ネットワークが完成すればデバッグしていく必要はないので、まとめて実行できます。
TOPノードそのものを選択し
Cool Ouput Nodeをクリックしていただければ、topnet1内にあるPDGネットワークを処理することができます。
Artstationでは、作成したVATをUE5.3 で使用したUEプロジェクトファイルもダウンロードできます。