LevelSequenceでABPとMirrorDataTableを併用する方法

この質問は、以下のスレッドに関連して作成されました: [Mirroring Animations in Sequencer does not work on ABP-assigned [Content removed]

<br/>

お世話になっております。

<br/>

上記スレッドと同様に、Level Sequence で ABP を使ったキャラクターについて、Mirror Data Table でのアニメーション反転を制御したいのですが、UE5.7ではサポートされていますか?

<br/>

以上、よろしくお願いいたします。

[Attachment Removed]

お問い合わせありがとうございます。

Level Sequence で ABP と Mirror Data Table を併用する方法についてですが、前掲の「Mirroring Animations in Sequencer does not work on ABP-assigned characters」スレッドの状況から特にエンジン側の実装には進展がなく、以下のいずれかの対応をご検討いただく形となります。

・ABP に Mirror ノードを組み込み、その制御変数を「Expose to Cinematics」で公開したうえで、 Sequencer の Anim Instance トラックから制御する

・Custom モードに切り替えて使用する

(ただし、この場合は当該セクションの再生中にABPの出力が置き換わるため、「ABPとMirror Data Tableを併用する」という要求にお応えできるものではありません)

ミラーリング処理については、 ABP に Mirror ノードを組み込み、そこに Mirror Data Tableを割り当てて使用する方法が基本的な使い方になります。

一方で、Level Sequence の Animation トラック上で Mirror Data Table を直接使用できるのは、内部的に一時的な AnimInstance(アニムグラフ)を作成し、その中に Mirrorノードを持たせて制御しているためです。この特性上、Animationトラック上のMirror Data Table指定は現在のところ Custom モードのみで動作し、大変恐縮ながら、任意の ABP と組み合わせることができておりません。

以上、よろしくお願いいたします。

[Attachment Removed]

ご回答ありがとうございます。

ABPを複数のキャラクターで共有しているのですが、Mirror Data Table はスケルトン毎に必要そうなので、Mirrorノードに設定する Mirror Data Table をキャラクター毎に切り替えたいです。

Mirror ノードの外からMirror Data Tableを設定することは可能でしょうか?

以上、よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

> Mirror ノードの外からMirror Data Tableを設定することは可能でしょうか?

残念ながら、純正のMirrorノードはMirror Data Tableプロパティの動的な変更が想定されていない実装となっておりますので、こちらを改造するか、動的変更可能な亜種クラスを追加作成する必要があります。

以下、差分説明のために純正Mirrorクラスに直接手をつけるシナリオで例示いたします。

Engine/Source/Runtime/AnimGraphRuntime/Public/AnimNodes/AnimNode_Mirror.h L128-L129、MirrorDataTableのUPROPERTY宣言にPinHiddenByDefaultを追加

-    UPROPERTY(EditAnywhere, Category = Settings, meta = (FoldProperty))
+    UPROPERTY(EditAnywhere, Category = Settings, meta = (PinHiddenByDefault, FoldProperty))
     TObjectPtr<UMirrorDataTable> MirrorDataTable = nullptr;

Engine/Source/Editor/AnimGraph/Private/AnimGraphNode_Mirror.cpp L70-L74、UAnimGraphNode_Mirror::ValidateAnimNodeDuringCompilation()のMirror Data Table未指定時のエラー処理を緩和。複数キャラ共通の汎用ABPが特定のMirror Data Tableを持たないのであれば、ABPのコンパイルを通すためにこの緩和が必要になります。

-    if (Node.GetMirrorDataTable() == nullptr)
-    {
-        MessageLog.Error(TEXT("@@ does not have a mirror data table selected.  Please select a table or delete the 
  node."), this);
-    }                                          
-    else if (ForSkeleton)                  
+    if (Node.GetMirrorDataTable() != nullptr && ForSkeleton)
     {
         const USkeleton* MirrorTableSkeleton = Node.GetMirrorDataTable()->Skeleton;
         ...
     }

これにより、Mirror Data Tableプロパティに変数をバインド可能、かつ、入力ピンとして公開可能なバージョンが利用できます。

なお、UEではUPROPERTYのメタデータを派生クラスから上書きする仕組みがないため、亜種クラスを追加する場合、純正クラスを継承してオーバーライド等で変更する、というアプローチがとれません。さらに上位の FAnimNode_MirrorBase から派生させ、 FANimNode_Mirror の実装をコピー&ペーストしてから部分的に書き換えていただくことになります。

一度ご確認いただけますと幸いです。

以上、よろしくお願いいたします。

[Attachment Removed]

ご回答ありがとうございます。

ご教示いただいた方法で期待した動作を確認できました。

また、Mirrorノードの処理負荷が気になっているのですが、多用は避けた方がよいでしょうか?

処理負荷が問題になったケース等ございましたらご教示いただけますと幸いです。

[Attachment Removed]

お世話になっております。

動作のご確認ありがとうございます。

> Mirrorノードの処理負荷が気になっているのですが、多用は避けた方がよいでしょうか?

> 処理負荷が問題になったケース等ございましたらご教示いただけますと幸いです。

結論から申し上げますと、通常の利用範囲では処理負荷を理由に Mirror ノードの使用を避けていただく必要はございません。本件確認のため、社内外の情報を確認してみましたが、Mirror ノードの処理負荷が問題となった事例は確認できませんでした。コスト感としては標準的なブレンドノード 1 個と同程度であり、IK 系ノード等と比べれば大幅に軽量です。

参考になれば幸いです。

以上、よろしくお願いいたします。

[Attachment Removed]

ご回答ありがとうございます。

承知致しました。

別の質問なのですが、ABPでMirrorノードを使うので、レベルシーケンスでアニメーションがブレンドされている場合、ブレンド後のアニメーションに対して反転が適用されることになると思うのですが、UEを改造すればブレンド前のアニメーションを反転させることもできるのでしょうか?

もし方法がございましたらご教示いただけないでしょうか。

よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

ご質問ありがとうございます。

もちろん、エンジンを改造すれば、ABPにおいてもブレンド前反転を実現可能です。

参考情報として、エンジン標準の Custom モードや Blend Space は、「個々のアニメーションを反転してからブレンドする」という、ブレンド前反転の設計になっています。今回の案件でお勧めした Custom モードでは、シーケンサーから渡される各アニメーションを個別の再生ノードで受け、それぞれに Mirror を適用してから合成する評価グラフを動的に構築しています(ABP の AnimGraph 末尾に置いた Mirror ノードが、ブレンド後のポーズに反転をかけてしまうのとは対照的といえます)。これらのコードが、ABPにブレンド前反転をサポートさせる際の参考になると思います。

一方、ABP の場合、シーケンサーは各アニメーションを個別に Slot ノードへ流し込み、合成は Slot ノードの内部で行われます。そこで、この Slot ノードを拡張したカスタム Slot ノードを作成し、

・Mirror Data Table と、Mirrorの有効/無効(Bool値)をノードのピンとして入力できるようにする

・Slot ノード内部の合成処理において、各アニメーションが合成される直前に、指定された Mirror Data Table で反転をかける

・反転用のボーン対応表は、初期化時や LOD 切り替え時にキャッシュしておく(Custom モードと同様)

といった形で、Mirrorノードの機能を合体させれば、比較的少ない工数で改造が行えるのではないかと思います。

(ただし、Blend Profile を用いた合成経路や additive アニメーションの扱いなど、いくつか考慮すべき分岐はございますので、その点はご留意ください)

なにかの参考になれば幸いです。

以上、よろしくお願いいたします。

[Attachment Removed]

ご回答ありがとうございます。

ご教示いただいた内容について、まだ検証しきれていないのですが、上記改造を行えばABPを使用する場合でもアニメーションセクションに設定したMirror Data Tableを反映させることもできたりするのでしょうか?

ブレンド前のアニメーションに対してMirrorDataTableを反映させられるなら、Customモードと同様の挙動にしたいと考えています。​

何か問題​等ございましたらご教示いただけますと幸いです。

以上、よろしくお願いいたします。​

[Attachment Removed]

ご質問ありがとうございます。

残念ながら、前回ご案内した方法はABP側にMirror Data Tableを持たせることで大規模改造を避けるアイデアであり、シーケンサー側で指定したMirror Data Tableは利用しません。無改造のUEはシーケンサー側のMirror Data TableをABPに伝達する経路が整備されていないためです。そのため、もしCustomモードと同スペックの挙動をABPで実現することが必須要件となる場合、

・シーケンサーの各アニメーションセクションに設定された Mirror Data Table を、ABP まで伝達する仕組みを追加する

・Slot ノード内部の合成処理において、伝達された Mirror Data Table を使い、各アニメーションが合成される直前に個別に反転を適用する

という、踏み込んだ改造が必要となります。

確かに、MirrorしたアニメーションとMirrorしてないアニメーションを頻繁にクロスフェードしたりブレンドしたりする需要がある場合、アニメーション指定とMirror Data Tableで一つの組を作って指定する必要があるため、前回提案のものだと機能が不足してしまう面はございます。

以上、よろしくお願いいたします。

[Attachment Removed]

ご回答ありがとうございます。

承知致しました。

ご教示いただいた内容を踏まえ、どのように対応するか検討したいと思います。

こちらクローズしていただいて問題ございません。

ご対応ありがとうございました。

[Attachment Removed]

回答のご確認ありがとうございます。

それではお言葉に甘えてCloseさせていただきます。

また何かご不明な点や質問などでてきましたら、お気軽にお問い合わせください。

以上、よろしくお願いいたします。

[Attachment Removed]