JKになりたい

何か書きたいことを書きます。主にWeb方面の技術系記事が多いかも。

VAT(頂点アニメーションテクスチャ)を使ってHoudiniで作成した破壊シミュレーションをUnityにもってくる

Houdiniで作成した破壊シミュレーションをUnityにもってくる手順をメモとして残しておきたいと思います。

シミュレーション結果をUnityで利用するには、VAT(頂点アニメーションテクスチャ)をエクスポートし、それをUnityで利用します。

VATとは

VAT(頂点アニメーションテクスチャ)とは、名前の通りテクスチャに頂点のアニメーション情報(位置、回転)を書き込んだものになります。

このテクスチャに書き込まれた値を元に、各頂点の位置を決定していきます。

VATをexportする

今回はまず、Houdiniのシェルフからシンプルな破壊シミュレーションを生成しました。

こんな感じで、地面に落下すると要所要所のパーツが外れるものです。

f:id:sakata_harumi:20210617224730p:plain

エクスポートには、Labs Vertex Animation Texturesノードを利用します。SideFX Labsのインストールが必要です。

f:id:sakata_harumi:20210617224946p:plain

設定はこんな感じ。Method、Engine、SOP Pathを設定しています。あと、Target Texture Sizeも良しなに。

f:id:sakata_harumi:20210617225300p:plain

重要なのは Method
ここを間違うとうまく動かなくなります。今回はRigid。

Method
Soft シミュレーションを通じてトポロジーが一定のもの
Rigid パックプリミティブを元にしたリジッドボディシミュレーション
Fluid シミュレーション中にトポロジに変化があるもの
Sprite 空間を移動するポイントを常にカメラを向くカードで表示

(引用: Game Tools | 頂点アニメーションテクスチャ (VAT) | SideFX )

これでRenderすると、Paths/Projectで指定したパスにテクスチャ、FBX、マテリアルがエクスポートされます。

テクスチャは各頂点の位置を記録したもの、回転を記録したものの二種類ができているはずです。

f:id:sakata_harumi:20210617230709p:plain
position texture

f:id:sakata_harumi:20210617230705p:plain
rot texture

UnityでVATを利用する

Textureのimport

まずは、テクスチャをUnityにインポートします。このとき、テクスチャのサイズや値が変わってしまうような設定は切る必要があります。

f:id:sakata_harumi:20210617232031p:plain

  • sRGBをオフにする
  • Non-Power of 2をNoneにする
  • Generate Mip Mapsをオフにする
  • Filter ModeをPoint(no fitler)にする

Shaderのimport

SideFXが提供している SideFX LabのリポジトリにVATを使うためのシェーダーがあります。

github.com

※似た内容のリポジトリとして「GameDevelopmentToolset」というリポジトリも存在しますが、こちらは古いものなので注意

最新のReleaseが1.173なので、こちらをダウンロードしました。

(が、UnityのShaderが入っているディレクトリは本記事執筆してから13ヶ月間特に更新がないみたいなので、どのタイミングのコードでも内容は同じです)

unity→shaders→URP にpackage.jsonが入っているので、Unityパッケージマネージャー→ add package from diskからパッケージをimportします

URPのパッケージですが、中に入っているShaderGraphはHDRPでも動作しました。

これで、VATの利用に必要なShaderがimportできました。

f:id:sakata_harumi:20210617234753p:plain

materialをimport

EngineをUnityにしていることで、先ほどHoudiniからexportした先のディレクトリにmaterials/****.mat も同時に生成されているはずです。これをUnityに取り込みます。

すると、VATの生成に利用したMethodに対して適切なShader(SideFX/VAT_Rigid_SG)を利用したマテリアルがimportされます。

ここのPositionMapとRotation Mapに先ほどのテクスチャを入れるだけでマテリアルの設定は完了です。

f:id:sakata_harumi:20210617235208p:plain

自分でマテリアルを生成する場合などで、Speed、Number Of Frams、Pivot Min/Max、Position Min/Maxの値を設定する必要がある場合、このパラメータはLabs Vertex Animation Textureノード、もしくはmaterials以下に出力されているjsonから確認できます。

f:id:sakata_harumi:20210617235709p:plain

結果を確認

先ほどHoudiniからexportした先のディレクトリにmeshs/***.fbx が生成されているはずです。
これをUnityのシーンに設置して、マテリアルを適用させてあげると完了です

このように、無事Unityで破壊シミュレーションの結果を利用することができました!

youtu.be

もう少し複雑なシミュレーションを試す

先の例は変化が大きくなかったので、もっとバラバラになるパターンも試してみたいと思います。

シェルフで生成されたネットワークを少しいじって、パーツがバラバラになるようにします。

f:id:sakata_harumi:20210618001142p:plain

voronoi fractureノードを利用して、モデルをボロノイ分割しました。

あとは手順は全く同じで、VATをエクスポートし、Unityから利用しました。

結果はこんな感じ。問題なくできました。

youtu.be

因みに上の動画はURPで実行していますが、HDRPでも問題ありませんでした。

もっと複雑なシミュレーションを試す

今度は、もっと複雑なネットワークで試してみます。単純な形状で破壊シミュレーションをした後、その破片の形状を複雑なものに置き換えるネットワークです。

f:id:sakata_harumi:20210618001825p:plain

このようなアニメーションになるはずです。(動画はHoudiniでレンダリングしたもの)

www.youtube.com

これを全く同じ手順でVATをエクスポートし、Unityから利用したのが以下の動画です。

youtu.be

うまくいきませんでした ( ;∀;) コロシテ...コロシテ...と声がきこえてきます。

断面のディテールを表現するために、RBD Interior Detail geometryノードを利用しているのですが、これのせいでメッシュの構造が最初と変わってしまったから・・が原因でしょうか?

はっきりした事はわかりませんが、何でもかんでもうまくいくわけではないということで、利用の際には注意が必要そうです。
定期的にVATに出力して、うまくいくか試しつつ開発を進めていくのが良さそうです。

さいごに。

これまでの例では、モデルにテクスチャが貼られていなかったりと、実際のゲームで使えないものでした。

実際のゲームで使うには、提供されているShaderGraphを良しなにカスタマイズする必要があります。 幸い、ShaderGraphの構造自体は非常にシンプルなので安心です。

f:id:sakata_harumi:20210618003124p:plain

難しいのは中央のVAT_Rigid_SubGraphの中で使われているカスタムノードのHLSLなんですが、多分実務的には理解しなくても大丈夫です。

(こちらはまたじっくりと読んで理解しようと思います)

実際ゲームで使うために、例として以下のようなカスタマイズをしてみました。

  • MasterノードをLitにした
  • テクスチャを貼れるようにした
  • シミュレーションの時間を外部からfloatで与えられるようにした

f:id:sakata_harumi:20210618003440p:plain

このShaderを使ってみると、(わかりにくいですが)テクスチャが反映されていることがわかります。

f:id:sakata_harumi:20210617223201p:plain

おわり。次は流体シミュレーションでも試してみようと思います。