fix: only override animated bones, not all bones
This commit is contained in:
@@ -324,21 +324,17 @@ func _apply_animation_by_code(anim_name: String, time: float) -> void:
|
||||
if _bone_idxs.is_empty():
|
||||
_cache_bone_indices()
|
||||
|
||||
# Loop all bones and reset to rest, then apply animation offset
|
||||
var bone_count: int = skeleton.get_bone_count()
|
||||
for i in range(bone_count):
|
||||
var rest: Transform3D = skeleton.get_bone_rest(i)
|
||||
var new_transform := Transform3D(rest.basis, rest.origin)
|
||||
# Only override bones that we have animation data for
|
||||
for bone_name in _bone_idxs:
|
||||
var bone_idx: int = _bone_idxs[bone_name]
|
||||
var offset: Vector3 = _get_bone_anim_offset(anim_name, bone_idx, time)
|
||||
if offset == Vector3.ZERO:
|
||||
continue
|
||||
|
||||
# Apply animation-specific rotation offset
|
||||
var offset := _get_bone_anim_offset(anim_name, i, time)
|
||||
if offset != Vector3.ZERO:
|
||||
var offset_basis := Basis(Quaternion.from_euler(offset))
|
||||
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)
|
||||
var rest: Transform3D = skeleton.get_bone_rest(bone_idx)
|
||||
var offset_basis: Basis = Basis(Quaternion.from_euler(offset))
|
||||
var new_basis: Basis = offset_basis * rest.basis
|
||||
skeleton.set_bone_global_pose_override(bone_idx, Transform3D(new_basis, rest.origin), 1.0, true)
|
||||
|
||||
|
||||
func _cache_bone_indices() -> void:
|
||||
|
||||
Reference in New Issue
Block a user