VATとは?
VertexAnimationTextureの略でメッシュのアニメーションをテクスチャとして出力しUnityで再生する手法です。
事前にアニメーションを計算しておくことで流体のような複雑なシミュレーションや大量のオブジェクトの動作を比較的軽量に実現できます。
VRChat(Quest版含む)でも動作するので他では作れない演出ができます。
VATパンチ! pic.twitter.com/TBb8GL1Szs
— なまのなまこ (@Iiron_Lung) March 8, 2021
アニメーションのパターンによって種類があり、今回はRigidBodyシミュレーションについて扱います。
シミュレーション対象のメッシュ形状が変化しないシミュレーションであり、破壊表現などに利用できます。
他のパターンはこちら
VRChatでHoudiniのVATを使う(SoftBody/Fluid編)
環境
VRCSDK2-2021.03.22.18.27
Houdini 18.5.499
VRC_SDKをインポートする前後でプロジェクトの設定が変わるので、必ず確認しましょう。
この記事の説明はVRC_SDKインポート済みを想定しています。
軸や色空間が変わるようです。このあたりシェーダー内の回避策がわかる人いたら教えて下さい
Houdiniは無償ライセンス版も存在しますが、VAT用テクスチャにウォーターマークが入るためアニメーションが乱れます。
本記事のサンプルプロジェクトはこちら
リソース
VRChat向けに手を加えたVAT用シェーダーをGithubで公開しています。
こちらのunity/shadersフォルダを自分のUnityプロジェクトに配置してください。
出力はPackedPrimitiveを想定しています。
調整中で不具合が残っているかもしれませんので、改善方法があれば連絡いただければ幸いです。
Houdiniでアニメーションを作る
BoxをVoronoi分割して落下させる簡単なアニメーションを例にします。
まずはVoronoi分割。

objレベルに戻って上部ツールからRigidBodies>RBD Objectsを選択。

自動的に落下のシミュレーションが作成されます。
そのままでは無限に落下してしまうので自動生成されたAutoDopNetworkノードに入り、上のmergeにGroundPlaneノードを新規作成してつなぎます。
最初に作ったBoxの高さを2にして準備ができました。
再生ボタンを押すとBoxが落下して崩れてくれます。

HoudiniからVATを出力
作ったアニメーションをVATで出力します。
SOP(/obj)からROP(/out)へ移動しvertex_animation_texturesノードを作成します。
各項目の設定
Start/End:出力するアニメーションのフレーム指定
Method:VATの種類 今回はRigidを指定します
Engine:Unityをえらび必ずInitialize Engineを押す
SOP Path:出力するアニメーションノードのパス
Pack Pscale into Position Alpha:アニメーションする破片のスケール変化をテクスチャに焼くかどうか 今回はスケールを触っていないので外しておきます。
Target Texture Size:破片やフレームが多い場合は大きくしておくといいと思います。
Paths:必要な出力物にチェックをつけましょう。今回MaterialとRealtimeDataはいらないので外しておきます。
設定ができたらRenderボタンを押して出力
こんな感じになりました。
後でUnity側で値を使うのでHoudiniは閉じないでおきます。

Unityに導入
指定したパスにテクスチャとメッシュが出力されているのでUnityのプロジェクトに導入します。
vertex_animation_textures1_mesh.fbx
vertex_animation_textures1_pos.exr
vertex_animation_textures1_rot.exr
導入したテクスチャのインポート設定を変更します。
VATは頂点位置を色として読み書きするので圧縮などされると動きが変わってしまうからです。
AlphaSourceはHoudini書き出し時の設定に合わせます。
今回は出力時にPack Pscale into Position Alphaを使っていないのでNoneでOK。

Meshをシーンに配置してマテリアルを割り当てます。
Materialのシェーダーは上記URLからダウンロードした"sidefx/vertex_rigid_body_shader"を選択。
PositionMapとRotationMapに出力されたテクスチャを指定します。
マテリアルの各項目はHoudiniの数値を持ってきます。
| Houdini | Unity |
|---|---|
| Pivot Min/Max | Bounding Max Min |
| Position Min/Max | Bounding Max1 Min1 |
| Frame Range | Number Of Frames |
| Speed | Speed |
VATはシェーダーで見た目だけを動かしているのでメッシュの実体は初期位置のままです。(オレンジ枠線部)
カメラを動かして破片が消えてしまうときはMeshRenderをSkinedMeshRenderに変えてBoundsを大きくしてみてください。
また、同じ理由からMeshColliderなども追従しません。
おわりに
パラメーターが多く繊細なので変な動きをする場合は設定を見直してみてください。
他の種類のVATも順次追加予定です。
動かないとき
- テクスチャの設定を見直す
Max SizeやAlpha Sourceなど設定を変えてみるとうまくいくことがあります - Houdiniの出力タイプを確認する
RigidBodyのVATはPackedPrimitiveである必要があります
vertex_animation_texturesノードのSOPpathに設定したノードをマウスミドルクリックし、PackedFragmentsと表示されるか確認しましょう。
Polygonsになっていた場合は`assemble`ノードを使うことでPackできます。
- `Engine`の設定
Unityを選んだ後に`Initialize Engine`の押し忘れがあると動く向きがおかしくなります
- エクスポート時のエラー
HoudiniのプロジェクトによってはVATエクスポート時にエラーになるようです。(原因不明)同じノード設定を新規プロジェクトで試すと出力できるかもしれません。
