Character animation

Two-Bone / Limb Inverse Kinematics

2ボーンIK

手足の先を目標へ合わせる。

1 / 10

Interactive demo

Preparing the demo…

Two-Bone / Limb Inverse Kinematics

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

This explanation is currently available in Japanese.

ひとことで

肩から手、腰から足のように、2 本の骨でできた手足の先を、指定した目標の位置へ届かせるための関節の角度を求める方法です。上の骨・下の骨・付け根から目標までの 3 辺で三角形ができるので、余弦定理で肘や膝の角度が一度に決まり、反復計算がいりません。ゲームのキャラクターの IK(逆運動学)の大半は、この 2 ボーン IK で解かれています。

ゲームでの使いどころ

  • 足を地面に合わせる:段差や坂で、足の裏を地面の高さに合わせる(フット IK)。
  • 手を物に合わせる:ドアノブ・はしご・ハンドル・武器のグリップをつかむ。両手持ちの武器で、左手を銃身に添え続ける。
  • 狙いや接触:パンチやキックを相手に当てる、壁に手をつく、物を拾う。
  • 乗り物:自転車のペダルやハンドルにキャラクターの手足を合わせる。

しくみ

付け根(肩)の位置を AA、目標を TT、上の骨の長さを l1l_1、下の骨の長さを l2l_2 とし、d=∣T−A∣d = |T - A| とします。

  1. 届くかどうか:d>l1+l2d > l_1 + l_2 なら届かないので、腕をまっすぐ伸ばして目標の方を指します(dd を l1+l2l_1 + l_2 に縮めて扱う)。
  2. 付け根での角度:三角形の余弦定理から、付け根で目標方向から何度ずらせばよいかが求まります。
cos⁡α=l12+d2−l222 l1 d\cos\alpha = \frac{l_1^2 + d^2 - l_2^2}{2\,l_1\,d}
  1. 曲げる向き:三角形の形は決まっても、その三角形を目標方向の軸の周りにどれだけ回すか(肘がどちらを向くか)は決まりません。そこでポールベクトル(肘・膝を向けたい方向を示す点)を別に与え、その方向に曲げます。
  2. 中間の関節の位置:目標方向の単位ベクトル d^\hat{\mathbf{d}} と、それに直交する曲げる向き b^\hat{\mathbf{b}} から、
E=A+l1cos⁡α d^+l1sin⁡α b^E = A + l_1\cos\alpha\,\hat{\mathbf{d}} + l_1\sin\alpha\,\hat{\mathbf{b}}

が肘の位置です。あとは、上の骨が A→EA \to E、下の骨が E→TE \to T を向くよう回転を設定します。

実装のポイント

  • 完全に伸ばさない:d=l1+l2d = l_1 + l_2 ちょうどだと、角度の計算が不安定になり、肘がぴくぴく震えます。0.999 倍などわずかに短くします。
  • ポールベクトルの決め方:膝は足の向きの前方、肘は体の後ろ外側など、関節ごとに自然な向きを決めておきます。アニメーションの元の姿勢での肘の位置をポールにすると、元の動きの雰囲気を保てます。
  • 元のアニメーションとの混ぜ合わせ:IK の結果をそのまま使わず、重み(0〜1)で元の姿勢と球面線形補間すると、IK をなめらかに有効化・無効化できます。
  • 手首・足首の向き:2 ボーン IK が決めるのは位置だけです。手のひらや足の裏の向きは、目標の向き(物の表面の法線など)に合わせて別に設定します。

つまずきやすい点

  • 肘が裏返る:ポールベクトルが目標方向とほぼ一直線になると、曲げる向きが定まらず、肘がくるっと反対側へ回ります。ポールを目標方向から十分離れた位置に置きます。
  • 骨の長さの不一致:モデルの骨の実際の長さと、IK に渡す長さがずれていると、手が目標に届かなかったり行き過ぎたりします。長さは実際のボーンの位置から測ります。
  • 3 本以上の骨:指や背骨、触手など 3 本以上の骨がつながった部分には、FABRIK などの反復法を使います。

デモで試すこと

  1. 黄色い球をドラッグすると、右腕がそれに手を伸ばします。赤い三角形は、上腕・前腕・肩から目標までの 3 辺です。三角形の形から肘の角度が決まっていることを確かめてください。
  2. 黄色い網の球(腕が届く範囲)の外に目標を置くと、腕はまっすぐ伸びて目標の方を指します。
  3. 「肘の向き」を動かすと、手の位置は同じまま、肘だけが肩と手を結ぶ軸の周りを回ります。
  4. 青い球をドラッグすると、左足が台の上の目標に合わせて膝を曲げます。脚も同じ 2 ボーン IK です。

References

Unreal Engine IK Rig Solvers ↗

A general reference for this subcategory.