Godot 4.6 で IKModifier3D ノードが追加され、3.x 時代にあって 4.x で消えていた逆運動学 (IK) が戻ってきました。本稿では、新しい IK システムを使って足の地面フィッティングを実装する流れを、実際のコードと共に紹介します。
IKModifier3D とは
3.x 時代の Godot には SkeletonIK3D が存在しましたが、4.x のスケルトン再設計で削除されていました。3年越しで導入された IKModifier3D は、SkeletonModifier3D の派生として実装されており、5種類の solver が提供されています。
-
TwoBoneIK3D: 腕や脚のような固定2関節チェーン -
-
FABRIK3D: 尻尾、触手、脊椎など長いチェーン
-
-
-
CCDIK3D: 柔らかい制約を持つ多関節チェーン
-
-
-
SplineIK3D: 曲線に沿ったスケルトン
-
-
-
JacobianIK3D: 複雑なリグ用の汎用 solver
-
本稿では足の IK に適している TwoBoneIK3D を使います。
前提
- Godot 4.6 以上
-
- スケルトンを持つ CharacterBody3D (例:
robot.gltf)
- スケルトンを持つ CharacterBody3D (例:
-
- 足のボーン名がわかっていること (例:
LeftUpperLeg,LeftLowerLeg,LeftFoot)
- 足のボーン名がわかっていること (例:
セットアップ
シーン構造は次のようになります。
Character (CharacterBody3D)
├── Skeleton3D
│ └── IKModifier3D (TwoBoneIK3D)
└── RayCast3D (足元判定用)
IKModifier3D は Skeleton3D の子として配置する必要があります。エディタのインスペクタで以下を設定します。
-
Root Bone:LeftUpperLeg -
-
Tip Bone:LeftFoot
-
-
-
Target Node: 後述のターゲット Node3D
-
ターゲットの動的更新
IK のターゲット位置は、地面の高さに合わせて毎フレーム更新します。
@onready var skeleton: Skeleton3D = $Skeleton3D
@onready var left_foot_ik: TwoBoneIK3D = $Skeleton3D/LeftFootIK
@onready var left_foot_target: Node3D = $LeftFootTarget
@onready var ray: RayCast3D = $GroundRay
const FOOT_OFFSET: float = 0.05
func _physics_process(delta: float) -> void:
update_foot_ik(left_foot_ik, left_foot_target, "LeftFoot")
func update_foot_ik(ik: TwoBoneIK3D, target: Node3D, bone_name: String) -> void:
var bone_idx: int = skeleton.find_bone(bone_name)
if bone_idx == -1:
return
var bone_global: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(bone_idx)
ray.global_position = bone_global.origin + Vector3.UP * 0.5
ray.target_position = Vector3.DOWN * 1.0
ray.force_raycast_update()
if ray.is_colliding():
var hit_point: Vector3 = ray.get_collision_point()
target.global_position = hit_point + Vector3.UP * FOOT_OFFSET
ik.influence = 1.0
else:
ik.influence = 0.0
```
## ポイント
- `ik.influence` で IK の強さをブレンドできる (0.0 で無効、1.0 で完全適用)
- - レイキャストは物理処理内で `force_raycast_update()` を呼ぶ
- - 足の向きを地面の法線に合わせたい場合は、ターゲットの basis も調整する
## 制約と回避策
### 関節の反転問題
`TwoBoneIK3D` は、target が届かない位置にあると関節が反転することがあります。対策としては、`pole_node` を設定して膝の向きを固定します。
```gdscriptik.pole_node = pole_marker.get_path()
パフォーマンス
IKModifier3D の処理は _physics_process ではなく _notification(NOTIFICATION_INTERNAL_PROCESS) のタイミングで自動実行されます。複数の IK を重ねる場合は、Skeleton3D の modification_stack_priority で順序を制御してください。
4.5 以前との違い
4.5 以前は、IK を自作するか、サードパーティ addon (godot-ik-legacy など) に頼る必要がありました。4.6 では公式サポートなので、エディタ内でプレビューしながらパラメータ調整ができ、ランタイムオーバーヘッドも最小化されています。
4.6 リリースノート に IKModifier3D の詳細が記載されています。
まとめ
IKModifier3D の追加により、Godot 4.x で 3D キャラクターアニメーションを扱うハードルが大きく下がりました。特に足の地面フィッティング、ドアノブに手を伸ばす動作、武器を両手で持つといった表現が、手続き的に実装できるようになっています。
solver ごとの特性を理解して使い分けると、Unity の Animation Rigging や Unreal の Control Rig に近い柔軟さで手続き的アニメーションが構築できます。