ひとことで
アニメーションの中に含まれている「体全体がどれだけ前へ進んだか・向きを変えたか」(ルートの移動)を取り出し、それをそのままキャラクター本体の移動に使う方法です。プログラムで決めた速さで本体を動かし、アニメーションはその場で再生する方式と比べて、足の運びと移動が必ず一致するので、足が地面の上を滑りません。
ゲームでの使いどころ
- 歩き出し・止まり・方向転換:加速や減速の具合がアニメーターの付けた動きどおりになり、足が滑らない。
- 攻撃・回避・よじ登り:踏み込み斬り、ローリング回避、段差の乗り越えなど、アニメーションで表現した移動量をそのまま使いたい動作。
- カットシーンとゲームプレイの接続:演出で作った移動をそのままゲーム内の位置に反映できる。
- [モーションマッチング](/keywords/simulation/animation/motion-matching/):データベースの動きの移動量で本体を動かすのが前提です。
Unity の「Apply Root Motion」、Unreal の「Root Motion from Everything」などで有効にできます。
しくみ
アニメーションの骨格には、足元(地面)の位置を表すルートボーンがあります。
- ルートの移動を取り出す:毎フレーム、ルートボーンの前のフレームからの移動量(平行移動と、鉛直軸周りの回転)を求めます。
- アニメーションからは取り除く:その移動量を骨格の姿勢からは差し引き、アニメーションは「その場」で再生します。
- 本体に適用する:取り出した移動量を、キャラクターの向きに合わせて回転してから、本体(キャラクターコントローラーや物理のカプセル)の移動として加えます。
ルートボーンの動きがない(または信頼できない)アニメーションでは、着地している足の動きを打ち消すように本体を動かすことで、移動量を推定することもできます。足が地面に固定されていれば、アニメーションの中でその足が後ろへ動いた分だけ、体は前へ進んでいるはずだからです。デモはこの方法で移動量を求めています。
一方、その場再生 + プログラムの移動では、本体の速さはゲームのコードが決め(例えば一定の速さ)、アニメーションはその場で再生されます。歩き出しでは足がゆっくり出ているのに本体は最初から速く進み、止まるときはアニメーションが止まっているのに本体が進み続けるので、足が滑ります。
実装のポイント
- 物理・衝突との組み合わせ:ルートモーションの移動は「動きたい量」として、キャラクターコントローラーに渡し、壁や段差との衝突はコントローラー側で処理します。
- 操作性とのバランス:ルートモーションだけに頼ると、入力してから動き出すまでアニメーションに縛られ、操作が重く感じられます。プレイヤーの移動はプログラムで決め、足の滑りはフットロックや再生速度の調整で隠す、という折衷も一般的です。
- ネットワーク:ルートモーションはアニメーションの再生状態に依存するので、サーバーとクライアントで同じ結果を得るには、アニメーションの時間を同期する必要があります。
- ブレンド中の移動:2 つのアニメーションを混ぜているときは、ルートの移動量も同じ重みで混ぜます。
つまずきやすい点
- ルートボーンが動いていない:アニメーションがその場で作られている(In Place)と、取り出す移動量がありません。制作時にルートボーンに移動を入れておきます。
- 腰の揺れまで本体に移してしまう:腰の左右の揺れをルートの移動として扱うと、本体(カメラ)まで揺れます。ルートの移動は水平成分と向きだけにし、揺れはアニメーション側に残します。
- フレームレートによる誤差:移動量をフレームごとに積み重ねるので、固定タイムステップでないと、長い距離でわずかにずれることがあります。
デモで試すこと
- 2 人とも、「歩き出す → 歩く → 止まる → 立ち止まる」同じアニメーションを再生しています。右下のグラフの青がアニメーションの想定する速さ、緑が左の人物に与えた一定の速さです。
- 左(その場再生 + 一定速度)は、歩き出しと止まる瞬間に、足が地面の上を黄色い線のように滑ります。止まってからも、足を着いたまま前へ進んでいきます。
- 右(ルートモーション)は、着地した足が足跡(赤)の上から動かず、左下の「滑り」はほぼ 0 cm のままです。
- 「再生速度」を下げると、足の滑りの違いがよく見えます。