[UE5][Blender]VATを作成し読み込む
VATはVartex Animation Textureという頂点変形アニメーションのことで
頂点の移動値を画像で出力することで軽いデータで取り廻せるアニメーションのこと
手順としては
・Blenderでアニメーションを作成
・VAT用テクスチャを作成
・UE5で読み込み、アニメーション
の流れ
Blenderのアドオンで『unreal_tools』が必要
https://github.com/JoshRBogart/unreal_tools?files=1
Blenderでアニメーションをつける
事前準備
フレームレートを設定する
UEと統一しておく

環境のユニットサイズを調整する
Unit Scaleを0.01に設定する

パースビューのEndを拡大する
Unitを小さくすると遠方の表示が削られてしまい、作業がしづらいのでEndを大きめに変更しておく

VATを作成する
キーフレームをインサートする"Iキー"でアニメーションを登録する
今回は1~60Fで移動するアニメーション

登録したフレーム数に合わせUnrealToolsを調整

Process Anim Meshesを押すとアニメーションがついていない『export_mesh』が追加される

UVエディターを表示し、画像一覧を見ると
『normals』『offsets』が追加されている

画像の保存
UVエディターのサイドバーにImageがあるので、作成された画像をSaveしていく(まだソフト上にしかないので保存しないと消える)
normalsの保存形式はBMP

offsetsの保存形式はEXRのFloat(Half)

export_meshのFBX出力(標準機能のExport)

Forwardで軸設定
UEで動かす
出力したデータをUE5に読み込む
それぞれ読み込んだデータは設定の変更する箇所があるので、変更点は以下に書いておく
メッシュの設定
Generate Missing Collision:OFF
Remove Degenerates:OFF
Generate Lightmap UVs:OFF
Combine Meshes:ON
Material Import Method:マテリアルを作成
Import Texture:OFF
※ただし、オブジェクトに複数のマテリアルを紐づけている場合は『マテリアル作成』ではなく『Create New Material』を選択する方がよい


テクスチャの設定をする
offsetsテクスチャ
ミップ全般設定:No Mip Maps
Texture Group:UI
Never Stream:ON
圧縮設定:HDR
sRGB:OFF
Filter:隣接した項目を選択

normalsテクスチャ
ミップ全般設定:No Mip Maps
Texture Group:UI
Never Stream:ON
圧縮設定:VectorDisplacementmap
sRGB:OFF
Filter:隣接した項目を選択

スケルタルメッシュの設定
縮退を取り除く:OFF
最大精度のUVを使用:ON
距離フィールド解像度スケール:0
調整が終わったら『変更を適用』

マテリアルの設定
新規マテリアルに作成した2テクスチャを両方読み込み『テクスチャオブジェクトに変換』を行う

マテリアルの結果ノードを選択>詳細>マテリアル>Num Customized UVs>4

MS_VertexAnimationTools_MorphTargetsを追加し、以下のように接続
Number of Morph Targets(S)には、Blenderのタイムラインの合計フレーム数を入れる
今回はBlenderで作ったアニメーションが60フレームだったので、60を入れる
アニメーションが短かったり長かったり数値はデータにより変更

さらにMorph Animation(S)に対し、TimeとMultiplyをつないだものを接続すると動きのスピード調整もできる

VAT設定は以上で、あとはカラーを入れたければベースカラーやエミッシブカラーを使い色を付ければ完成

作成したマテリアルをスケルタルメッシュに適用し、レベルに配置するとアニメーションがついた状態でオブジェクトが動く

キャッシュ問題が
VATでアニメーションをする際に
キャッシュ範囲を越えた動きをしてしまうと、影が取り残されたり描画が変に見えることがある

キャッシュ範囲を確認するにはライティングモード>仮想シャドウマップ>キャッシュされたページ

変更するとキャッシュ範囲がわかるようになる
今回は青の部分がキャッシュが更新されている範囲となっている
逆にそれ以外は影が取り残されるということ

キャッシュ範囲を変更するには、VATオブジェクトを選択し
詳細>レンダリング>Bounds Scale>任意の数値へ変更
これで更新範囲が広がり、影も正しく描画されるようになる


