fix: only override animated bones, not all bones

This commit is contained in:
2026-06-25 16:39:09 -04:00
parent d6df49844e
commit 8415ceb926
+10 -14
View File
@@ -324,21 +324,17 @@ func _apply_animation_by_code(anim_name: String, time: float) -> void:
if _bone_idxs.is_empty(): if _bone_idxs.is_empty():
_cache_bone_indices() _cache_bone_indices()
# Loop all bones and reset to rest, then apply animation offset # Only override bones that we have animation data for
var bone_count: int = skeleton.get_bone_count() for bone_name in _bone_idxs:
for i in range(bone_count): var bone_idx: int = _bone_idxs[bone_name]
var rest: Transform3D = skeleton.get_bone_rest(i) var offset: Vector3 = _get_bone_anim_offset(anim_name, bone_idx, time)
var new_transform := Transform3D(rest.basis, rest.origin) if offset == Vector3.ZERO:
continue
# Apply animation-specific rotation offset var rest: Transform3D = skeleton.get_bone_rest(bone_idx)
var offset := _get_bone_anim_offset(anim_name, i, time) var offset_basis: Basis = Basis(Quaternion.from_euler(offset))
if offset != Vector3.ZERO: var new_basis: Basis = offset_basis * rest.basis
var offset_basis := Basis(Quaternion.from_euler(offset)) skeleton.set_bone_global_pose_override(bone_idx, Transform3D(new_basis, rest.origin), 1.0, true)
new_transform.basis = offset_basis * rest.basis
# Recalculate global position with the rotated bone
new_transform.origin = rest.origin
skeleton.set_bone_global_pose_override(i, new_transform, 1.0, true)
func _cache_bone_indices() -> void: func _cache_bone_indices() -> void: