仕事でHoudiniとUE4を行き来することが出てきたので、学習がてらメモを残す。(仕事としては、HoudiniのCHOPでいい感じにしたチャンネルの値を、UE上カメラの移動回転に適用したい、という素朴なニーズであった。このニーズに関してはFBXで実現したが、VATやNiagara連携といった一見して派手なのも興味としてあったので合わせて残すことにした。

Houdini Engine (HDAエクスポート)はアニメーションを念頭にしていない

Houdini EngineはUnity、Unreal Engine、Mayaに、SOP(Surface Operators: 頂点情報を計算で変化させていく演算処理およびその結果)のパラメータを公開した上でエクスポートできる機能である。

HoudiniでSOPをアセット化できる仕組みは、HDA(Houdini Digital Asset)として提供され、Houdini内での再利用や、プラグインを入れた場合にUnity、UE4、Mayaでの読み出しが可能になる。Houdini上の任意のsubnet SOPでHDA化ができる。HDAに対してパラメータを追加して、これを内部のノードのパラメータに参照させることで、そのパラメータはゲームエンジン上でも編集が可能になる。Unreal Engineに持っていく場合、HDAをインポートするとHoudiniAssetComponentを持った派生クラスとして作成される。

しかしながら、Houdini Engineで用意したパラメータは、ベイクやシェーダコンパイルと同じようにランタイムを想定しない、ゲームループ以外のタイミングでのみ利用されるために、この値をアニメーションさせることはできない。処理負荷的にもUIで微調整するためだけにあって、リアルタイムにアニメーションさせる念頭ではないことがわかる。

FBXエクスポート

Houdiniでの基本的なアニメーションはFBXにエクスポートして持っていくのがまず最初に考えられる。Geometryノード上で作成したトランスフォーム(移動回転拡縮)の親子関係も表現できるが、このようなトランスフォームの親子情報はUE4側ではいかなる形であれSkeletonと、そのアニメーションとして保持される。(だからアニメーション付きのFBXはインポート後、SkeltalMeshとしてインスタンス化される。)

自分がやりたかったCHOPで加工したカーブをUE4に連携するというのはこの方法で実現した。用途はカメラの移動回転データだったので、Houdini上でCHOPの値をGeometeryのNULLノードのトランスフォームに適用した。頂点情報をもたないFBXはUE4ではインポートできないため(点一つでもダメであった)、球体をNULLノードの出力に接続した。Geometryノードを結線することで、Transformの親子関係は表現できる。UE4で目的の動きをもった球体がインポートできた。球体は実際にレンダリング時には全く不要であるため、Details > Rendering > Visibleを無効化した。HoudiniのNULLに相当する階層をSocketとしてカメラを置いて目的を達成した。

Alembicエクスポート

FBXとは異なり、トランスフォームの親子関係を前提とせず、頂点配列のアニメーションを記録したフォーマットであるため、FBXのような構造に起因する問題が少ない。また頂点に対する任意の付加情報(アトリビュート)も格納できる仕様である。Houdiniは頂点アトリビュートの操作が強力であるから、ゲームエンジン側で連携させるなど非常に役立ちそうだ。また、UE4でAlembicをインポートする際には、SkeltalMeshではなくGeometryCacheとして表現されるために扱いには差が出てくる。問題点としては、トランスフォーム情報が保持されないので、Socketにライトやカメラを付けたいといったニーズに対応することができなくなることだろうか。

VAT

流体や軟体のシミュレーションできたメッシュのアニメーションは、FBXのような形式(CPUで頂点情報を読み出ししてSkeltalMeshなどの頂点配列の更新をかける)では超点数を絞る必要があり、細かなリアリティやパフォーマンスの上で難がでてくる。こうした問題を克服するのがVAT(Vertex Animation Texture)だ。大量の頂点の時系列情報をピクセルとしてテクスチャに焼き込んだものを、ゲームエンジン内の処理においてGPU上で並列に読み出しして更新をかけるという方式。Houdiniでは頂点アニメーションをテクスチャに焼き込めるROPノードがSideFX Labs Toolsで提供されており、ゲームエンジン側でVATを読みこむシェーダーを用意すればアニメーションができる。VATに関しては高い関心があるのか、日本語記事も多く見つけられると思う。

HoudiniでベイクしたVAT情報をUnreal Engineでパーティクルエンジンの中で再生させるこちらの公式チュートリアルは機能を素晴らしい形で説明している。VATの読み出しに相当するMaterialエディター(つまりShaderエディタ)の情報がHoudini上からコピーできるのは驚いた…。

Houdini Niagara

UE4のノードベースのパーティクルエミッターであるNiagaraに対して、シードとなるデータをCSVで連携する仕組み。一応Houdini Engineのサブシステムであるようだが、HDAを連携するのとはかなり様相が異なる。日本語解説では、「HoudiniとUnreal Engine4で学ぶリアルタイムVFX」(池田亘著、ボーンデジタル)に素晴らしい記述があるのでそれを参照されると良い。

フレーム毎の頂点(に類する)データを数値として保存する点はVATと類似するが、Niagaraの機能を前提とした柔軟な連携が可能となってくる。

上記の本では、SideFx Labs Toolsの機能の破壊シミュレーションで生成された破片のモデルデータをFBXとして、また、シミュレーションの結果としての計算した破片の初期ベクトルをCSVとして保存し、煙を生成するエミッターの情報に用いていた。リアルタイムで処理できるパーティクルエフェクトはNiagaraを使い、リアルタイムでは難しい部分のみHoudiniで実現するといった目的にあった使い分けができ表現のバリエーションが増えると思われるが、Niagara自体に習熟がないと厳しい印象もあった。