LoginSignup
14
10

More than 3 years have passed since last update.

VRChatでHoudiniのVATを使う(SoftBody/Fluid編)

Last updated at Posted at 2021-03-31

VATとは?

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

アニメーションのパターンによって種類があり、今回は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ノードを追加。vellumobjectmergeします。
staticobjectSOP 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

OK!

VATはシェーダーで見た目だけを動かしているのでメッシュの実体は初期位置のままです。(オレンジ枠線部)
カメラを動かして破片が消えてしまうときはMeshRenderをSkinedMeshRenderに変えてBoundsを大きくしてみてください。
また、同じ理由からMeshColliderなども追従しません。

おわりに

パラメーターが多く繊細なので変な動きをする場合は設定を見直してみてください。
他の種類のVATも順次追加予定です。

動かないとき

  • テクスチャの設定を見直す
    Max SizeAlpha Sourceなど設定を変えてみるとうまくいくことがあります
  • Engineの設定
    Unityを選んだ後にInitialize Engineの押し忘れがあると動く向きがおかしくなります
  • エクスポート時のエラー HoudiniのプロジェクトによってはVATエクスポート時にエラーになるようです。(原因不明)同じノード設定を新規プロジェクトで試すと出力できるかもしれません。
14
10
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
14
10