アイキャッチ画像のマネキンはスケルタルメッシュを使っていません。
アニメーションする「スタティック」メッシュです。
公式の City サンプルで使われている AnimToTexture は、VAT(Vertex Animation Texture) によってスタティックメッシュ化したキャラクターにアニメーションさせることができるプラグインです。
本稿では、このプラグインを使って、スケルタルメッシュをアニメーション付きスタティックメッシュに変換する手順と、VAT を使う上で必要になる補足情報について共有します。
動作環境
Unreal Engine 5.4.3 および 5.4.4
Windows 11 Home
- ネット上の情報
- プラグインのインストール
- 必要なデータ
- スケルタルメッシュをスタティックメッシュに変換する
- 複数の「スタティック」メッシュを合成する方法
- 複数の「スケルタル」メッシュを合成する方法
- 空のテクスチャを用意する
- マテリアル関数を追加する
- AnimToTexture のデータアセットを作成する
- データが揃ったらコンバートする
- アニメーションを切り替える方法
- マテリアルをランダムに切り替える方法
- AnimToTexture でできないこと
Baking out vertex animation in editor with AnimToTexture
現状は本稿の次にこちらの記事が最新です。
現在は Material Attribute Layers を使う必要があります。 AnimToTextureHelpers は 5.4.3 および 5.4.4 で動作しません。
※おま環の可能性もあるので自分の環境で動作するか確認してみてください。 AnimToTexture の精度やデータサイズなどに関する情報。
最適化する時に自分で調べる手間を省けます。 AnimToTexture とは関係ないですが、こちらの記事の方法でも VAT を使うことができます。
揺らめく旗や建築物の破壊表現など、背景アニメーション向けの内容です。
プラグインで AnimToTexture を選択し、UE エディタを再起動します。
学習目的ならともかく、開発で使うのはお勧めしません。
・山ほどバグがある。
・めっちゃ使いにくい。
・バグ直すのも改造するのも大変。
・将来使えなくなるかも知れない。
- スケルタルメッシュ
- 1. のスタティックメッシュ
- 1. 用のアニメーション(シーケンス)
- アニメーションデータをベイクする空のテクスチャ
- 専用のマテリアルとマテリアルインスタンス
- AnimToTexture 用データアセット
コンバート時に上記のデータのほとんどが書き換えられるので、複製したものを AnimToTexture で使った方が良いです。
そうしないと、コンバート前のデータに戻せなくなります。
AnimToTexture にはスケルタルメッシュと、そのスケルタルメッシュと同じ形状のスタティックメッシュが必要です。
※タップかクリックすると大きい画像で表示します。
ひとつのスケルタルメッシュで構成されるキャラクターなら「スケルタルメッシュを作成」ボタンで変換できます。 ひとつのスケルタルメッシュでキャラを構成している場合は、そのままスタティックメッシュに変換すれば良いですが、頭と体を別のスケルタルメッシュで作っているような、いわゆる「モジュラーキャラクター」の場合、やや面倒です。 モジュラーキャラクターの場合の手順は以下になります。 任意のレベルに合成したいスタティックメッシュを配置します。 ツール > アクタをマージを選択。 マージするスタティックメッシュにチェックを入れて右下の「アクタをマージ」ボタンを押します。 合成したスタティックメッシュの出力先を選んで「保存」ボタンを押します。 出力されました。 ちゃんとくっついてますね。 問題はパーツで分かれているスケルタルメッシュを合成する方法です。 Skeletal Merging プラグインというものがあるのですが、これ「非常に」使いにくいです。 使ったことがないので詳細は不明です。 Blender などの DCC ツールでくっつけます。 アニメーションのデータをベイクする(書き込む)ための空のテクスチャを用意します。 こちらの記事に書かれている通り、UE エディタで新規作成から作ることができるレンダーターゲット用テクスチャは使えません。 ※タップかクリックすると大きい画像で表示します。
テクスチャを用意できたら、UE エディタのコンテンツブラウザにドラッグ&ドロップしてインポートします。 スケルタルメッシュが使っているマテリアルに VAT のための処理を追加します。 マテリアルはボーンアニメーション用と、バーテックスアニメーション用の二種類が必要です。 ※タップかクリックすると大きい画像で表示します。
※タップかクリックすると大きい画像で表示します。
Material Attribute Layers 最低限、追加する関数は上記の3種類ですが、UE4 マネキンのマテリアルのように GetMaterialAttributes や SetMaterialAttributes が追加で必要になります。 Material Attribute Layers を選択して「詳細」のレイヤーアセットに以下のマテリアル関数を指定します。 ※タップかクリックすると大きい画像で表示します。
マテリアルの編集が終わったら、そのマテリアルからマテリアルインスタンスを作成します。 変更する必要があるのはマテリアルだけです。 これらの設定の組み合わせによって、ML_BoneAnimation や ML_VertexAnation で使用する Custom Data パラメータが変わります。 新規作成 > その他 > データアセット を選択。 データアセットはボーンアニメーション用とバーテックスアニメーション用の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 の表示がバグっていますが、失敗しているわけではありません。 LOD 0 は問題ありませんが、LOD 2 は表示がバグっています。 細かいことは割愛しますが、データアセットに指定できる LOD インデックスの設定は以下のように影響します。 テクスチャにベイクするデータ量に影響 スタティックメッシュに出力する LOD に影響 ↑で説明した通り、AnimToTexture は複数の LOD に対してコンバートできません。 コンバート先の「スタティック」メッシュの LOD インデックスは、一番表示が粗い LOD 2 を使う設定にしてみます。 コンバート先の「スタティック」メッシュを複製します。 複製したスタティックメッシュの編集画面を開き、「詳細」 > LOD 設定 > 最小LOD を 2 に変更します(LOD 2 だけ正しく表示できるので)。 保存したらレベルに配置して確認します。 LOD 2 だけ表示されるようになりました。 LOD 2 を削除する設定は以下。 AnimToTexture には複数のアニメーションシーケンスを登録でき、任意のタイミングで切り替えることができます。 アニメーションの処理をしてくれるマテリアル関数(BL_BoneAnimation と BL_VertexAnimation)が、開始フレームと終了フレームのパラメータを持っています。 AnimToTexture のコンバートに使用したデータアセットで、アニメーションの開始フレームと終了フレームを確認できます。 VAT を使うのは最適化が必要な状況だと思いますので、ドローコール削減に向いているインスタンス化スタティックメッシュ(Instanced Static Mesh) での設定方法を説明します。 ※タップかクリックすると大きい画像で表示します。
StartFrame と EndFrame をセットすれば、勝手にループアニメーションしてくれると思ったのですが、StartFrame で止まってしまうので、Tick を使って自前でループさせています。 レベルに配置してシミュレーション アニメーションを切り替える前と後で、滑らかにブレンドする機能はありません。 Baking out vertex animation in editor with AnimToTexture にマテリアルの一部の切り抜きと GIF アニメが掲載されていますが(あれだけ見てもなんのことやら分からないです)、インスタンス毎にランダムに服のテクスチャを変えたり、色を変えたいケースがあります。 これは AnimToTexture とは関係なく、純粋にマテリアルの作り方に関することなので、マテリアルの作り方によって対応の仕方が変わると思います。 ※タップかクリックすると大きい画像で表示します。
テクスチャの UV から PerInstanceRandom を使ってランダムに色を読み取り、それをベースカラーに出力することで、インスタンス毎にバラバラな色が設定されるようになりました。 テクスチャはエンジンコンテンツの中にあるものを流用しています。 AnimToTexture で変換したスタティックメッシュのボーンの位置と角度を取得したいケースがあります。 スタティックメッシュなのでソケットは使えますが、アニメーションに合わせて連動しません。 ボーンの位置と角度はテクスチャにベイクされているので、テクスチャのビットマップにアクセスすれば取得できます。 AnimToTexture は、マテリアル関数でアニメーションしているように見せているだけで、実際はただのスタティックメッシュです。 C++ が必要になる上に、ボーンのトランスフォームは色々と加工された値がテクスチャに書き込まれています。 最適化において LOD の設定は超重要ですが、AnimToTexture でコンバートできるのは、ひとつの LOD だけです。 そうすると、UE 側で表示切替をやってくれないので、カメラ位置とスタティックメッシュとの距離、カメラの向きによって、最適なスタティックメッシュを表示するよう自前で行う必要があります。 VAT が必要になるようなキャラクターは、背景と同じ扱いのモブである場合が多いかも知れません。
※デフォルトのポーズのまま変換します。
配置通りに合成されるので、位置合わせを厳密に行う必要があります。
※タップかクリックすると大きい画像で表示します。
※タップかクリックすると大きい画像で表示します。
※タップかクリックすると大きい画像で表示します。
※タップかクリックすると大きい画像で表示します。
※タップかクリックすると大きい画像で表示します。
C++ を使って色々といじくりまわす必要があるので、スケルトンとスケルタルメッシュの構造やパッケージ保存の方法を理解するのに役立ちますが、作るのに時間がかかります。
手っ取り早く進めたいならお勧めしません。
Skeletal Merging でうまく行かない場合は検討しても良いと思います。
DCC ツールを使えるなら、これが一番手っ取り早いと思います。
ただ、DCC ツールで編集するには、インポート前の fbx ファイルなどが必要なので、それらがある場合に限ります。
そのため、『ペイント』で新規作成して、何も編集しないで保存した PNG でも良いので、外部ツールで作成します。
テクスチャは全部で以下の5つが必要なので、残りの4つは複製します。
マテリアルで VAT を読み込み、VAT にベイクしたデータを使って、アニメーションを行う仕組みです。
追加するマテリアル関数はどっちも同じですが、設定するパラメータが違います。
GetMaterialAttributes
BlendAngleCorrectedNormals
AnimToTexture のデータアセット(後述)に指定する「スタティック」メッシュにはマテリアルインスタンスを指定する必要があります。
マテリアルインスタンスのパラメータをいじる必要はありません。
コンバータが勝手に設定してくれます。
「レイヤーパラメータ」 > STATIC SWITCH PARAMETER VALUES > UseDynamicParameters
そういったケースではパラメータを変更しますが、とりあえずコンバートしたいなら変更は不要です。
クラスは「アニメーションからテクスチャデータアセット」を選択。
※英語環境なら Anim To Texture Data Asset
初期設定だと表示されないので、コンテンツブラウザの右上端にある「設定」から、以下の項目にチェックを入れます。
プラグインコンテンツを表示
以下の画像では、バーテックスアニメーション用のテクスチャにマークがついていませんね。
うまくいったようです。
UE5 Quinn Simple は3つの LOD を持っているので、順番に確認してみます。
これは AnimToTexture の仕組み上、正しい結果です。
※LOD 0 が最もデータ量が多く、数字が大きくなるほどデータ量が減る
※データ量が多いほど滑らかにアニメーションするが、キャッシュするデータ量が増えるためメモリの消費量が増える
※LOD インデックスに 0 を指定した場合は、LOD 0 にのみ出力する
※AnimToTexture で出力できる LOD はひとつのアセットに対してひとつだけなので、複数の LOD を持ちたい場合は LOD の数だけスタティックメッシュが必要
そのまま使うと、カメラとの距離が変わったときに表示がバグるので、正しく表示できる LOD のみを使うよう設定を変更する必要があります。
※この設定だと、コンバート先を表示したとき、近距離(LOD 0)、中距離(LOD 1) で表示がバグることになります。
モーションのブレンドはできないので、パッと切り替わることになります。
データアセットの一番下にあります。
この値をマテリアルに渡すことで、開始フレーム~終了フレームのアニメーションを行ってくれるようになります。
これはブループリントでできます。
※お好みで、インスタンスの配置位置と向きを Transform に設定します。
※Custom Data のインデックス 3 を使う場合、インデックス 0 ~ 3 (合計4つ) を設定する必要があります。
また、Custom Data [0] に TimeOffset を指定できるので、これを使ってループできないか試してみましたが、これもダメでした。
これらの設定値が異なる場合、Custom Data を使って StartFrame と EndFrame をセットすることができなくなるので、ご注意ください。
StartFrame と EndFrame を使わない方法は、本稿では割愛します。
また、VAT は「スタティック」メッシュで使うものなので、「スケルタル」メッシュで使えるブレンドスペースもカーブもアニメーションモンタージュもアニメーションブループリントもコントロールリグも使えません。
使いたい場合は自分で作る必要があります。
UE5 Quinn Simple では、以下のようにしました。
これらは、Quinn Simple で使用している MI_Quinn_01 と MI_Quinn02 が参照しているマテリアル M_Mannequin を複製したものです。
/All/EngineData/Engine/Functions/Engine_MaterialFunctions02/ExampleContent/Textures/testPattern2
※設定方法は本稿の「コンバータの表示設定」をご確認ください。
ソケットのように特定のボーンに別のスタティックメッシュを装着するためです。
手にカバンを持たせたり、頭に帽子をかぶせたりしたい場合にソケットが使えると便利です。
連動させるには、ソケットの位置のボーンにアクセスして、そのボーンの位置と角度を知る必要があります。
ただ、そのための機能が AnimToTexture にはありません。
スタティックメッシュとマテリアルインスタンスの機能にないものは自分で作るしかありません。
本稿に掲載するとかなり長くなってしまうので、別の記事に書こうと思います。
ひとつの「スタティック」メッシュで複数の LOD を切り替えることができないので、必要な LOD の数だけ、コンバータの設定を変更してコンバートする必要があります。
要するに、LOD を3つ持ちたい場合は、3つのスタティックメッシュが必要になります。
自前で行うときに問題になるのは、VAT を使っているスタティックメッシュはアニメーションしているので、アニメーションの再生位置を引き継ぐ処理も自前で行う必要があることです。
それなら、LOD 2 でコンバートして、LOD 2 のスタティックメッシュだけ表示すれば、切り替え処理を自前で行う必要はありません。
ただ、目の前まで近づくとメッシュやテクスチャが粗いので、それを許容できる限りにおいてです。
あるいは、目の前まで近寄れないモブだけ、常に LOD 2 で表示する…などの使い方が考えられます。