MotionMatchingで慣性補間を使用した際の挙動について

モーションマッチング中に慣性補間を行うとブレンド時間が短くなったり途中で終了したりします。

その結果ポーズがポッピングし、ロコモーションの品質が全体的に低下します。

DeadBlendingで代用すると現象は起きなくなりますが、正しく動いている間は慣性補間の方が見栄えが良いです。

そのためDeadBlendingのようにブレンド時間が正しく適用される方法があるのであれば慣性補間を採用したいです。

慣性補間を使用してもブレンド時間がDeadBlendingのように安定する方法があればご教示ください。

DeadBlending使用時と慣性補間使用時のRewindDebuggerのスクリーンショットを用意しましたのでご確認ください。

再現手順

  1. GameAnimationサンプルを複製してプロジェクトを作成します。
  2. ABP_SandboxCharacterのAnimGraphのMotionMatchingノードでBlendTimeを0.5に固定し、"慣性式ブレンドを使用"を有効にします。
  3. ApplyMeshSpaceAdditiveのAdditiveソースポーズに繋がっているDeadBlendingを外します。(慣性補間に複雑な影響を与えないためです)
  4. PoseHistoryの後ろにInertializationノードを繋ぎます。
  5. PIEを開始し、RewindDebuggerでCBP_SandboxCharacterを指定します。
  6. キャラクターを8の字に動かしてからPIEを一時停止します。
  7. RewindDebuggerで慣性化の項目を確認しブレンド時間が短くなっていたり途切れていることを確認します。

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

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

CVarのa.AnimNode.Inertialization.IgnoreDeficitを1に設定していただくことで、下図のように、ブレンド時間の短縮や途切れを防ぐことが可能です。

[Image Removed]​Inertializationは、遷移開始時点の遷移元ポーズと​遷移先ポーズの位置および速度の差分を取り、この差分を減衰させながら加算適用することで最終的に元ポーズの影響をブレンドアウトさせる手法となります。そのため、遷移元ポーズから遷移先に十分移行しないうちに次の遷移が与えられるということが繰り返されますと、キャラクターが指定したアニメーションの演技をろくに反映できないまま、元のポーズに近い状態で滞留してしまうという視覚的不具合を起こす恐れがあります。

この対策として、UEではInertializationが中断された場合に、続くInertializationを短く切り詰めていく処理を積んでおります。

前述のa.AnimNode.Inertialization.IgnoreDeficitはその措置を無効化するフラグとなります。

モーションマッチングは、短いアニメーションクリップをどんどん遷移させて一連の動きを生み出すシステムですので、Inertializationブレンドを併用する場合は、この切り詰め措置に助けられている側面もあるかと思います。ゆえにこの切り詰め措置を無効化する場合は、Motion MatchingノードのBlendTimeを積極的に短くするチューニングが必要になるかもしれません。

ぜひ、一度お手元でお試しください。

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

ご返答いただきありがとうございます。

ご提案頂いた手法により期待した通りの結果が得られました。

ポーズの差分の大きさによっては補間が高速になってしまう状況もありますが、概ね良好な結果になりました。

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

回答のご確認をありがとうございました。期待通りの結果が得られたと聞き、安心いたしました。

なお、今回再現手順では「PoseHistoryの後ろにInertializationノードを繋ぐ」旨が書かれていますが、Inertializationが適用された結果のポーズを履歴に入れてモーションマッチングのポーズ検索に反映させるためにも、Pose Historyノードより前でのInertializationノードの設置をお勧めいたします。

(お手元ではすでにそのようになっているかもしれませんが、念のためお伝えいたします)

それでは本件は回答済みとしてCloseさせていただきます。

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