ひとことで
アニメーションを切り替えるとき、切り替えた瞬間の「今見えている姿勢」と「新しいアニメーションの姿勢」の差だけを覚えておき、その差を新しいアニメーションの上に重ねて、自然な減速カーブで消していくつなぎ方です。古いアニメーションを計算し続ける必要がないので軽く、切り替え直後から新しい動きの勢いが出ます。『Gears of War 4』(2016)で David Bollo が発表し、今では多くのエンジンで使われています。
ゲームでの使いどころ
- 反応の速い切り替え:攻撃・回避・被弾など、入力に即座に反応したい動きへの切り替え。クロスフェードのように古い動きを引きずらない。
- [モーションマッチング](/keywords/simulation/animation/motion-matching/):頻繁にアニメーションが切り替わるので、軽くて高品質な慣性化ブレンドが事実上の標準です。
- 多数のキャラクター:古い動きを計算しないので、切り替え中のコストが増えません。
- 物理から戻る:ラグドールから起き上がりアニメーションへ戻るときの姿勢の差を吸収する。
Unreal Engine の Inertialization ノードなどで使えます。
しくみ
クロスフェードとの違い
一般的なクロスフェードは、つなぐ時間の間、古いアニメーション A と新しいアニメーション B を両方計算し、重みを 1→0、0→1 と変えながら混ぜます。
なめらかですが、その間は A と B が半分ずつ混ざった「どちらでもない」姿勢になり、A の勢いも残ります。
慣性化ブレンドは、切り替えの瞬間だけ差を記録します。
- 切り替えた瞬間の見えている姿勢 と、新しいアニメーションの姿勢 の差 と、その差が変化していた速さ を記録します(関節ごとの回転の差を、軸と角度で表す)。
- 以後は B だけを計算し、その上に「減衰していく差」 を重ねます。
- 差の減衰には、時間 で差・速さ・加速度がすべて 0 になる 5 次式を使います(Bollo の方法)。
係数は、、(と、そこから決まる初期加速度 )から計算できます。切り替えの瞬間に、姿勢も速さも連続したまま、差が自然に消えていきます。
実装のポイント
- 関節ごとに回転の差を軸と角度で:差のクォータニオンを軸と角度に分け、角度だけを 1 次元の値として減衰させ、同じ軸で回転を戻します。
- 速さの計算:差の速さ は、前のフレームで見えていた姿勢と、新しいアニメーションの 1 フレーム前の姿勢との差から求めます。そのためには、直前 2 フレームの見えている姿勢を保存しておく必要があります。
- 差が大きくなる方向の速さは切る: が差を大きくする向きのときは 0 に置き換えます(行き過ぎを防ぐ)。
- より簡単な減衰:5 次式の代わりに臨界減衰のばね(Holden らの減衰ばねによる慣性化)を使う方法もあり、途中で別の切り替えが来ても扱いやすい利点があります。
つまずきやすい点
- 姿勢の差が大きすぎる:まったく違う姿勢(立ち → 寝そべり)への切り替えでは、差を消す間に体が不自然にねじれることがあります。大きな差には、移行専用のアニメーションを用意します。
- 連続した切り替え:減衰中に次の切り替えが来たら、その時点の見えている姿勢から新たに差を記録し直します。
- ルートの扱い:体全体の位置の差まで慣性化すると、キャラクターが滑るように移動して見えることがあります。ルートの移動は別に扱います。
デモで試すこと
- 3 人は同時に「歩く」と「手を振る」を切り替えています。左はすぐ切り替え、中央はクロスフェード、右は慣性化ブレンドです。
- 右下のグラフは右肩の角度です。すぐ切り替え(赤)は角度が瞬間的に飛び、クロスフェード(黄)はなだらかに移るものの立ち上がりが遅く、慣性化ブレンド(青緑)は勢いよく、なめらかに新しい動きへ移ります。
- 「つなぐ時間」を長くすると違いが分かりやすくなります。クロスフェードでは、その間ずっと歩きと手振りが混ざった中途半端な姿勢になります。
- 「自動で切り替える」をオフにして、「動きを切り替える」を好きなタイミングで押してみてください。歩きのどの瞬間で切り替えても、慣性化ブレンドはなめらかにつながります。