- var skeleton: Skeleton3D = get_skeleton()
- if !skeleton:
- return # Never happen, but for the safety.
- var bone_idx: int = skeleton.find_bone(bone)
- var _parent_idx: int = skeleton.get_bone_parent(bone_idx)
- var pose: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(bone_idx)
+ if target == null:
+ return
+
+ var current_pose: Transform3D = _skeleton.global_transform * _skeleton.get_bone_global_pose(_bone_idx)
+ current_pose.basis = old_current_pose.basis
+ var target_pose: Transform3D = current_pose.looking_at(target.global_position, Vector3.UP)
+
+ # TODO: replace this specific code with general purpose modifier
+ var axis: Vector3 = target_pose.basis.y
+ target_pose = target_pose.rotated(axis, PI)
+
+ # https://docs.godotengine.org/en/latest/tutorials/3d/using_transforms.html#interpolating-with-quaternions
+ if rotation_lerp_weight > 0:
+ var from := Quaternion(current_pose.basis.orthonormalized())
+ var to := Quaternion(target_pose.basis.orthonormalized())
+ var rot_target := from.slerp(to, rotation_lerp_weight)
+ target_pose.basis = Basis(rot_target)