慣性ベースドなアニメーションブレンド(解説編)
GDC2018 にて Microsoft から「Inertialization: High-Performance Animation Transitions in 'Gears of War'」と題した講演が行われました。実用的で良い講演だったので解説していこうと思います。
講演概要
- 従来のクロスフェードによるアニメーションブレンドでは、ブレンド中に2つのアニメーションを評価する必要があり、ゲームの状態により瞬間的な処理コストが跳ね上がるという問題を抱えている。
- Gears of War ではアニメーションブレンド時に2つのアニメーションを評価する事を辞め、アニメーション遷移後のポスト処理としてブレンドを行った。
- ブレンド開始時点の関節速度を維持することで、遷移前アニメーションの評価を止めても自然なブレンドを実現できる。
従来のクロスフェード
Gears of War でのポスト処理ブレンド
試してみた感想
解説に入る前に、手元で試してみた感想を書いておきます。
GDC2018で講演された、Gears of War で使われた慣性ブレンドを組んでみた。関節加速度基準で静止ポーズからブレンドするので、ブレンド前後のアニメーションを同一フレームで流さないようにしてコストを抑えつつ、自然なブレンドも維持する手法。スローにすると慣性が効いてるのがわかりやすい。 #UE4 pic.twitter.com/iXP6UOgA7x
— ほげたつ (@HogeTatu) 2018年5月23日
ポーズからの加算になるので、連続して同じアニメーションが流れた場合にも重ねがけのような効果が出て使いやすい。 pic.twitter.com/ALp1BMikIB
— ほげたつ (@HogeTatu) 2018年5月23日
メリット
補間式
スライドには必要な式が揃っているので、機能を実装するという目的の上では全てを把握する必要は無いのですが、ここでは自分用のメモとして式の導出についても書いておきます。
時間 t におけるポーズ差分 x
アニメーションブレンドとは遷移前アニメのポーズから遷移後アニメのポーズに徐々に変化していくことを指します。つまり時間 t におけるポーズ差分 x を とした時、 は時間の経過と共に差分が減少していき、ブレンド時間 で 0 に収束する事が望まれます。ここで遷移前アニメと遷移後アニメの差分を 、遷移時の速度を 、遷移時の加速度を とした場合、以下の式になると記載されています。
確認のために、いくつか任意のパラメータを与えてプロットしてみたところ、いずれも 0 に収束していることから妥当性が伺えます。
これは 1985 年に Flash and Hogan が「The Coordination of Arm Movements: An Experimentally Confirmed Mathematical 」と題した論文が元となっており、日本では躍度最小モデルとして知られています。このモデルは人間の運動を解析的に解くことができるもので、完全ではないものの、比較的良く実際の運動と一致します。躍度とは位置を3回微分したもの、つまり加速度の変化率です。躍度最小モデルでは躍度の2乗を開始から終了まで積分し、それを評価関数として最小になるものが最適とされています。
また、 がオイラーポアソン方程式を満たす場合に評価関数 が極値を取り、これを解くと以下の式が導かれます。
これにより は 5 次式であることがわかるため、距離 及び、微分により速度 、加速度 は以下の式で定義できます。
この時、論文では動きの開始点及び最終点で速度と加速度が 0 になるように式を解いていますが、今回は 最終点での距離、速度、加速度が 0 になるのが目標 であるため、それらを用いて式を解いていきます。
従って、、、 なので以下の連立方程式が成り立ちます。
これを解くことで が求まります。
また、 に を代入して、
これにより、スライドに書かれている 及び、 が求まりました。
遷移時の加速度 a0 と Overshoot
に与える遷移時の加速度 によっては、収束までの過程で 0 を超えてしまうことがあり、これを Overshoot と呼びます。
Overshoot させないために、 はブレンド時間 において躍度が 0 になるものを選びます。躍度は加速度の変化率なので、前述の を微分します。
これを解くことで が求まります。
ただし、これだけではまだ不十分で、遷移前アニメーションによっては Overshoot してしまうため、今度は を調整します。 は の値によって変化し、1 つの極値が存在します。以下は をプロットしたものです。
これを解くと、 が極値を取る際の が求まります。
上記で を調整した後に再度プロットしてみると、Overshoot しないことが確認できます。
また、上記の式はあくまで の上限値であるため、これよりも小さい値であれば Overshoot せずに収束します。つまり、実際には以下の式になります。
まとめ
■ 遷移後ポーズ
■ 現在フレーム -1 ポーズ
■ 現在フレーム -2 ポーズ
■ 遷移前ポーズと遷移後ポーズの差分
[現在フレーム -1 ポーズ] - [遷移後ポーズ]
■ 遷移時の速度
( [現在フレーム -1 ポーズ] - [現在フレーム -2 ポーズ] )
■ 遷移時の加速度
■ 遷移時間