Character animation

Motion Matching

モーションマッチング

現在姿勢と希望軌道に合う動きをデータから選ぶ。

7 / 10

Interactive demo

Preparing the demo…

Motion Matching

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

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)など、エンジンにも組み込まれ始めています。

しくみ

データベースの準備

  1. アニメーションを集める:歩き・走り・旋回・停止・方向転換など、長めのモーションキャプチャを用意します(ダンスカード:必要な動きを網羅するよう計画的に収録する)。
  2. 各フレームの特徴を計算する:すべてのフレームについて、次のような値を並べた特徴ベクトルを作ります。
    • 未来の軌道:そのフレームから 0.33・0.67・1 秒後の本体の位置と向き(本体から見た座標)
    • 今の姿勢:両足の位置と速度、腰の速度など

実行時

  1. 入力から希望の軌道を予測する:スティックの入力を目標の速度とし、ばね・ダンパーのようなモデルで「このまま操作するとこの先 1 秒でどう動くか」を予測します。
  2. 照合する:今再生中の姿勢の特徴と、予測した軌道を組み合わせた「探したい特徴」を作り、データベースの全フレームとの距離(重み付きの二乗誤差)を計算します。
cost=∑kwk (qk−fk)2\text{cost} = \sum_k w_k\,\big(q_k - f_k\big)^2
  1. 切り替える:最もコストの小さいフレームが、今の再生位置と十分違えば、そこへジャンプします。切り替え時の姿勢の差は慣性化ブレンドでなめらかにつなぎます。
  2. 本体を動かす:再生中のアニメーションのルートモーションで本体を動かします。

これを 0.1〜0.2 秒ごとにくり返します。

実装のポイント

  • 特徴の正規化と重み:特徴ごとに単位や大きさが違うので、標準偏差で正規化してから、重要度に応じた重みをつけます。軌道を重くすると入力への反応がよくなり、姿勢を重くすると動きのつながりがなめらかになります。
  • 探索の高速化:全フレームの総当たりは、数万フレームになると重くなります。k-d 木や包囲体階層のような空間分割、特徴の次元削減、候補の絞り込み(今のタグに合うクリップだけ)で高速化します。
  • タグで制限する:「しゃがみ中」「武器を構え中」などの状態で、探す範囲をタグで絞ります。
  • 学習による圧縮:データベースが巨大になるのを避けるため、ニューラルネットワークで照合と姿勢の生成を置き換える「学習済みモーションマッチング」(Ubisoft、2020)も登場しています。

つまずきやすい点

  • データの穴:必要な動き(例:その場で 135° 振り向く)がデータベースにないと、近い別の動きが選ばれて不自然になります。収録計画が品質を大きく左右します。
  • 切り替えすぎ:少しでもコストが下がるたびに切り替えると、動きが落ち着きません。今の再生を続ける場合に小さなボーナスを与えます。
  • 予測と実際の軌道のずれ:予測モデルが実際のアニメーションの加減速と大きく違うと、選ばれる動きと入力が合わなくなります。データの動きに合わせて予測モデルの速さや反応時間を調整します。

デモで試すこと

  1. 人物は、赤い輪の目的地に向かって歩きます。地面をクリックすると目的地を変えられます。青い線と点が入力から予測した希望の軌道、黄色が選ばれたフレームが持っている軌道です。2 つがほぼ重なっていることを確かめてください。
  2. 左下に、今再生しているクリップの名前が出ます。目的地が左にあると「左へ旋回」、近づくと「立ち止まり」など、状況に応じて自動で選ばれます。
  3. 「希望の速さ」を「走る」にすると、走りのクリップが選ばれるようになります。
  4. 「探し直す間隔」を 1 秒にすると、反応が遅れて、目的地の変化についていけなくなります。

References

Unreal Engine IK Rig Solvers ↗

A general reference for this subcategory.