Houdiniで作成したエフェクトをUE4で動かす(VertexAnimationTexture)
先日のGDC2017での公演、Houdini側で頂点アニメーション用のテクスチャを生成してUEで読み込むことで、Houdiniで作成したエフェクトがUE内で表現できちゃうというものがあった
UE側にプラグインを入れて云々というものではなく、あくまでHoudini側でこういったツールが用意されたという話で(去年からあったっぽいけど)、UEというよりHoudini側の話がメインです
今回はとりあえず爆発(煙)をやる、男の子は皆爆発が好きなので
あと自分用のメモ&Houdini普段そこまで触っていないため、上記の動画を見ながらやるのが一番正確です
概要
Houdini
- 適当なシミューレーションを作成
- Volumeをポリゴン化
- VertexAnimationTextureでジオメトリとテクスチャを生成、書き出し
UE4
- ジオメトリとテクスチャをインポート
- マテリアルを作成、適応
UE4 | 4.15.1 |
Houdini | 16 |
ツール等、細かい説明は省いてます、必要最低限
準備
16は最初からGameシェルフとツールが用意されているけれど、動画で使用しているものとバージョンが違うので最新のものを用意する
これはgithubから最新のものをダウンロードする方法と、上記vimeo内にあるサンプルプロジェクトに同梱されているものを使用するのどちらかをやる
githubからダウンロードする
github.com
githubにあるDevelopmentBranchのzipファイルをダウンロード、wiki内にあるinstallationにしたがってファイルを移動させておく
サンプルプロジェクトのものを使用する
上記Vimeo内にUEプロジェクトとGaveDevelopmentToolsetが同梱されたzipファイルリンクがあるので、これをインストールする
ueプロジェクトは詰まったときに設定を参考にしたり、レベルを見ておくだけでも楽しいのでダウンロードしておいたほうがよいです
シミュレーション作成
とりあえずなので、適当にシェルフのExplosion辺りで済ませる、作成できたらGlobalAnimationOptionからEndは短めにしておく
- objチャンネルのpyro_importに入ってimport_pyrofieldsにdeleteノードをつなげる
- Groupでdensityを選んで、OperationをDelete Non-Selectedに変更、Density以外いらないので消しておく
ConvertVBDを二つつなげてVolumeからPolygonに変換する
- Isovalueを調節して好みの形に整える
- PolyreduceノードのNumberでポリゴン数を固定、とりあえず5000くらいにしておく
- EqualizeEdgesを1にしておく
VertexAnimationTexture書き出し
outチャンネルに移動してVertexAnimationTextureノードを作成
Developerの方を入れていると、このようにBeta版がヒットして、そちらです
- MethodはFluidに、トポロジーがぐちゃぐちゃ変わるものはこれっぽい
- ExportNodeは /obj/pyro_import
- TargetPolycountは先程Polyreduceで固定した数に
- EqualizeEdgesにチェック
- TargetTextureSizeは書き出されるテクスチャの横サイズ、縦は動的に変わるので1024でも2048でもなんでも良い?
- GeometryPathを適切なところに設定
- NormalizeDataTo0-1spaceにチェック
- PackNormalintoAlphaにチェック、1枚必要なテクスチャが減る
- Cd設定してたりならExportColorMapもチェック、今回はやってないのでパス
これで左上のRenderを押してテクスチャ、ジオメトリが書き出されるのを待つ、Houdiniでの作業はこれで終わりだけれど、あとでUEのマテリアル設定のさい数値を参照したりするのでつけっぱなしにしておく
UE4にインポート
UE4の適当なプロジェクトにいま生成された二つのファイルをインポートする、インポート設定は、インポート後に変更してからのリインポートでなんとかなるのでとりあえず適当に
マテリアル設定
マテリアルグラフを開いたら、ここで一度Houdiniに戻り、VertexAnimationTexturesノードの下部にあるFluidVertexAnimationUE4Codeをクリックする
展開されると大量の文字列がありこれを全選択してコピーしておく
UE4のマテリアルグラフに戻り、ペーストするとネットワークが自動で生成されるので、コメントに従ってOutputにノードを繋いでいく
一番右側のコメントにもあるけれど、まずDetailタブからNumCustomizedUVsを3、TangentSpaceNormalをDisableにする必要があるので、先にやっておく
一通りノードをつなぎ終わったのを確認したら、エディタに戻り、今のマテリアルからマテリアルインスタンスを作成し、これを編集する
ここでまたHoudiniをちら見する、以下の表に対応するように数値をコピペする
UE4 | Houdini |
---|---|
Bouding Max | BBOX MAX |
Bouding Min | BBOX MIN |
num_franes | Number of Frames |
PositionMap | インポートしたPosテクスチャ |
最後に、インポートしたメッシュを開きいま設定したマテリアルインスタンスを適応する
この時点では90割くらいでグリッチが出まくっているはず、きれいな人はクリアです
まずLOD0にある設定を見る
デフォルトだとUseFullPrecisionUVsにチェックが入ってないはずで、ここにチェックを入れたら下にあるApplyChanges、これで大抵全クリになるはずだけれど、大抵どこか間違ってておかしいので以下チェックリストになります
- 動画をちゃんとみる
- サンプルプロジェクト(Vimeoにあるもの)の設定と見比べる
- シミュレーションやりなおすと大抵BBOXMaxMinも変わっている
- 全体フレーム数はEndの数値ではない…
- カクついてるように感じる時はMIでSpeedを上げるか、Houdiniのフレーム数を変えるかをする
- テクスチャ設定はUE4デフォルトの物で良い
今回触っていない部分としては
- カラーテクスチャ書き出しはフレームごとのCdが書き出される、temperature辺をUEに持っていくとEmissiveのマスクとして使える
- 他にもトポロジが変化しない(布など)もの等のエフェクトを書き出せる
おわり