0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Godot 4.6のIKModifier3Dで手続き的アニメーションを実装する

0
Posted at

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)
    • 足のボーン名がわかっていること (例: LeftUpperLeg, LeftLowerLeg, LeftFoot)

セットアップ

シーン構造は次のようになります。

Character (CharacterBody3D)
├── Skeleton3D
│   └── IKModifier3D (TwoBoneIK3D)
└── RayCast3D (足元判定用)

IKModifier3DSkeleton3D の子として配置する必要があります。エディタのインスペクタで以下を設定します。

  • 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 に近い柔軟さで手続き的アニメーションが構築できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?