@tool class_name LookForwardModifier extends SkeletonModifier3D @export var target_object: Marker3D @export var head_marker: Marker3D @export_enum(" ") var bone: String func _validate_property(property: Dictionary) -> void: if property.name == "bone": var skeleton: Skeleton3D = get_skeleton() if skeleton: property.hint = PROPERTY_HINT_ENUM property.hint_string = skeleton.get_concatenated_bone_names() func _process_modification() -> void: var skeleton: Skeleton3D = get_skeleton() if !skeleton: return var bone_idx: int = skeleton.find_bone(bone) if bone_idx == -1: return var target_position_global: Vector3 = target_object.global_position var target_position_local: Vector3 = to_local(target_position_global) var head_bone_pose: Transform3D = skeleton.get_bone_global_pose(bone_idx) var new_pose: Transform3D = head_bone_pose.looking_at(target_position_local, Vector3.FORWARD, true) var new_basis: Basis new_basis.y = new_pose.basis.y new_basis.z = new_pose.basis.z new_basis.x = new_pose.basis.x new_pose.basis = new_basis skeleton.set_bone_global_pose(bone_idx, new_pose) func z_and_y_inverse(v : Vector3) -> Vector3 : var tmp: float = v.z v.z = v.y v.y = tmp return v