summaryrefslogtreecommitdiff
path: root/ConfigurableJointExtensions.cs
blob: 1fcbf91e73a5e03d500f7b1e66f3c52178f384a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
	}
}