diff options
author | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
---|---|---|
committer | chai <215380520@qq.com> | 2024-03-13 11:00:58 +0800 |
commit | 6ce8b9e22fc13be34b442c7b6af48b42cd44275a (patch) | |
tree | b38119d2acf0a982cb67e381f146924b9bfc3b3f /ConfigurableJointExtensions.cs |
+init
Diffstat (limited to 'ConfigurableJointExtensions.cs')
-rw-r--r-- | ConfigurableJointExtensions.cs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/ConfigurableJointExtensions.cs b/ConfigurableJointExtensions.cs new file mode 100644 index 0000000..1fcbf91 --- /dev/null +++ b/ConfigurableJointExtensions.cs @@ -0,0 +1,41 @@ +using UnityEngine; + +public static class ConfigurableJointExtensions +{ + public static void SetTargetRotationLocal(this ConfigurableJoint joint, Quaternion targetLocalRotation, Quaternion startLocalRotation) + { + if (joint.configuredInWorldSpace) + { + Debug.LogError("SetTargetRotationLocal should not be used with joints that are configured in world space. For world space joints, use SetTargetRotation.", joint); + } + joint.SetTargetRotationInternal(targetLocalRotation, startLocalRotation, Space.Self); + } + + public static void SetTargetRotation(this ConfigurableJoint joint, Quaternion targetWorldRotation, Quaternion startWorldRotation) + { + if (!joint.configuredInWorldSpace) + { + Debug.LogError("SetTargetRotation must be used with joints that are configured in world space. For local space joints, use SetTargetRotationLocal.", joint); + } + joint.SetTargetRotationInternal(targetWorldRotation, startWorldRotation, Space.World); + } + + private static void SetTargetRotationInternal(this ConfigurableJoint joint, Quaternion targetRotation, Quaternion startRotation, Space space) + { + Vector3 axis = joint.axis; + Vector3 normalized = Vector3.Cross(joint.axis, joint.secondaryAxis).normalized; + Vector3 normalized2 = Vector3.Cross(normalized, axis).normalized; + Quaternion quaternion = Quaternion.LookRotation(normalized, normalized2); + Quaternion targetRotation2 = Quaternion.Inverse(quaternion); + if (space == Space.World) + { + targetRotation2 *= startRotation * Quaternion.Inverse(targetRotation); + } + else + { + targetRotation2 *= Quaternion.Inverse(targetRotation) * startRotation; + } + targetRotation2 *= quaternion; + joint.targetRotation = targetRotation2; + } +} |