void OnSceneGUI() { UnityJoint joint = target as UnityJoint; if (joint.transform.childCount == 0) { return; } Transform child = joint.transform.GetChild(0); Vector3 forward = (child.position - joint.transform.position).normalized; float radius = Vector3.Distance(child.position, joint.transform.position); Quaternion rot = Quaternion.Euler(0, -Mathf.Abs(joint.MaxAngleCCW), 0); SolidArc t = new SolidArc(); t.from = rot * forward; t.angle = joint.MaxAngleCW + joint.MaxAngleCCW; if (joint.YAxisRotation == UnityJoint.AxisRotState_Enum.Constrained) { Handles.color = new Color(0, 1, 0, 0.2f); Vector3 from = Quaternion.Euler(0, -joint.YMinAngle, 0) * forward; float angle = joint.YMinAngle + joint.YMaxAngle; Handles.DrawSolidArc(joint.transform.position, Vector3.up, from, angle, radius); } if (joint.XAxisRotation == UnityJoint.AxisRotState_Enum.Constrained) { Handles.color = new Color(1, 0, 0, 0.2f); Vector3 from = Quaternion.Euler(-joint.XMinAngle, 0, 0) * Vector3.up; float angle = joint.XMinAngle + joint.XMaxAngle; Handles.DrawSolidArc(joint.transform.position, Vector3.right, from, angle, radius); } if (joint.ZAxisRotation == UnityJoint.AxisRotState_Enum.Constrained) { Handles.color = new Color(0, 0, 1, 0.2f); Vector3 from = Quaternion.Euler(0, 0, -joint.ZMinAngle) * forward; float angle = joint.ZMinAngle + joint.ZMaxAngle; Handles.DrawSolidArc(joint.transform.position, Vector3.forward, from, angle, radius); } Handles.color = Color.magenta; Handles.DrawAAPolyLine(5, new Vector3[] { joint.transform.position, child.position }); Handles.color = Color.white; }
private static void AddJoints(Transform parent, IList <UnityJoint> jointsList) { UnityJoint jointComponent = parent.GetComponent <UnityJoint>(); if (jointComponent != null && jointComponent.enabled) { jointsList.Add(jointComponent); } foreach (Transform child in parent) { AddJoints(child, jointsList); break; // Only 1 child per joint allowed for now!! } }
public static void ApplyJointTransforms(Transform root, IList <Joint> joints, int i = 0) { UnityJoint jointComponent = root.GetComponent <UnityJoint>(); if (jointComponent != null && jointComponent.enabled) { jointComponent.transform.position = joints[i].Position; jointComponent.transform.rotation = joints[i].Orientation; i++; } foreach (Transform child in root) { ApplyJointTransforms(child, joints, i); break; // Only 1 child per joint allowed for now!! } }
public Joint(UnityJoint unityJoint) { this.unityJoint = unityJoint.transform; //position = unityJoint.transform.position; //orientation = unityJoint.transform.rotation; restPosition = Position; restOrientation = Orientation; if (unityJoint.joint != null) { restPosition = unityJoint.joint.restPosition; restOrientation = unityJoint.joint.restOrientation; } HasConstraint = unityJoint.HasConstraint; UpAxis = unityJoint.UpAxis; MaxAngleCW = unityJoint.MaxAngleCW; MaxAngleCCW = unityJoint.MaxAngleCCW; }