]> Untitled Git - william-skin.git/blob - TrackingBone3D_head.gd
04e69383635509774e90a5db7416a86b13c84d18
[william-skin.git] / TrackingBone3D_head.gd
1 @tool
2
3 class_name TrackingBone3D_head
4 extends SkeletonModifier3D
5
6 @export_enum(" ") var bone: String
7 @export var target: Vector3 = Vector3(0, 0, 0)
8
9
10 func _validate_property(property: Dictionary) -> void:
11         if property.name == "bone":
12                 var skeleton: Skeleton3D = get_skeleton()
13                 if skeleton:
14                         property.hint = PROPERTY_HINT_ENUM
15                         property.hint_string = skeleton.get_concatenated_bone_names()
16
17
18 func _process_modification() -> void:
19         var skeleton: Skeleton3D = get_skeleton()
20         if !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)
25         
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)
30         
31         skeleton.set_bone_global_pose(
32                 bone_idx,
33                 Transform3D(
34                         (skeleton.global_transform.affine_inverse() * looked_at).basis.orthonormalized(), 
35                         skeleton.get_bone_global_pose(bone_idx).origin
36                         )
37                 )