Houdiniで作成した破壊シミュレーションをUnityにもってくる手順をメモとして残しておきたいと思います。
シミュレーション結果をUnityで利用するには、VAT(頂点アニメーションテクスチャ)をエクスポートし、それをUnityで利用します。
VATとは
VAT(頂点アニメーションテクスチャ)とは、名前の通りテクスチャに頂点のアニメーション情報(位置、回転)を書き込んだものになります。
このテクスチャに書き込まれた値を元に、各頂点の位置を決定していきます。
VATをexportする
今回はまず、Houdiniのシェルフからシンプルな破壊シミュレーションを生成しました。
こんな感じで、地面に落下すると要所要所のパーツが外れるものです。
エクスポートには、Labs Vertex Animation Texturesノードを利用します。SideFX Labsのインストールが必要です。
設定はこんな感じ。Method、Engine、SOP Pathを設定しています。あと、Target Texture Sizeも良しなに。
重要なのは Method
ここを間違うとうまく動かなくなります。今回はRigid。
Method | |
---|---|
Soft | シミュレーションを通じてトポロジーが一定のもの |
Rigid | パックプリミティブを元にしたリジッドボディシミュレーション |
Fluid | シミュレーション中にトポロジに変化があるもの |
Sprite | 空間を移動するポイントを常にカメラを向くカードで表示 |
(引用: Game Tools | 頂点アニメーションテクスチャ (VAT) | SideFX )
これでRenderすると、Paths/Projectで指定したパスにテクスチャ、FBX、マテリアルがエクスポートされます。
テクスチャは各頂点の位置を記録したもの、回転を記録したものの二種類ができているはずです。
UnityでVATを利用する
Textureのimport
まずは、テクスチャをUnityにインポートします。このとき、テクスチャのサイズや値が変わってしまうような設定は切る必要があります。
- sRGBをオフにする
- Non-Power of 2をNoneにする
- Generate Mip Mapsをオフにする
- Filter ModeをPoint(no fitler)にする
Shaderのimport
SideFXが提供している SideFX LabのリポジトリにVATを使うためのシェーダーがあります。
※似た内容のリポジトリとして「GameDevelopmentToolset」というリポジトリも存在しますが、こちらは古いものなので注意
最新のReleaseが1.173なので、こちらをダウンロードしました。
(が、UnityのShaderが入っているディレクトリは本記事執筆してから13ヶ月間特に更新がないみたいなので、どのタイミングのコードでも内容は同じです)
unity→shaders→URP にpackage.jsonが入っているので、Unityパッケージマネージャー→ add package from diskからパッケージをimportします
URPのパッケージですが、中に入っているShaderGraphはHDRPでも動作しました。
これで、VATの利用に必要なShaderがimportできました。
materialをimport
EngineをUnityにしていることで、先ほどHoudiniからexportした先のディレクトリにmaterials/****.mat も同時に生成されているはずです。これをUnityに取り込みます。
すると、VATの生成に利用したMethodに対して適切なShader(SideFX/VAT_Rigid_SG)を利用したマテリアルがimportされます。
ここのPositionMapとRotation Mapに先ほどのテクスチャを入れるだけでマテリアルの設定は完了です。
自分でマテリアルを生成する場合などで、Speed、Number Of Frams、Pivot Min/Max、Position Min/Maxの値を設定する必要がある場合、このパラメータはLabs Vertex Animation Textureノード、もしくはmaterials以下に出力されているjsonから確認できます。
結果を確認
先ほどHoudiniからexportした先のディレクトリにmeshs/***.fbx が生成されているはずです。
これをUnityのシーンに設置して、マテリアルを適用させてあげると完了です
このように、無事Unityで破壊シミュレーションの結果を利用することができました!
もう少し複雑なシミュレーションを試す
先の例は変化が大きくなかったので、もっとバラバラになるパターンも試してみたいと思います。
シェルフで生成されたネットワークを少しいじって、パーツがバラバラになるようにします。
voronoi fractureノードを利用して、モデルをボロノイ分割しました。
あとは手順は全く同じで、VATをエクスポートし、Unityから利用しました。
結果はこんな感じ。問題なくできました。
因みに上の動画はURPで実行していますが、HDRPでも問題ありませんでした。
もっと複雑なシミュレーションを試す
今度は、もっと複雑なネットワークで試してみます。単純な形状で破壊シミュレーションをした後、その破片の形状を複雑なものに置き換えるネットワークです。
このようなアニメーションになるはずです。(動画はHoudiniでレンダリングしたもの)
これを全く同じ手順でVATをエクスポートし、Unityから利用したのが以下の動画です。
うまくいきませんでした ( ;∀;) コロシテ...コロシテ...と声がきこえてきます。
断面のディテールを表現するために、RBD Interior Detail geometryノードを利用しているのですが、これのせいでメッシュの構造が最初と変わってしまったから・・が原因でしょうか?
はっきりした事はわかりませんが、何でもかんでもうまくいくわけではないということで、利用の際には注意が必要そうです。
定期的にVATに出力して、うまくいくか試しつつ開発を進めていくのが良さそうです。
さいごに。
これまでの例では、モデルにテクスチャが貼られていなかったりと、実際のゲームで使えないものでした。
実際のゲームで使うには、提供されているShaderGraphを良しなにカスタマイズする必要があります。 幸い、ShaderGraphの構造自体は非常にシンプルなので安心です。
難しいのは中央のVAT_Rigid_SubGraphの中で使われているカスタムノードのHLSLなんですが、多分実務的には理解しなくても大丈夫です。
(こちらはまたじっくりと読んで理解しようと思います)
実際ゲームで使うために、例として以下のようなカスタマイズをしてみました。
- MasterノードをLitにした
- テクスチャを貼れるようにした
- シミュレーションの時間を外部からfloatで与えられるようにした
このShaderを使ってみると、(わかりにくいですが)テクスチャが反映されていることがわかります。
おわり。次は流体シミュレーションでも試してみようと思います。