3 class_name TrackingBone3D_head
4 extends SkeletonModifier3D
6 @export_enum(" ") var bone: String
7 @export var target: Vector3 = Vector3(0, 0, 0)
10 func _validate_property(property: Dictionary) -> void:
11 if property.name == "bone":
12 var skeleton: Skeleton3D = get_skeleton()
14 property.hint = PROPERTY_HINT_ENUM
15 property.hint_string = skeleton.get_concatenated_bone_names()
18 func _process_modification() -> void:
19 var skeleton: Skeleton3D = get_skeleton()
21 return # Never happen, but for the safety.
22 var bone_idx: int = skeleton.find_bone(bone)
23 var _parent_idx: int = skeleton.get_bone_parent(bone_idx)
24 var pose: Transform3D = skeleton.global_transform * skeleton.get_bone_global_pose(bone_idx)
26 #var looked_at: Transform3D = _w_look_at(pose, target)
27 var looked_at: Transform3D = pose.looking_at(target, Vector3.UP)
28 var axis: Vector3 = looked_at.basis.y
29 looked_at = looked_at.rotated(axis, PI)
31 skeleton.set_bone_global_pose(
34 (skeleton.global_transform.affine_inverse() * looked_at).basis.orthonormalized(),
35 skeleton.get_bone_global_pose(bone_idx).origin