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

フットIK・フットロック

Foot IK / Foot Locking

足を地面に合わせて滑りを抑える。

4 / 10

インタラクティブデモ

デモを準備しています…

フットIK・フットロック

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

ひとことで

平らな床の上で作った歩きのアニメーションを、段差や坂のある地面でも足が地面に正しく接するように直す処理がフット IK です。フットロックは、足が着地している間だけその位置を固定し、地面の上で足が滑るのを防ぐ処理です。どちらも、キャラクターが「その場に立っている」説得力を大きく左右します。

ゲームでの使いどころ

  • でこぼこの地形や階段:オープンワールドの山道、岩場、階段で、足がめり込んだり浮いたりしないようにする。
  • 傾斜での立ち止まり:坂道で立ち止まったとき、両足をそれぞれの高さの地面に着け、腰を下げる。
  • 足の滑りの防止:移動の速さとアニメーションの歩幅が合っていないとき(速さを滑らかに変えたとき、アニメーションの切り替え中など)に、着地した足がスケートのように滑るのを防ぐ。
  • 大型の生き物:多脚のクモやロボット、四足の動物の足をそれぞれ地面に合わせる。

しくみ

フット IK

  1. 地面の高さを調べる:アニメーションが示す足の水平位置の真上から下へレイキャストして、地面の高さと傾き(法線)を調べます。
  2. 足の目標を決める:足の高さを「地面の高さ + アニメーション上の足の持ち上げ量」にします。
  3. 腰を下げる:段差で片足が低い所にあると、脚を伸ばしても届かないことがあります。両足の必要な下がり量のうち大きい方だけ腰(ルート)を下げます。
  4. 脚を解く:各脚を2 ボーン IKで目標に合わせます。
  5. 足首を傾ける:足の裏が地面の傾きに沿うよう、足首を回します。

フットロック

  1. 着地の判定:アニメーション上で足が地面に近い(またはアニメーションに埋め込んだ「着地」の目印がある)間を着地中とみなします。
  2. 位置を固定する:着地した瞬間のワールド座標を記録し、着地中はその位置を足の目標にします。
  3. 固定を外す:足が浮き始めたら、固定をなめらかに外して元のアニメーションの位置に戻します。固定した位置から離れすぎて脚が伸び切りそうなら、その時点で外します。

実装のポイント

  • アニメーションに着地の情報を持たせる:足が着地している区間を、アニメーションのカーブやイベントとして埋め込んでおくと判定が安定します。
  • 腰の移動をなめらかに:地面の高さの変化に合わせて腰を急に上下させると、がくがくします。腰の高さは指数減衰などで少し遅らせて追従させます。
  • レイキャストの始点:腰の高さくらいから下へ飛ばすと、段差を登るときにも下るときにも地面を見つけられます。足の大きさ程度の球で調べる(スフィアキャスト)と、細かい凹凸に過敏に反応しません。
  • ロックの解除はブレンドで:固定をいきなり外すと足が瞬間移動します。数フレームかけて、固定位置からアニメーションの位置へ移します。

つまずきやすい点

  • 腰を下げすぎる:段差の下の地面に合わせて腰を下げすぎると、高い方の脚が極端に曲がり、しゃがんだような姿勢になります。下げる量に上限を設けます。
  • 速さの不一致を IK で隠しすぎる:フットロックは小さな滑りを隠すためのものです。移動の速さとアニメーションの歩幅が大きく違うと、固定した足が取り残されて脚が伸び切ります。根本的にはルートモーションやアニメーションの再生速度の調整で合わせます。
  • 階段で足が段の縁にかかる:レイキャストが段の縁の近くを調べると、高さが急に変わって足がちらつきます。足の前後 2 点で調べて平均するなどの工夫をします。

デモで試すこと

  1. 人物はでこぼこの地面と段差の上を歩いています。「フット IK」をオフにすると、平らな床用の歩きのままなので、足が地面にめり込んだり宙に浮いたりします。
  2. フット IK をオンに戻し、段差を上り下りするときに腰が下がって脚を届かせる様子を見てください。
  3. 「移動の速さ ÷ アニメーションの歩幅」が 1 より大きいと、体の移動が足の運びより速くなります。「フットロック」をオフにすると、着地中の足が黄色い線のように地面を滑ります。
  4. フットロックをオンにすると、着地した足はその場に固定され、足跡(赤)の上から動きません。左下の「足の滑り」がほぼ 0 になります。

参考資料

Unreal Engine IK Rig Solvers ↗

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