VATとは?
VertexAnimationTextureの略でメッシュのアニメーションをテクスチャとして出力しUnityで再生する手法です。
事前にアニメーションを計算しておくことで流体のような複雑なシミュレーションや大量のオブジェクトの動作を比較的軽量に実現できます。
VRChat(Quest版含む)でも動作するので他では作れない演出ができます。
ケーブルにょろにょろがVRCでも動いた pic.twitter.com/w4W0AsEyYD
— なまのなまこ (@Iiron_Lung) March 31, 2021
アニメーションのパターンによって種類があり、今回はSoftBodyシミュレーションについて扱います。
メッシュ形状は変化するがトポロジーは変化しないというパターンで、布などやわらかい物に使うことができます。
FluidはSoftBodyと似たような手順のため解説は省略します。
サンプル・シェーダーは各リポジトリに含めています。
トポロジーが変わるような場合に使うもので、液体のようにメッシュがちぎれたりするものでも出力できます。
RigidBodyはこちら
VRChatでHoudiniのVATを使う(RigidBody編)
環境
VRCSDK2-2021.03.22.18.27
Houdini 18.5.499
VRC_SDKをインポートする前後でプロジェクトの設定が変わるので、必ず確認しましょう。
この記事の説明はVRC_SDKインポート済みを想定しています。
軸や色空間が変わるようです。このあたりシェーダー内の回避策がわかる人いたら教えて下さい
Houdiniは無償ライセンス版も存在しますが、VAT用テクスチャにウォーターマークが入るためアニメーションが乱れます。
本記事のサンプルプロジェクトはこちら
リソース
VRChat向けに手を加えたVAT用シェーダーをGithubで公開しています。
こちらのunity/shadersフォルダを自分のUnityプロジェクトに配置してください。
調整中で不具合が残っているかもしれませんので、改善方法があれば連絡いただければ幸いです。
Houdiniでアニメーションを作る
豚に布をかけましょう。
まずはGridを準備。分割などしておきます。
objレベルに戻って上部ツールからVellum>VellumCloth
を選択。
自動的にシミュレーションが作成されます。
そのままでは無限に落下してしまうので最初にGridを作ったGeometryノードに戻りtestgeometry_pighead
ノードを追加。
AutoDopNetwork
ノード内でstaticobject
ノードを追加。vellumobject
にmerge
します。
staticobject
のSOP Path
に先ほど作ったtestgeometry_pighead
を指定し、再生ボタンを押すとシミュレーションが始まります。
HoudiniからVATを出力
作ったアニメーションをVATで出力します。
SOP(/obj)からROP(/out)へ移動しvertex_animation_textures
ノードを作成します。
各項目の設定
Start/End
:出力するアニメーションのフレーム指定
Method
:VATの種類 今回はSoftを指定します
Engine
:Unityをえらび必ずInitialize Engine
を押す
SOP Path
:出力するアニメーションノードのパス /obj/cloth_vellum/vellumpostprocess1を選びます
Pack normals into Position Alpha
:ノーマルをPosテクスチャのアルファに焼くか別テクスチャで出すか。どちらでもいいと思います。とりあえず入れておきます。
Target Texture Size
:ポリゴンやフレームが多い場合は大きくしておくといいと思います。
Paths
:必要な出力物にチェックをつけましょう。今回MaterialとRealtimeDataはいらないので外しておきます。
設定ができたらRender
ボタンを押して出力
こんな感じになりました。
後でUnity側で値を使うのでHoudiniは閉じないでおきます。
Unityに導入
指定したパスにテクスチャとメッシュが出力されているのでUnityのプロジェクトに導入します。
vertex_animation_textures1_mesh.fbx
vertex_animation_textures1_pos.exr
導入したテクスチャのインポート設定を変更します。
VATは頂点位置を色として読み書きするので圧縮などされると動きが変わってしまうからです。
AlphaSource
はHoudini書き出し時の設定に合わせます。
今回は出力時にPack normal into Position Alpha
を使っているのでInput Texture Alphaにします。
Meshをシーンに配置してマテリアルを割り当てます。
Materialのシェーダーは上記URLからダウンロードした"sidefx/vertex_soft_body_shader"
を選択。
PositionMapに出力されたテクスチャを指定します。
マテリアルの各項目はHoudiniの数値を持ってきます。
NormalをAlphaに焼いたのでPackNormalにもチェックを入れましょう。
Houdini | Unity |
---|---|
Position Min/Max | Bounding Max Min |
Frame Range | Number Of Frames |
Speed | Speed |
VATはシェーダーで見た目だけを動かしているのでメッシュの実体は初期位置のままです。(オレンジ枠線部)
カメラを動かして破片が消えてしまうときはMeshRenderをSkinedMeshRenderに変えてBoundsを大きくしてみてください。
また、同じ理由からMeshColliderなども追従しません。
おわりに
パラメーターが多く繊細なので変な動きをする場合は設定を見直してみてください。
他の種類のVATも順次追加予定です。
動かないとき
- テクスチャの設定を見直す
Max Size
やAlpha Source
など設定を変えてみるとうまくいくことがあります -
Engine
の設定
Unityを選んだ後にInitialize Engine
の押し忘れがあると動く向きがおかしくなります - エクスポート時のエラー
HoudiniのプロジェクトによってはVATエクスポート時にエラーになるようです。(原因不明)同じノード設定を新規プロジェクトで試すと出力できるかもしれません。