この記事では、VAT を UV で代替する手法を紹介します。
テクスチャなしで動作するため、メモリ節約に繋がります。
※ 詳細な処理負荷は計測できていません。
対象読者
・エフェクトデザイナー
・テクニカルアーティスト
・Bifrost に興味があるデザイナー
環境
・Maya 2024
・Bifrost 2.14.0.0
・Unreal Engine 5.3
⇓ 実際にこの手法で動作している動画
目次
前提
現状、Bifrost もとい Maya では VAT を書き出すことはできません。
この記事ではその代替手段を紹介しますが、VAT のすべてを補えるわけではない事をご留意いただけますと幸いです。
①シミュレーションをキャッシュ化

『file_chahe』ノードを使用することで、シミュレーションのキャッシュや読み取りを行えます。
■備考
ヘルプページには『実験的なノード』と記載がありますが、私が使用した限りだと正常に動作しております。
Autodesk 公式サイト – Bifrost Help | file_cache
使用方法
以下のような構造でシミュレーションを開始することで、キャッシュファイルが作成されます。
[シミュレーション処理 ⇨『file_chahe』⇨『output』or 『terminal』 ]
設定すべき箇所


「Mode」は “Write Mode”
このモードは、シミュレーションした結果を確実にキャッシュ化します。
他のモードでは古いキャッシュデータを上書きしません。
「Filename」は管理しやすいフォルダに変更
デフォルトでも動作しますが、わかりやすい場所に変更することを推奨します。
※フォルダパスに日本語が含まれていると動作しない場合がある
また、ファイル名については “~~~####” という形式にしてください。
この部分にフレーム番号が入ります。
②頂点アニメーションを UV に格納

[全体像]
- キャッシュを取り出す
- すべてのフレームをもとに正規化する値を算出
- 頂点座標を UV に格納
青枠で囲んだ部分に関して、は UV に格納するフレーム数を表しています。
a = 「アニメーションの格納を始める “UV 番号”」 – 「UE における UV の最大数が “8”」
b = a ✕ 「UV 1つに対する軸の数 “2 (x, y)”」
c = UV に格納するフレーム数
③キャッシュを取り出す

[get_objects の中身]
- 文字列を組み合わせてファイルパスを作成
- 『file_cache』でキャッシュを取り出す
UV に格納するフレームすべてをこのノードで呼び出し、配列にします。
また、『file_cache』は “Read mode” で使用してください。

4桁の番号を生成

[make_number の中身]
前半でフレーム番号を算出、後半でその番号を4桁にしています。
“speed” の値を大きくすることで、コマ飛びの大きいアニメーションになります。

[iterateの中身]
4桁未満の数字の場合は、手前に “0” を追加します。
④すべてのフレームをもとに正規化する値を算出

[normalize_amount の中身]
- すべてのフレームをマージ
- バウンズボックスを計算
- 中心位置を算出
- (x, y, z) のなかで最も範囲の広い軸を算出
3, 4 をもとにメッシュの頂点を 0~1 の範囲に収めます。
4 については長方形の一番長い辺で正方形を作るイメージです。
⑤頂点座標を UV に格納

[iterate の中身]
- アニメーションが要素の配列からメッシュを取り出す
- 取り出したメッシュの頂点座標を ④ を元に正規化
- 正規化された頂点座標を UV に格納

[bake_vertex_position_to_UV の中身]
- 頂点座標 float3 を float に変換
- 既存の UV + 1. で UV 座標を作成
- “container_mesh” の UV に格納
“container_mesh” とは UV 座標を保存するためのメッシュです。
今回はアニメーションの1フレーム目のメッシュを使用しています。
float3 を float に変換

[float3_to_float の中身]
- 頂点座標を 8bit に変換
- XYZ を「上位・中位・下位」で 24bit 作る。
- 24bit の最大値 “16,777,215” で割り、”0~1″ に正規化する。
UE の UV は “0=1” の範囲だけを認識するため、3. の処理をしています。
ビットに関して
ビット数 | 数値範囲 | 最大桁数 |
---|---|---|
8bit | 0 ~ 255 | 3桁 |
16bit | 0 ~ 65,535 | 5桁 |
24bit | 0 ~ 16,777,215 | 8桁 |

[convert_to_8bit の中身]
- XYZ を float の 2次元配列にする
- float を 8bit に変換
- 2次元配列から、XYZ を取り出す
XYZ で同じ処理をするため、2次元配列にして『for_each』で一度に処理しています。

[for_each の中身]
“0 ~ 1” の float を “0 ~ 255” の整数 (8bit) に変換しています。
8bit にすると精度は落ちますが、よほど細かな動きをしない限り気にならない程度です。
UV 座標を作成

[make_UV の中身]
ループ回数が….
・偶数のとき、X座標に “encoded_position” を入力
・奇数のとき、X座標に先ほど入力した UV の U、Y座標に “encoded_position” を入力
⑥ゲームエンジンで動かす
内容としては『メッシュの UV をシェーダーで読み込む ⇨ World Position Offcet に繋ぐ』というものです。
細かい解説は省き、全体像だけお伝えします(長くなりすぎるため)。

そのまえに…. 必須:メッシュの設定

メッシュを UE にインポートしたら、すぐに以下を行ってください。
- Content Browser からメッシュを開く
- [Detail > Use Full Precision UVs]を “True”
- 少し下の “Applay Changes” をクリック
この設定をしないと UV が圧縮されてしまい、正しくデコードできません。
また、同じ名前のメッシュを再度 UE のインポートしてもこの設定は維持されます。
頂点座標を取り出す

- UV に格納した頂点座標を取り出す(float ⇨ float3)
- “alpha” の値に応じて、UV1.x ⇨ UV1.y ⇨ UV2.x ⇨ UV2.y ⇨UV3.x … というように進行
- 必要に応じて 2. を Lerp 処理
カスタムノードの処理としては、上記を行っています。
また、カスタムノードには bool型 を接続できません。
そのため、『enable_lerp』に関しては『Swich』で “0 or 1” を切り替えて入力しています。
後処理

Z_up に変換
Maya と UE は座標系が異なるためその部分を合わせています。
カスタムノード内でこの部分を対応しても問題ないですが、わかりやすさ重視で現状はこのようにしています。
中心に戻す
UV が0 ~ 1 の範囲なので、0.5 引くことでメッシュの中心がピボットになります。
TransformPosition
ローカル座標からワールド座標に変換しています。
これにより、オブジェクトの回転や拡縮を反映できます。
元の頂点座標を打ち消す
UV から取得した頂点アニメーションだけを描画するために、メッシュのデフォルト頂点座標はすべて(0, 0, 0)として扱います。
まとめ
メリット | ・VAT 書き出しに対応していない DCC ツールでもデータを作成できる。 ・メモリの節約になる。 |
デメリット | ・格納できるデータ量に制限がある。 ┗ Unreal Engine の場合:UV は最大8個 = フレーム数は 最大 16 |
この記事では以下動画のような「頂点アニメーションを UV に格納し、ゲームエンジンで再生する方法」を紹介しました。
手を加えなければいけない部分は多々ありますが、『こういう手法もあります!』ということがお伝えできていましたら幸いです。