【UE5.4.4】AnimToTexture の使い方まとめ【最新】

アイキャッチ画像のマネキンはスケルタルメッシュを使っていません。
アニメーションする「スタティック」メッシュです。

公式の City サンプルで使われている AnimToTexture は、VAT(Vertex Animation Texture) によってスタティックメッシュ化したキャラクターにアニメーションさせることができるプラグインです。

本稿では、このプラグインを使って、スケルタルメッシュをアニメーション付きスタティックメッシュに変換する手順と、VAT を使う上で必要になる補足情報について共有します。

動作環境
Unreal Engine 5.4.3 および 5.4.4
Windows 11 Home

もくじ

ネット上の情報

Baking out vertex animation in editor with AnimToTexture
現状は本稿の次にこちらの記事が最新です。

一年以上前の記事なので状況が変わっている部分があります。
現在は Material Attribute Layers を使う必要があります。

AnimToTextureHelpers は 5.4.3 および 5.4.4 で動作しません。
※おま環の可能性もあるので自分の環境で動作するか確認してみてください。

AnimToTexture の精度やデータサイズなどに関する情報。
最適化する時に自分で調べる手間を省けます。

AnimToTexture とは関係ないですが、こちらの記事の方法でも VAT を使うことができます。
揺らめく旗や建築物の破壊表現など、背景アニメーション向けの内容です。

プラグインのインストール

プラグインで AnimToTexture を選択し、UE エディタを再起動します。

AnimToTexture は β より前の Experimental(実験段階)という状態なので、以下のような問題が出る可能性があります。
学習目的ならともかく、開発で使うのはお勧めしません。

・山ほどバグがある。
・めっちゃ使いにくい。
・バグ直すのも改造するのも大変。
・将来使えなくなるかも知れない。

必要なデータ
  1. スケルタルメッシュ
  2. 1. のスタティックメッシュ
  3. 1. 用のアニメーション(シーケンス)
  4. アニメーションデータをベイクする空のテクスチャ
  5. 専用のマテリアルとマテリアルインスタンス
  6. AnimToTexture 用データアセット

コンバート時に上記のデータのほとんどが書き換えられるので、複製したものを AnimToTexture で使った方が良いです。
そうしないと、コンバート前のデータに戻せなくなります。

スケルタルメッシュをスタティックメッシュに変換する

AnimToTexture にはスケルタルメッシュと、そのスケルタルメッシュと同じ形状のスタティックメッシュが必要です。

※タップかクリックすると大きい画像で表示します。

ひとつのスケルタルメッシュで構成されるキャラクターなら「スケルタルメッシュを作成」ボタンで変換できます。
※デフォルトのポーズのまま変換します。

ひとつのスケルタルメッシュでキャラを構成している場合は、そのままスタティックメッシュに変換すれば良いですが、頭と体を別のスケルタルメッシュで作っているような、いわゆる「モジュラーキャラクター」の場合、やや面倒です。

モジュラーキャラクターの場合の手順は以下になります。

  1. パーツ毎にスタティックメッシュに変換する
  2. アクターツールでひとつのスタティックメッシュに合成する

複数の「スタティック」メッシュを合成する方法

任意のレベルに合成したいスタティックメッシュを配置します。
配置通りに合成されるので、位置合わせを厳密に行う必要があります。
※タップかクリックすると大きい画像で表示します。

ツール > アクタをマージを選択。

マージするスタティックメッシュにチェックを入れて右下の「アクタをマージ」ボタンを押します。
※タップかクリックすると大きい画像で表示します。

合成したスタティックメッシュの出力先を選んで「保存」ボタンを押します。
※タップかクリックすると大きい画像で表示します。

出力されました。
※タップかクリックすると大きい画像で表示します。

ちゃんとくっついてますね。
※タップかクリックすると大きい画像で表示します。

複数の「スケルタル」メッシュを合成する方法

問題はパーツで分かれているスケルタルメッシュを合成する方法です。

  1. Skeletal Merging プラグインを使う。
  2. 有料プラグインを購入して使う。
  3. DCC ツールでくっつける。

Skeletal Merging プラグインを使う。

Skeletal Merging プラグインというものがあるのですが、これ「非常に」使いにくいです。
C++ を使って色々といじくりまわす必要があるので、スケルトンとスケルタルメッシュの構造やパッケージ保存の方法を理解するのに役立ちますが、作るのに時間がかかります。
手っ取り早く進めたいならお勧めしません。

有料プラグインを購入して使う。

Skeletal Mesh Merger

使ったことがないので詳細は不明です。
Skeletal Merging でうまく行かない場合は検討しても良いと思います。

DCC ツールでくっつける。

Blender などの DCC ツールでくっつけます。
DCC ツールを使えるなら、これが一番手っ取り早いと思います。
ただ、DCC ツールで編集するには、インポート前の fbx ファイルなどが必要なので、それらがある場合に限ります。

空のテクスチャを用意する

アニメーションのデータをベイクする(書き込む)ための空のテクスチャを用意します。

こちらの記事に書かれている通り、UE エディタで新規作成から作ることができるレンダーターゲット用テクスチャは使えません。
そのため、『ペイント』で新規作成して、何も編集しないで保存した PNG でも良いので、外部ツールで作成します。

※タップかクリックすると大きい画像で表示します。

テクスチャを用意できたら、UE エディタのコンテンツブラウザにドラッグ&ドロップしてインポートします。
テクスチャは全部で以下の5つが必要なので、残りの4つは複製します。

  1. ボーンテクスチャ用ポジション
  2. ボーンテクスチャ用ローテーション
  3. ボーンテクスチャ用ウェイト
  4. バーテックステクスチャ用ノーマル
  5. バーテックステクスチャ用ポジション

マテリアル関数を追加する

スケルタルメッシュが使っているマテリアルに VAT のための処理を追加します。
マテリアルで VAT を読み込み、VAT にベイクしたデータを使って、アニメーションを行う仕組みです。

マテリアルはボーンアニメーション用と、バーテックスアニメーション用の二種類が必要です。
追加するマテリアル関数はどっちも同じですが、設定するパラメータが違います。

UE4 マネキンのマテリアルに処理を追加したもの。

※タップかクリックすると大きい画像で表示します。

UE5 マネキンのマテリアルに処理を追加したもの。

※タップかクリックすると大きい画像で表示します。

最低限必要なマテリアル関数

Material Attribute Layers
GetMaterialAttributes
BlendAngleCorrectedNormals

最低限、追加する関数は上記の3種類ですが、UE4 マネキンのマテリアルのように GetMaterialAttributes や SetMaterialAttributes が追加で必要になります。

Material Attribute Layers のパラメータを変更する

Material Attribute Layers を選択して「詳細」のレイヤーアセットに以下のマテリアル関数を指定します。

  • ボーンアニメーション用 ⇒ ML_BoneAnimation
  • バーテックスアニメーション用 ⇒ ML_VertexAnimation

※タップかクリックすると大きい画像で表示します。

マテリアルの編集が終わったら、そのマテリアルからマテリアルインスタンスを作成します。
AnimToTexture のデータアセット(後述)に指定する「スタティック」メッシュにはマテリアルインスタンスを指定する必要があります。

マテリアルインスタンスのパラメータについて

変更する必要があるのはマテリアルだけです。
マテリアルインスタンスのパラメータをいじる必要はありません。
コンバータが勝手に設定してくれます。

「レイヤーパラメータ」 > STATIC SWITCH PARAMETER VALUES > AutoPlay
「レイヤーパラメータ」 > STATIC SWITCH PARAMETER VALUES > UseDynamicParameters

これらの設定の組み合わせによって、ML_BoneAnimation や ML_VertexAnation で使用する Custom Data パラメータが変わります。
そういったケースではパラメータを変更しますが、とりあえずコンバートしたいなら変更は不要です。

AnimToTexture のデータアセットを作成する

新規作成 > その他 > データアセット を選択。
クラスは「アニメーションからテクスチャデータアセット」を選択。
※英語環境なら Anim To Texture Data Asset

データアセットはボーンアニメーション用とバーテックスアニメーション用の2つが必要なので、もうひとつは複製します。

作成したデータアセットを開いて、以下のように設定します。

ボーンアニメーション用

※タップかクリックすると大きい画像で表示します。

バーテックスアニメーション用

スタティックメッシュです

データが揃ったらコンバートする

データの確認

マテリアルとマテリアルインスタンスの数はスケルタルメッシュによって変わりますが、UE5 Quinn Simple を使う場合、コンバートするのに必要なアセットは以下になります。

コンバータの表示設定

コンバートは AnimToTexture コンテンツの中にある Editor Utility Blueprint(EUB) で行います。
初期設定だと表示されないので、コンテンツブラウザの右上端にある「設定」から、以下の項目にチェックを入れます。

エンジンのコンテンツを表示
プラグインコンテンツを表示

※タップかクリックすると大きい画像で表示します。

設定が終わったら、以下のパスにアクセスします。

All > エンジン > Plugins > AnimToTexture コンテンツ > Characters > Mannequin > BP_AnimToTexture

※タップかクリックすると大きい画像で表示します。

このブループリントも複製して、複製したものを使います(※プラグインのサンプルデータに影響しないようにするためです)。

コンバータの設定

複製した EUB を開いて、以下の項目を変更します。

※タップかクリックすると大きい画像で表示します。

コンパイルして保存します。

コンバータの実行

EUB を右クリックして、「エディタユーティリティブループリントを実行」を選択します。

データに問題がなければ、以下のメッセージダイアログがバーテックスアニメーションとボーンアニメーションの2回分表示されます。

コンバートできたかの簡易チェックと失敗例

コンバートに成功すれば、EUB とマテリアルとスケルタルメッシュを除き、それ以外のアセットに更新マーク(★)がつきます。
以下の画像では、バーテックスアニメーション用のテクスチャにマークがついていませんね。

うまくいかない場合は出力ログを確認します。

※タップかクリックすると大きい画像で表示します。

バーテックスアニメーション用のテクスチャサイズは 2048 x 2048 ではダメなようです。

DA_Vertex のテクスチャサイズを 4096 x 4096 に修正。

再度コンバート。

更新マークが付きました。
うまくいったようです。

コンバートしたスタティックメッシュの確認

コンバートしたスタティックメッシュを確認します。

なんか LOD 1 の表示がバグっていますが、失敗しているわけではありません。
UE5 Quinn Simple は3つの LOD を持っているので、順番に確認してみます。

LOD 0 は問題ありませんが、LOD 2 は表示がバグっています。
これは AnimToTexture の仕組み上、正しい結果です。

細かいことは割愛しますが、データアセットに指定できる LOD インデックスの設定は以下のように影響します。

「スケルタル」メッシュの LOD インデックス

テクスチャにベイクするデータ量に影響
※LOD 0 が最もデータ量が多く、数字が大きくなるほどデータ量が減る
※データ量が多いほど滑らかにアニメーションするが、キャッシュするデータ量が増えるためメモリの消費量が増える

「スタティック」メッシュの LOD インデックス

スタティックメッシュに出力する LOD に影響
※LOD インデックスに 0 を指定した場合は、LOD 0 にのみ出力する
※AnimToTexture で出力できる LOD はひとつのアセットに対してひとつだけなので、複数の LOD を持ちたい場合は LOD の数だけスタティックメッシュが必要

コンバートしたスタティックメッシュの LOD 設定を変更する

↑で説明した通り、AnimToTexture は複数の LOD に対してコンバートできません。
そのまま使うと、カメラとの距離が変わったときに表示がバグるので、正しく表示できる LOD のみを使うよう設定を変更する必要があります。

コンバート先の「スタティック」メッシュの LOD インデックスは、一番表示が粗い LOD 2 を使う設定にしてみます。
※この設定だと、コンバート先を表示したとき、近距離(LOD 0)、中距離(LOD 1) で表示がバグることになります。

コンバート先の「スタティック」メッシュを複製します。

複製したスタティックメッシュの編集画面を開き、「詳細」 > LOD 設定 > 最小LOD を 2 に変更します(LOD 2 だけ正しく表示できるので)。

保存したらレベルに配置して確認します。

LOD 2 だけ表示されるようになりました。

LOD 0, LOD 1, LOD 2 を持っているデータで、LOD 1 だけ表示したい場合は、LOD 2 を削除した後、最小 LOD を 1 に変更します。

LOD 2 を削除する設定は以下。

アニメーションを切り替える方法

AnimToTexture には複数のアニメーションシーケンスを登録でき、任意のタイミングで切り替えることができます。
モーションのブレンドはできないので、パッと切り替わることになります。

アニメーションの処理をしてくれるマテリアル関数(BL_BoneAnimation と BL_VertexAnimation)が、開始フレームと終了フレームのパラメータを持っています。

アニメーションの開始フレームと終了フレームを確認する

AnimToTexture のコンバートに使用したデータアセットで、アニメーションの開始フレームと終了フレームを確認できます。
データアセットの一番下にあります。
この値をマテリアルに渡すことで、開始フレーム~終了フレームのアニメーションを行ってくれるようになります。

マテリアルに開始フレームと終了フレームを設定する

VAT を使うのは最適化が必要な状況だと思いますので、ドローコール削減に向いているインスタンス化スタティックメッシュ(Instanced Static Mesh) での設定方法を説明します。
これはブループリントでできます。

  1. ブループリントを新規作成(親はアクター)
  2. インスタンス化スタティックメッシュコンポーネントを追加
  3. 2. の「詳細」でコンバートしたスタティックメッシュを設定
  4. 2. の「詳細」> インスタンス > Instances にエレメントを追加
    ※お好みで、インスタンスの配置位置と向きを Transform に設定します。
  5. 2. の「詳細」> インスタンス > 詳細設定 > Num Custom Data Floats に 4 を設定
    ※Custom Data のインデックス 3 を使う場合、インデックス 0 ~ 3 (合計4つ) を設定する必要があります。
  6. 後述の画像のようにブループリントのノードを追加
  7. コンパイルしたらレベルに配置

※タップかクリックすると大きい画像で表示します。

ブループリントの説明

StartFrame と EndFrame をセットすれば、勝手にループアニメーションしてくれると思ったのですが、StartFrame で止まってしまうので、Tick を使って自前でループさせています。
また、Custom Data [0] に TimeOffset を指定できるので、これを使ってループできないか試してみましたが、これもダメでした。

※タップかクリックすると大きい画像で表示します。

レベルに配置してシミュレーション

StartFrame と EndFrame を使えるのは、AutoPlay が ON かつ、UseDynamicParameters が OFF の場合です。
これらの設定値が異なる場合、Custom Data を使って StartFrame と EndFrame をセットすることができなくなるので、ご注意ください。
StartFrame と EndFrame を使わない方法は、本稿では割愛します。

VAT で使えるのはアニメーションシーケンスだけ

アニメーションを切り替える前と後で、滑らかにブレンドする機能はありません。
また、VAT は「スタティック」メッシュで使うものなので、「スケルタル」メッシュで使えるブレンドスペースもカーブもアニメーションモンタージュもアニメーションブループリントもコントロールリグも使えません。
使いたい場合は自分で作る必要があります。

マテリアルをランダムに切り替える方法

Baking out vertex animation in editor with AnimToTexture にマテリアルの一部の切り抜きと GIF アニメが掲載されていますが(あれだけ見てもなんのことやら分からないです)、インスタンス毎にランダムに服のテクスチャを変えたり、色を変えたいケースがあります。

これは AnimToTexture とは関係なく、純粋にマテリアルの作り方に関することなので、マテリアルの作り方によって対応の仕方が変わると思います。
UE5 Quinn Simple では、以下のようにしました。

※タップかクリックすると大きい画像で表示します。

変更しているのは、本稿のために作成した M_Bone と M_Vertex マテリアルです。
これらは、Quinn Simple で使用している MI_Quinn_01 と MI_Quinn02 が参照しているマテリアル M_Mannequin を複製したものです。

テクスチャの UV から PerInstanceRandom を使ってランダムに色を読み取り、それをベースカラーに出力することで、インスタンス毎にバラバラな色が設定されるようになりました。

テクスチャはエンジンコンテンツの中にあるものを流用しています。
/All/EngineData/Engine/Functions/Engine_MaterialFunctions02/ExampleContent/Textures/testPattern2

エンジンコンテンツはデフォルト設定では見えないようになっています。
※設定方法は本稿の「コンバータの表示設定」をご確認ください。

AnimToTexture でできないこと

ボーンのトランスフォームを得る

AnimToTexture で変換したスタティックメッシュのボーンの位置と角度を取得したいケースがあります。
ソケットのように特定のボーンに別のスタティックメッシュを装着するためです。
手にカバンを持たせたり、頭に帽子をかぶせたりしたい場合にソケットが使えると便利です。

スタティックメッシュなのでソケットは使えますが、アニメーションに合わせて連動しません。
連動させるには、ソケットの位置のボーンにアクセスして、そのボーンの位置と角度を知る必要があります。

ボーンの位置と角度はテクスチャにベイクされているので、テクスチャのビットマップにアクセスすれば取得できます。
ただ、そのための機能が AnimToTexture にはありません。

AnimToTexture は、マテリアル関数でアニメーションしているように見せているだけで、実際はただのスタティックメッシュです。
スタティックメッシュとマテリアルインスタンスの機能にないものは自分で作るしかありません。

C++ が必要になる上に、ボーンのトランスフォームは色々と加工された値がテクスチャに書き込まれています。
本稿に掲載するとかなり長くなってしまうので、別の記事に書こうと思います。

複数の LOD を持つ

最適化において LOD の設定は超重要ですが、AnimToTexture でコンバートできるのは、ひとつの LOD だけです。
ひとつの「スタティック」メッシュで複数の LOD を切り替えることができないので、必要な LOD の数だけ、コンバータの設定を変更してコンバートする必要があります。
要するに、LOD を3つ持ちたい場合は、3つのスタティックメッシュが必要になります。

そうすると、UE 側で表示切替をやってくれないので、カメラ位置とスタティックメッシュとの距離、カメラの向きによって、最適なスタティックメッシュを表示するよう自前で行う必要があります。
自前で行うときに問題になるのは、VAT を使っているスタティックメッシュはアニメーションしているので、アニメーションの再生位置を引き継ぐ処理も自前で行う必要があることです。

VAT が必要になるようなキャラクターは、背景と同じ扱いのモブである場合が多いかも知れません。
それなら、LOD 2 でコンバートして、LOD 2 のスタティックメッシュだけ表示すれば、切り替え処理を自前で行う必要はありません。
ただ、目の前まで近づくとメッシュやテクスチャが粗いので、それを許容できる限りにおいてです。
あるいは、目の前まで近寄れないモブだけ、常に LOD 2 で表示する…などの使い方が考えられます。

ハードウェアもソフトウェアの性能も日々進化を続けているのに、未だにこういった泥臭い最適化が必要になるのは困ったものです…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です