Houdini で作成した物理アニメーションをゲームエンジンに出力する手順 FBXアニメーション編

Houdiniで作成した物理シミュレーションによるアニメーションをUnreal Engine 4 に出力する手順です。
※Unityでも大まかな手順は同じです。

物理シミュレーションをゲームエンジンに出力したい場合、トランスフォーム情報をテクスチャ化してゲームエンジンで再生する Vertex Animation Texture (VAT) という方法が有名ですが、

http://ikatnek.blogspot.com/p/vertex-animation-texture-unreal.html

今回紹介する方法はもう少し手軽な、FBXの中に物理アニメーションも含めて出力する方法になります。

#シミュレーションさせるオブジェクトの準備

物理シミュレーションさせるオブジェクトを準備します。
この記事では簡単に box と ブタさんで作成します。

まずネットワークエディタ上でTabキーを押し geo と入力。
「Geometry」がハイライトされた状態でEnter で Geometry node を作成。
さらにもう一度Enterを押して Geometry コンテキストに入ります。

そこで box と testgeometry_pickhead（ブタさん）を作成。
copy to point を作成し左側の第1インプットにブタさんを接続
右側の第2インプットに box1 をのポイントに接続。
ブタさんとcopy to point との間に、新たにtransform SOP を作成し、
ブタさんをお互い重ならない程度にそのtransform SOP で縮小しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/71d82fd3-eff2-d982-2dbf-f2b63a6ee1b3.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/d37e30e5-7110-a0c2-0b27-90a359020097.png)
さらにcopy to point に続けて transform SOP を作成しtranslate Y に適当な数値をいれて上に移動させます。
このオブジェクトを床に落下させる物理シミュレーションを準備します。

#物理シミュレーションのセットアップ
ジオメトリの準備ができましたのでネットワークビュー上にマウスカーソルを持っていき、Uキーを押してObject階層に戻ります。

これから物理シミュレーションを作成していきます。
ここも簡単にすませます。

まず床を作成します。
シェルフのCollisionsタブから Ground Plane をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/168048e8-d2ee-4a1c-2c24-626a2418e67a.png)
AutoDopNetwork と groundplane_object1 が作られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/9d119e63-4d81-4dfb-e26f-5089a7a80acc.png)
これでブタさんが落下する床ができました。

次にブタさんを落下させるシミュレーションをセットアップします。
先程作成したブタさんのオブジェクト「geo1」を選択した状態で
シェルフのRigid Body タブの RBD Objects をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/eae7d174-092d-206f-132e-a9b3dc56d0e6.png)

以上でセットアップが完了です。
再生ボタンを押すと、床にブタさんが落下するアニメーションを確認できると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/ae9f69c0-9401-b3af-de2d-4d8219bd3872.png)
#FBXファイルへ出力
これからの手順がこの記事の本題です。
作成したアニメーションをゲームエンジンに出力します。

シェルフの Game Development Toolset の RBD to FBX をクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/c71a1e9e-4f39-7e34-58a4-d4b099db4444.png)
Outputコンテキストに rop_rbd_to_fbx1 が作成されているので（下図①）
プロパティの Node To Export 欄で先程作成したブタさんのオブジェクトであるgeo1を選択（下図②）。
Render ボタンをクリックすると（下図③）アニメーションとジオメトリがfbxとして出力されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/23f5d059-c0fa-f663-ee6a-d17bd71aa9c4.png)

一点注意点としてこの手順はで出力できるデータは現時点では Pack Primitive を使った Rigid Body になります。
ここまでの手順で、その設定はされているのですが、独自にシミュレーションを作成する場合はご注意ください。

#UnrealEngine4にインポート
出力されたfbxをUnrealEngine4にドラッグ＆ドロップで読み込みます。
注意点としてHoudiniのデフォルトのスケール値がUE4では小さいので、
Import Uniform Scale に100と入力して100倍にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/7aa1299c-315b-3027-c816-d45d360cdcdf.png)
ジオメトリファイル、Anim、PhysicsAsset、Skelteton が作成されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/adbfbc8e-c715-30e8-cf69-f66944d690ac.png)
適当なシーンを準備してピンク色のサムネイルであるジオメトリファイルをシーンにドラッグドロップ。
Detail タブのAnimationペインで
Animation Mode を Use Animation Asset に設定し、
先程作成されたAnimアセットを Anim to Play 欄にドラッグドロップで設定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/0b42db46-7d16-0b50-b03e-74bce4b410a6.png)

ゲームを再生すると
物理アニメーションが再生されるのを確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/314518/32c4650e-14fa-eed1-5fcb-af9db0c01372.png)
今回UnrelEngine4を使って説明しましたが、基本Unityでも手順は同じです。
fbxの読み込みとアニメーション設定のところだけ、一般的なUnityのアニメーションの手順に従って設定してください。同じように物理アニメーションを確認できるはずです。

#Vertex Animation Texture との違い
最後にfbxアニメーションを使った今回の手順とVertex Animation Texture(VAT)との違いの主な点を説明します。

・ランタイム負荷について。
今回の手順はお手軽ですが、ゲームエンジンでアニメーションを直接再生している関係で一般的なアニメーションと同じだけのCPU負荷が発生します。
一方で、VATは手順は少し手間がかかりますが、計算をGPUで計算する関係で処理負荷が非常に軽いです。そのため多量の破片が飛び散るような破壊アニメーションなども負荷をあまり気にせず動かすことが可能です。

・マテリアルについて。
VATの場合、マテリアルの頂点シェーダーとしてアニメーションを再生する関係で、マテリアル設定の自由度が下がります。設定できるマテリアル数もアニメーションデータに対して1つになります。
一方、今回紹介したやり方ではHoudiniでモデルに設定したマテリアルの数だけUnrealEngine上でもマテリアルをアサイン可能です。
また、シェーダーも一般的なシェーダーと同じものを利用可能となります。
とはいえ、ドローコールが増えますので注意が必要です（**←181120 追記**）

・出力できるシミュレーションの種類について
FBXアニメーションを使ったやり方は、シミュレーションの種類として Rigid Body に限りますが、VATの場合、流体やソフトボディなど様々なシミュレーション結果を出力可能です。

以上、間違い等ありましたら教えていただけるとありがたいです。

※使用したアプリケーションのバージョン
Houdiniのバージョンは17.0.352
Unreal Engine 4.19