なるように、なる

徒然なつぶやき、備忘録です。

UE4.26でVATをインスタンシングした

諸先輩方の記事の焼き直しですが、ツールバージョンの最新化による差異などもあったので、ワークフローに沿ってまとめておきます。

ワークフロー

  • mixamo 3DキャラクタのアニメーションFBXを取得する
  • blender FBXをAlembicに変換する
  • Houdini AlembicをVAT(Texture&FBX)に変換する
  • UE4 VATをインスタンシングする

ツールのバージョン

  • UE4 : 4.26.1
  • Houdini : 18.5.563 Indie

参考文献

[1] mixamo -> Houdini
TouchDesignerでVertex Animation Textureを用いたアニメーションについて - Qiita

[2] Houdini -> UE4
Labs Vertex Animation Textures ROP / 作成したVATファイルをUE4で読み込む方法 | インディゾーンHoudini情報日本語ブログ

[3] UE4でインスタンシング
UE4でのVATの小ネタ、区間指定ループ - Qiita

アウトプット

mixamoでFBXを取得する

参考文献[1] の手順①のとおりです。
(Komakinexさん、ありがとうございます!)
FBXをダウンロードする際、フレーム数(画像の赤枠部分)を控えておくようにしましょう(次の工程で使います)。

f:id:Shampagne:20210719114701p:plain

blenderでAlembicに変換する

参考文献[1] の手順②のとおりです。
(Komakinexさん、ありがとうございます!!)

HoudiniでVATに変換する

ここから少し情報のアップデートがあります。
HoudiniによるVAT関連の資料では「Game Development Toolset」として紹介されていますが、Houdini18からSideFX Labsと改名されました。 こちらにインストール方法が書いてありますが、私(Houdini18.5)は特になにもしなくてもSideFXLabsを使用することができました。
(もしかしたらHoudiniのワークショップ中にセットアップしてたかもですが...)

Geometry

  • スケールの設定
    ツールをまたいだ単位の差異をまだ理解していないのですが、ここで100倍しておくと上手くいきました。。。 f:id:Shampagne:20210719114739p:plain

Rop

  • UIが「Game Development Toolset」から変わっているが、変更が必要なパラメタは基本同じ
    参考文献[2]に詳細な解説あり f:id:Shampagne:20210719114803p:plain

Hipファイルの保存場所と同じ場所に、exportフォルダが作成され、中に以下の3つのフォルダた作成されます。

materials

  • シェーダーの設定に必要な値が記述されたjsonファイル

meshes

  • モデルの情報が記載されたFBXファイル

textures

  • 頂点情報が記載されたexrファイル

UE4にVATを取り込む

参考文献[2] の[3.プラグインの読み込み]の手順になります。
HoudiniのVertesAnimationTextureのパラメタの下部にある[contents plugin]ボタンを押すと、UE4向けのプラグインの格納フォルダが開きます。 f:id:Shampagne:20210719114822p:plain

  • 格納フォルダのパス(私の場合)
C:\Program Files\Side Effects Software\sidefx_packages\SideFXLabs18.5\unreal\4.25\SideFX_Labs

これをUE4のフォルダ配下に、[Plugins]というフォルダを作成し、上記のSideFX_Labsフォルダをコピーします。
私が使ったHoudini 18.5ではUE4.26向けフォルダはありませんでしたが、胡麻化して使うことが出来たので、UE4.25向けのPluginを使用しました。

フォルダ配置後、UE4プロジェクトを立ち上げ直すと、ContentBrowserに出てくるようになります。 f:id:Shampagne:20210719114844p:plain

textures配下のEXRファイルを読み込む

  • UE4にドラッグ&ドロップする
  • importしたtextureを右クリックし、メニューを表示する
  • [Scripted Actions -> SideFX Set VAT Textures]を選択する

meshes配下のFBXファイルを読み込む

  • UE4にドラッグ&ドロップする
  • Import用のUIが出てくるので、Import Allボタンを押下する
    (設定変更が必要な箇所は参考文献[2]を参照)
  • importしたstatic meshをダブルクリックする
  • [LOD0 -> build settings -> Use Full Precision UVs]にチェックを入れる f:id:Shampagne:20210719114910p:plain

materials配下のJsonファイルを読み込まない...

現状のSidFX_Labsのプラグインでうまくいかなかったところなのですが、ここで読み込んだJsonの値をあとでScriptActionでmaterialに反映させたいのですが、反映されませんでした。
手作業で反映するため、Jsonは読み込まないで進めました。

material instanceの作成

  • [ContentBrowser -> SideFX_Labs_Content -> Material]を開く
  • M_VAT_Softを右クリックし、[Create Material Instance]を押下する
  • 作成されたMaterialInstance(M_VAT_Soft_Inst)を作業フォルダにコピーする
  • MaterialInstanceをダブルクリックして開く
  • 使用するパラメタにチェックを入れ、[materials/vertex_animation_textures1_data.json]の値を手打ちで設定する(下図参照)
    • numOfFrames
    • speed
  • PositionMapにImportしたTextureを設定する
  • normalizedDataのチェックを外す ここが何故だか分かってないです。他のやり方がうまくいかず、これが上手くいっただけ。。 f:id:Shampagne:20210719114929p:plain

ここまででImportしたモデルをVATで動かす準備が完了です。 static meshをレベルに配置し、Element0にMaterialInstanceを設定すると、モデルが動くはずです。 f:id:Shampagne:20210719114952p:plain

UE4でインスタンシングする

インスタンシングした際の挙動をインスタンス毎に変化させる手順です。 参考文献[3]を参考にしました。

インスタンス毎に頂点情報を読み出すタイミングをオフセットさせるのですが、 これはSideFX_Labs内のMaterialInstanceを変更していくことになります。

MaterialFunctionの変更

  • [ContentBrowser -> SideFX_Labs -> Materials -> MaterialFunctions]フォルダを開く
  • MF_VAT_Softを右クリックしDupulicateで複製し、MF_VAT_Soft_Instとする
  • MF_VAT_Soft_Instをダブルクリックして開く
  • 図のように、PerInstanceRandomノードとNumberOfFramesをMultiplyし、TimeとAddする
    f:id:Shampagne:20210719120740p:plain
    変更前
    f:id:Shampagne:20210719120813p:plain
    変更後

Materialの変更

  • [ContentBrowser -> SideFX_Labs -> Materials]フォルダを開く
  • M_VAT_Softを右クリックしDupulicateで複製し、M_VAT_Soft_Instとする
  • M_VAT_Soft_Instをダブルクリックして開く
  • MF_VAT_Softを使用している箇所をMF_VAT_Soft_Instに差し替える
  • 前項[material instanceの作成]をM_VAT_Soft_Instに実施する

StaticMeshをインスタンシングする

  • モデルのStaticMeshをレベルに配置する
  • パラメタのMaterials->Element0に前項でパラメタ作成したMaterialを設定する
  • StaticMeshをコピーしてレベルに配置する (ここまでで、全モデルが同じ動きをしているはずです)
  • 配置したモデルを全て選択し、右クリック->MergeActorsを押下する
  • MergeActors画面で一番右側のタブ(家?)を選択し、MergeActorsボタンを押下する f:id:Shampagne:20210719115105p:plain

これで、モデルの挙動がインスタンス毎に変化させることが出来るようになりました。

f:id:Shampagne:20210719115118p:plain

おわりに

理解が不足しているところが多々あるので、不適切な箇所がありましたらご連絡いただければと思います。
多くの方が知見を整理・公開してくださっていたおかげで、なんとかやりたいことができました。
先人のみなさまに感謝です。