Feat/14 movement overhaul #20
@@ -545,7 +545,7 @@ func _process(delta: float) -> void:
|
||||
|
||||
func _apply_procedural_animation(data: Dictionary, time: float) -> void:
|
||||
## Applies procedural animation data to the skeleton at the given time.
|
||||
## Uses linear interpolation between keyframe values.
|
||||
## Uses global pose override to set bone transforms relative to their rest pose.
|
||||
if not skeleton:
|
||||
return
|
||||
var tracks = data["tracks"]
|
||||
@@ -577,9 +577,13 @@ func _apply_procedural_animation(data: Dictionary, time: float) -> void:
|
||||
|
||||
if prev_kf.has("rot") and next_kf.has("rot"):
|
||||
var rot: Vector3 = lerp(prev_kf["rot"], next_kf["rot"], t)
|
||||
# Convert euler angles to Quaternion for set_bone_pose_rotation
|
||||
var quat = Quaternion.from_euler(rot)
|
||||
skeleton.set_bone_pose_rotation(bone_idx, quat)
|
||||
# Get the bone's rest global pose
|
||||
var rest_global = skeleton.get_bone_global_pose(bone_idx)
|
||||
# Apply rotation offset around world axes (pre-multiply)
|
||||
# For locomotion: X = forward/back swing, Y = twist, Z = lateral
|
||||
var world_basis = Basis(Quaternion.from_euler(rot))
|
||||
var new_global = Transform3D(world_basis * rest_global.basis, rest_global.origin)
|
||||
skeleton.set_bone_global_pose_override(bone_idx, new_global, 1.0, true)
|
||||
elif prev_kf.has("pos") and next_kf.has("pos"):
|
||||
var pos: Vector3 = lerp(prev_kf["pos"], next_kf["pos"], t)
|
||||
skeleton.set_bone_pose_position(bone_idx, pos)
|
||||
|
||||
Reference in New Issue
Block a user