キャラクター・アニメーション

慣性化ブレンド

Inertialization

切り替え時の姿勢差を減衰させる。

8 / 10

インタラクティブデモ

デモを準備しています…

慣性化ブレンド

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

アニメーションを切り替えるとき、切り替えた瞬間の「今見えている姿勢」と「新しいアニメーションの姿勢」の差だけを覚えておき、その差を新しいアニメーションの上に重ねて、自然な減速カーブで消していくつなぎ方です。古いアニメーションを計算し続ける必要がないので軽く、切り替え直後から新しい動きの勢いが出ます。『Gears of War 4』(2016)で David Bollo が発表し、今では多くのエンジンで使われています。

ゲームでの使いどころ

  • 反応の速い切り替え:攻撃・回避・被弾など、入力に即座に反応したい動きへの切り替え。クロスフェードのように古い動きを引きずらない。
  • [モーションマッチング](/keywords/simulation/animation/motion-matching/):頻繁にアニメーションが切り替わるので、軽くて高品質な慣性化ブレンドが事実上の標準です。
  • 多数のキャラクター:古い動きを計算しないので、切り替え中のコストが増えません。
  • 物理から戻る:ラグドールから起き上がりアニメーションへ戻るときの姿勢の差を吸収する。

Unreal Engine の Inertialization ノードなどで使えます。

しくみ

クロスフェードとの違い

一般的なクロスフェードは、つなぐ時間の間、古いアニメーション A と新しいアニメーション B を両方計算し、重みを 1→0、0→1 と変えながら混ぜます。

pose(t)=slerp(A(t), B(t), w(t))\text{pose}(t) = \text{slerp}\big(A(t),\,B(t),\,w(t)\big)

なめらかですが、その間は A と B が半分ずつ混ざった「どちらでもない」姿勢になり、A の勢いも残ります。

慣性化ブレンドは、切り替えの瞬間だけ差を記録します。

  1. 切り替えた瞬間の見えている姿勢 PP と、新しいアニメーションの姿勢 B(0)B(0) の差 x0x_0 と、その差が変化していた速さ v0v_0 を記録します(関節ごとの回転の差を、軸と角度で表す)。
  2. 以後は B だけを計算し、その上に「減衰していく差」x(t)x(t) を重ねます。
pose(t)=x(t)⊕B(t)\text{pose}(t) = x(t) \oplus B(t)
  1. 差の減衰には、時間 TT で差・速さ・加速度がすべて 0 になる 5 次式を使います(Bollo の方法)。
x(t)=At5+Bt4+Ct3+a02t2+v0t+x0x(t) = A t^5 + B t^4 + C t^3 + \tfrac{a_0}{2} t^2 + v_0 t + x_0

係数は、x0x_0、v0v_0(と、そこから決まる初期加速度 a0a_0)から計算できます。切り替えの瞬間に、姿勢も速さも連続したまま、差が自然に消えていきます。

実装のポイント

  • 関節ごとに回転の差を軸と角度で:差のクォータニオンを軸と角度に分け、角度だけを 1 次元の値として減衰させ、同じ軸で回転を戻します。
  • 速さの計算:差の速さ v0v_0 は、前のフレームで見えていた姿勢と、新しいアニメーションの 1 フレーム前の姿勢との差から求めます。そのためには、直前 2 フレームの見えている姿勢を保存しておく必要があります。
  • 差が大きくなる方向の速さは切る:v0v_0 が差を大きくする向きのときは 0 に置き換えます(行き過ぎを防ぐ)。
  • より簡単な減衰:5 次式の代わりに臨界減衰のばね(Holden らの減衰ばねによる慣性化)を使う方法もあり、途中で別の切り替えが来ても扱いやすい利点があります。

つまずきやすい点

  • 姿勢の差が大きすぎる:まったく違う姿勢(立ち → 寝そべり)への切り替えでは、差を消す間に体が不自然にねじれることがあります。大きな差には、移行専用のアニメーションを用意します。
  • 連続した切り替え:減衰中に次の切り替えが来たら、その時点の見えている姿勢から新たに差を記録し直します。
  • ルートの扱い:体全体の位置の差まで慣性化すると、キャラクターが滑るように移動して見えることがあります。ルートの移動は別に扱います。

デモで試すこと

  1. 3 人は同時に「歩く」と「手を振る」を切り替えています。左はすぐ切り替え、中央はクロスフェード、右は慣性化ブレンドです。
  2. 右下のグラフは右肩の角度です。すぐ切り替え(赤)は角度が瞬間的に飛び、クロスフェード(黄)はなだらかに移るものの立ち上がりが遅く、慣性化ブレンド(青緑)は勢いよく、なめらかに新しい動きへ移ります。
  3. 「つなぐ時間」を長くすると違いが分かりやすくなります。クロスフェードでは、その間ずっと歩きと手振りが混ざった中途半端な姿勢になります。
  4. 「自動で切り替える」をオフにして、「動きを切り替える」を好きなタイミングで押してみてください。歩きのどの瞬間で切り替えても、慣性化ブレンドはなめらかにつながります。

参考資料

Unreal Engine IK Rig Solvers ↗

分野全体の資料で、この項目を直接扱っているとは限りません。