この記事では、Houdini で VAT を使った水しぶきを作成し UE5 で再生する一連の流れを紹介します。
Houdini はなるべく少ないノード構成で VAT を作成しています。
対象読者
・エフェクトデザイナー
・Houdini を学習中の方
・VAT に興味がある方
環境
・Houdini 22.0.368
・SideFXLabs 22.0
・Unreal Engine 5.7.4
VAT を動かすまでを記載した記事のため、ルックのクオリティを上げる調整は行っていません。
VAT とは?
頂点の位置や法線などのアニメーション情報をテクスチャに保存し、シェーダーで再生する技術です。液体や破壊などの複雑なシミュレーション結果を、ゲームエンジン上で比較的軽量に再生できます。
また、Houdini で VAT を作成する場合は SideFXLabs に含まれる『Labs Vertex Animation Textures』を使用するのが一般的です。
Houdini ヘルプ > Labs Vertex Animation Textures
種類
| Soft-Body Deformation(Soft) | 頂点数とトポロジーを維持したまま頂点が変形する 例:布、軟体、波打つサーフェス |
| Rigid-Body Dynamics(Rigid) | 各剛体パーツの形状を維持したまま位置と回転が変化する 例:建物や岩の破壊、破片 |
| Dynamic Remeshing(Fluid) | フレームごとに頂点数やトポロジーが変化する |
| Particle Sprites(Sprite) | パーティクルの位置や大きさなどが変化し、ゲームエンジン上ではスプライトとして描画される 例:火花、飛沫、煙 |
この記事で取り扱う範囲について
「Dynamic Remeshing(Fluid)」のみ取り扱います。
その他の Soft、Rigid、Sprite については触れません。
また、記事が長くなりすぎるためノードそれぞれの詳細な説明は行いません。
Houdini で VAT 書き出し
こちらが全体像です。以降で解説します。

水のシミュレーション

・sphere1 ~ vdbfromparticles1 まででシミュレーションの初期形状と初速を作成
・fliptank1 ~ flipsolver1 がシミュレーションのコア部分
1. 球状にポイントを配置
球体ポリゴンをボリューム化し、『scatter1』でポイントを配置している。


2. 中心にアトリビュートを作成
『Group Create』で中心から一定範囲を “group1” と名付ける。



新しく center というアトリビュートを作成し、
group1 のポイントは “1” それ以外を “0” に設定。
3. 初速を設定
ポイント位置をもとに力の方向と力の強度を設定しています。
結果を『geometryvopoutput1』の “v” に繋いでいるため、ポイントのアトリビュート “v” に格納されています。


4. ポイントをボリューム化
ポイントのままだと『flipboundary1』に情報を渡せないためボリュームに変換。
また、パラメーター下部の設定を行わないとポイントの “v” がボリュームに継承されない。


5. シミュレーションの初期設定
『fliptank1』では計算精度と計算範囲を設定。
『flipboundary1』では上記までで作った形状を1フレ目のみ取得するよう設定。



6. シミュレーション
ダブルクリックして中に入り、空気抵抗を設定している。
アニメーションを再生すると『flipsolver1』で計算が実行される。


メッシュ化

『particlefluidsurface1』でメッシュ化自体は行われます。
ただ、このままだとポリゴン数が多すぎるため『polyreduce1』を実行しています。
1. メッシュ化
「Influence Scale」と「Droplet Scale」を徐々に小さくし、最後に水がちぎれてなくなるように調整。

2. ポリゴン数を削減
『polyreduce1』で一定割合でポリゴン数を削減。そこから『delete_small_parts1』で小さすぎる要素を削除。


3. 後処理
『smooth1』で形状を滑らかにし、『normal1』で法線を設定。

VAT 化


『ropnet1』 の中身
まずキャッシュを取り以降の処理をスムーズにします。
次に『timeshift1』で出だしの数フレームをスキップし、勢いのある形状から VAT が始まるよう設定。

今回は2フレームスキップ
最後に『null1』に繋ぎ、その結果を『vertex_animation_textures1』で参照。
vertex_animation_textures1 の設定



・Export Compressed Normals in Position Alpha
基本 True で問題ない。True だと法線を圧縮して Position Texture の Alpha チャンネルへ格納する。
Rotation Texture が不要になるため、テクスチャ容量とサンプリング数を削減できる。
・Include
何を書き出すかを指定できる項目。今回は “Geometry, Position” に設定。
・Support Real-Time Instancing
True だと Niagara で VAT を使用するために必要な情報を書き出してくれる。
VAT を書き出す


「Render All」で書き出しが実行されます。ただ、Render Pass を変更し計2回の書き出しが必要です。

上記を実行した後、作業している Houdini のシーンデータのフォルダ階層に以下の4つが書き出されます。
デフォルトだと[ > export > Houdini のファイル名 > 4つのデータ]という階層になっているはずです。
UE で動かす
SideFX Labs プラグインの導入

まずは『vertex_animation_textures1』の以下をクリック。

するとエクスプローラーに飛ぶ。次に今回使用する Unreal Engine と同じバージョン 5.7 のフォルダに入る。

そこにある VAT Import Settings Guide.txt に諸々の手順が記載されているためそれに従ってプラグインを導入する。
VAT データのインポートと設定

VAT データをインポートし、json は以下のように “Houdini_VAT_Parameters” を指定します。

[テクスチャを右クリック > Scripted Asset Actions]で設定。
~_pos は HDR の方、~_lookup は SDR の方を実行。
マテリアル


マスターマテリアルは上記のように設定。
VAT を動かすのが今回のゴールのため最小構成。

マテリアルインスタンスは上記のように設定。
マテリアルインスタンスのプレビューに今回書き出したメッシュを割り当てると、このように確認できる。
Niagara で動かす



Niagara で動かすためにバウンズを明示する必要があります。
以下手順で数値を割り当てることができます。
- 「Houdini VAT – Instancing」のパラメーター入力をアクティブ
- マテリアルインスタンスと Data Table の2つを選択
- 上記スクリプトを実行する
処理負荷について
VAT の Dynamic Remeshing(Fluid)はテクスチャのリソースサイズが大きくなりがちです。
今回紹介したものは2つのテクスチャ合わせて 約 2500 KB
実際にインゲームで使うためには、フレーム数かポリゴン数のどちらかを減らす必要があります。
Unreal Engine のデフォルトの圧縮形式ではリソースサイズが以下のとおりです。
普段エフェクトで使用するテクスチャと比較し、VAT のリソースサイズがかなり大きい事がわかります。
256 = 43 KB / 512 = 171 KB / 1024 = 683 KB




まとめ
VAT を活用することで連続性のある液体表現を作成することができます。
また今回紹介した流れを踏まえ、より高度な水のシミュレーションを取り入れることでリッチな水しぶきを作成可能です。
この記事が VAT を学習するきっかけになりましたら幸いです。

