Vertex Animation Texture (CINEMA4D > Houdini > Unity)

Vertex Animation TextureをUnityで使えるという情報があったので試してみました

Vertex Animation Textureとは?
VertexShaderの各頂点の位置の値をテクスチャとして読み込んで
VertexShaderで各頂点を動かせるという便利な方法

Unityで頂点アニメーションをする時は
Alembic importerを使う、VertexShaderで頑張る
GeometryShaderで頑張る、ボーンをいっぱい入れて頑張る
等々色々な方法があるが
これが出来ればShader(GPUさん)で動かせるので
動作も軽くコスパが良さそう

今回試したワークフローは以下になります
CINEMA4Dで作ったモーションをAlembicで書き出し

HoudiniでAlembicを読み込んでVertex Animation Textureを書き出し

UnityでVertex Animation Textureを使って頂点アニメーション

1.導入
まずHoudiniでVertex Animation Texturesノードを使えるようにしないといけないHoudini15にはVertex Animation Texturesノードは無いので
Houdini15以前の場合は16にアップデートする
無事アップデートが完了したら
下記リンクでGameDevelopmentToolsetをダウンロード

ダウンロードが完了したら
GameDevelopmentToolset-Developmentフォルダを解凍
GameDevelopmentToolset-Development \ houdini.envのファイルをコピーして
下記ディレクトリにペーストして上書き
C:\Users\ユーザー名\Documents\houdini16.0 \ houdini.env

次にGameDevelopmentToolset-Development自体を丸っとコピーして
C:\Users\ユーザー名\Documentsにペースト
そして先ほどのhoudini.envをテキストエディタで開く

一番下の行の
C:\PATH\TO\YOUR\DIRECTORY;&

C:\Users\自分のユーザー名\Documents\GameDevelopmentToolset-Development;&
に書き換えて上書き保存

これでHoudiniでVertexAnimationTextures(Beta)ノードが使えるようになります
ちなみにHoudini16のデフォルトで使えるVertexAnimationTexturesノードを改良したのがVertexAnimationTextures(Beta)ノードらしい

2.CINEMA4Dでモーション付ける
次にCINEMA4D(以下c4d)でなんか適当にモーションを付けます
 
別にc4dは使わなくても良いのだが、他のDCCツール(例えばMayaとか)で何かしらアニメーションつけた物をVertexAnimationTextureで動かす時があるかもしれないので一応テストとしてHoudiniの前に一つツールをかませておきます
それをAlembicで書き出し

3.Houdiniでテクスチャ書き出し
HoudiniでAlembicをimportする際にLoad AsをHoudini Point Cloudに選択しておく


無事読み込めたら
分かりやすいように
Alembicにnullを繋げて名前を「out」にでもしておきましょう

networkをoutに移動してVertexAnimationTexture(beta)ノードを出す

ここらへんでHoudiniのシーンを好きな場所に保存しておきましょう
(このシーンを保存したディレクトリにテクスチャが出力されます)

次にVertexAnimationTexture(beta)ノードのパラメーターをいじります

MethodをSoft
ExportNodeは先ほどAlembicの次に繋げたoutノードを指定
PackNormalintoAlphaのチェックを外す
これでRenderを押す
そうすると先ほどシーンを保存したディレクトリに「export」というフォルダが出来るここに3つファイルがあるはず
名前_mesh.fbx
名前_norm.exr
名前_pos.ext
これでHoudiniで書き出す作業は終わり
Houdiniはまだ使うのでアプリは落とさずに次はUnityの作業に入る

4.Unityで動かす
先ほどHoudiniから書き出した3つのファイルをUnityに読み込む
この3つのファイルはInspectorで設定をちょっと変える必要がある
mesh

pos

norm

(ここの設定は最初にダウンロードしたGameDevelopmentToolsetの中に入ってる
vertex_animation_examples.unitypackageをimportして、中に入ってるsceneのメッシュやマテリアルの設定を参考にすると良い
)

次に初めにダウンロードした
GameDevelopmentToolset-Development\unity\vertex_animation_examples.unitypackage
をimport
Materialを新規作成して
Shadersをvertex_soft_body.shaderに変更


そしてマテリアルの
Position Mapにpos.exrを割り当てる
Normal Mapにnorm.exrを割り当てる
Number of FramesをHoudiniの値をHoudiniのNumber of Framesと同じ値を入れる
Bounding MaxにはHoudiniのBBOY MAXの値を100で割った値を入れる
Bounding MinにはHoudiniのBBOY MINの値を100で割った値を入れる


そしてこのマテリアルをメッシュにアタッチすると
Vertex Animation Textureを使った頂点アニメーションが完成
 

補足
今回はvertex_soft_bodyを例に作ってみましたが
これをfluidで試してみた所トポロジーがぐちゃぐちゃになったので
原因が分かり次第更新しようと思います。

参考
Unity シェーダ用頂点アニメーション出力ツール | SideFX

Houdiniで作成したエフェクトをUE4で動かす(VertexAnimationTexture) - #memo