6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VRChatでHoudiniのVATを使う(RigidBody編)

Last updated at Posted at 2021-04-04

VATとは?

VertexAnimationTextureの略でメッシュのアニメーションをテクスチャとして出力しUnityで再生する手法です。
事前にアニメーションを計算しておくことで流体のような複雑なシミュレーションや大量のオブジェクトの動作を比較的軽量に実現できます。
VRChat(Quest版含む)でも動作するので他では作れない演出ができます。

アニメーションのパターンによって種類があり、今回は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 SizeAlpha Sourceなど設定を変えてみるとうまくいくことがあります
  • Houdiniの出力タイプを確認する
    RigidBodyのVATはPackedPrimitiveである必要があります
    vertex_animation_texturesノードのSOPpathに設定したノードをマウスミドルクリックし、PackedFragmentsと表示されるか確認しましょう。
Polygonsになっていた場合は`assemble`ノードを使うことでPackできます。 - `Engine`の設定 Unityを選んだ後に`Initialize Engine`の押し忘れがあると動く向きがおかしくなります - エクスポート時のエラー HoudiniのプロジェクトによってはVATエクスポート時にエラーになるようです。(原因不明)同じノード設定を新規プロジェクトで試すと出力できるかもしれません。
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?