キャラクター・アニメーション

FABRIK

Forward And Backward Reaching IK

関節を往復して触手や鎖を目標へ伸ばす。

3 / 10

インタラクティブデモ

デモを準備しています…

FABRIK

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

たくさんの関節がつながった鎖の先端を目標に届かせる IK を、「先端から根元へ」と「根元から先端へ」の 2 方向に、関節の位置を骨の長さに合わせて直していくことで解く方法です。Aristidou と Lasenby が 2011 年に発表しました。角度や行列の計算をせず、点と距離だけで解けるので、実装が簡単で速く、結果もなめらかです。

ゲームでの使いどころ

  • 触手・しっぽ・首:タコの触手、ドラゴンの首やしっぽ、ロボットアーム、ヘビの体を目標に向けて伸ばす。
  • ロープや鎖の端をつかむ:ぶら下がった鎖の先を手で引っ張る、クレーンのアームを伸ばす。
  • 背骨や指:多関節の背骨を曲げて視線や狙いを合わせる、指を物の形に沿わせる。
  • フルボディ IK の土台:木構造(枝分かれ)にも拡張でき、複数の目標を持つ全身の IK にも使われます。

しくみ

関節の位置を p0p_0(根元)〜 pnp_n(先端)、各骨の長さを did_i、目標を tt とします。

  1. 届くかどうか:根元から目標までの距離が骨の長さの合計より長ければ、鎖をまっすぐ目標の方へ伸ばして終わりです。
  2. 後ろ向きの処理:先端 pnp_n を目標 tt に置きます。次に pn−1p_{n-1} を、「pnp_n から pn−1p_{n-1} への向きを保ったまま、距離がちょうど dn−1d_{n-1} になる位置」へ移します。これを根元まで順にくり返します。
pi←pi+1+di pi−pi+1∣pi−pi+1∣p_i \leftarrow p_{i+1} + d_i\,\frac{p_i - p_{i+1}}{|p_i - p_{i+1}|}

この時点で、根元 p0p_0 は元の位置からずれて(浮いて)います。

  1. 前向きの処理:根元 p0p_0 を元の位置に戻し、今度は先端に向かって同じように直します。
pi+1←pi+di pi+1−pi∣pi+1−pi∣p_{i+1} \leftarrow p_i + d_i\,\frac{p_{i+1} - p_i}{|p_{i+1} - p_i|}

今度は先端が目標からずれます。

  1. くり返す:先端が目標に十分近づくまで(または決めた回数)2 と 3 をくり返します。多くの場合、数回で収束します。

最後に、各骨が隣の関節を向くよう回転を設定します。

実装のポイント

  • 前のフレームの結果から始める:関節の位置を毎フレーム保持し、そこから解き始めると、動きが連続してなめらかになります(ウォームスタート)。
  • 関節の角度制限:肘のように曲がる向きや角度に制限がある関節は、各ステップで関節の位置を許される円錐の中に押し込みます。
  • 複数の目標(木構造):枝分かれした骨格では、各枝で後ろ向きの処理をして分岐点の位置を平均し、そこから前向きに処理します。

つまずきやすい点

  • ねじれは扱えない:位置だけで解くので、骨の軸周りのねじれは決まりません。骨の向きを設定するときに、ねじれの基準(上方向)を別に与えます。
  • 自然な姿勢とは限らない:解は目標に届くことだけを保証します。人の腕や背骨に使う場合は、角度の制限や、元のアニメーションへ戻す力が必要です。
  • 目標がほぼ真後ろ:根元の真後ろなど、鎖が大きく折り返す必要がある目標では、収束が遅くなることがあります。

デモで試すこと

  1. 3 本の触手が、黄色い目標に向かって伸びます。「目標を自動で動かす」をオフにして、目標をドラッグしてみてください。
  2. 「1 回目の後ろ向きの結果を表示」をオンにすると、赤い点線が、先端を目標に置いてから根元へ向かって直した直後の形です。根元が台から浮いているのが分かります。
  3. 「往復の回数」を 1 にすると、目標から少しずれることがあります。回数を増やすと先端がぴたりと目標に合います。左下は実際に何回で収束したかです。
  4. 「関節の数」を変えると、少ない関節ではカクカクと、多い関節では柔らかな曲線で目標に届きます。

参考資料

Unreal Engine IK Rig Solvers ↗

分野全体の資料で、この項目を直接扱っているとは限りません。