This explanation is currently available in Japanese.
ひとことで
たくさんのアニメーションを 1 つのデータベースにまとめ、一定時間ごとに「今の姿勢」と「プレイヤーの入力から予測したこの先の移動の軌道」に最も合うフレームを探して、そこから再生を続ける方法です。どのアニメーションをいつ再生するかを状態遷移図で細かく作り込む代わりに、データから自動で選ぶので、非常に自然で反応のよい動きになります。
ゲームでの使いどころ
- プレイヤーキャラクターの移動:『フォーオナー』(Ubisoft、2017)で導入され、『The Last of Us Part II』などの AAA タイトルで、歩き・走り・方向転換・立ち止まりの自然さを支えています。
- NPC の群衆:多数の NPC を、それぞれの目的地に向かって自然に歩かせる。
- 動物・乗り物:馬の歩法の切り替えなど、細かな遷移を作り込むのが難しい動き。
Unreal Engine 5 の Pose Search(Motion Matching)など、エンジンにも組み込まれ始めています。
しくみ
データベースの準備
- アニメーションを集める:歩き・走り・旋回・停止・方向転換など、長めのモーションキャプチャを用意します(ダンスカード:必要な動きを網羅するよう計画的に収録する)。
- 各フレームの特徴を計算する:すべてのフレームについて、次のような値を並べた特徴ベクトルを作ります。
- 未来の軌道:そのフレームから 0.33・0.67・1 秒後の本体の位置と向き(本体から見た座標)
- 今の姿勢:両足の位置と速度、腰の速度など
実行時
- 入力から希望の軌道を予測する:スティックの入力を目標の速度とし、ばね・ダンパーのようなモデルで「このまま操作するとこの先 1 秒でどう動くか」を予測します。
- 照合する:今再生中の姿勢の特徴と、予測した軌道を組み合わせた「探したい特徴」を作り、データベースの全フレームとの距離(重み付きの二乗誤差)を計算します。
- 切り替える:最もコストの小さいフレームが、今の再生位置と十分違えば、そこへジャンプします。切り替え時の姿勢の差は慣性化ブレンドでなめらかにつなぎます。
- 本体を動かす:再生中のアニメーションのルートモーションで本体を動かします。
これを 0.1〜0.2 秒ごとにくり返します。
実装のポイント
- 特徴の正規化と重み:特徴ごとに単位や大きさが違うので、標準偏差で正規化してから、重要度に応じた重みをつけます。軌道を重くすると入力への反応がよくなり、姿勢を重くすると動きのつながりがなめらかになります。
- 探索の高速化:全フレームの総当たりは、数万フレームになると重くなります。k-d 木や包囲体階層のような空間分割、特徴の次元削減、候補の絞り込み(今のタグに合うクリップだけ)で高速化します。
- タグで制限する:「しゃがみ中」「武器を構え中」などの状態で、探す範囲をタグで絞ります。
- 学習による圧縮:データベースが巨大になるのを避けるため、ニューラルネットワークで照合と姿勢の生成を置き換える「学習済みモーションマッチング」(Ubisoft、2020)も登場しています。
つまずきやすい点
- データの穴:必要な動き(例:その場で 135° 振り向く)がデータベースにないと、近い別の動きが選ばれて不自然になります。収録計画が品質を大きく左右します。
- 切り替えすぎ:少しでもコストが下がるたびに切り替えると、動きが落ち着きません。今の再生を続ける場合に小さなボーナスを与えます。
- 予測と実際の軌道のずれ:予測モデルが実際のアニメーションの加減速と大きく違うと、選ばれる動きと入力が合わなくなります。データの動きに合わせて予測モデルの速さや反応時間を調整します。
デモで試すこと
- 人物は、赤い輪の目的地に向かって歩きます。地面をクリックすると目的地を変えられます。青い線と点が入力から予測した希望の軌道、黄色が選ばれたフレームが持っている軌道です。2 つがほぼ重なっていることを確かめてください。
- 左下に、今再生しているクリップの名前が出ます。目的地が左にあると「左へ旋回」、近づくと「立ち止まり」など、状況に応じて自動で選ばれます。
- 「希望の速さ」を「走る」にすると、走りのクリップが選ばれるようになります。
- 「探し直す間隔」を 1 秒にすると、反応が遅れて、目的地の変化についていけなくなります。