/// <summary> /// Creates GUI elements for fields specific to the spherical joint. /// </summary> protected void BuildGUI(SphericalJoint joint) { enableLimitField.OnChanged += x => { joint.EnableLimit = x; MarkAsModified(); ConfirmModify(); ToggleLimitFields(x); }; Layout.AddElement(enableLimitField); limitLayout = Layout.AddLayoutX(); { limitLayout.AddSpace(10); GUILayoutY limitContentsLayout = limitLayout.AddLayoutY(); limitGUI = new LimitConeRangeGUI(joint.Limit, limitContentsLayout, Persistent); limitGUI.OnChanged += (x, y) => { joint.Limit = new LimitConeRange(x, y); MarkAsModified(); }; limitGUI.OnConfirmed += ConfirmModify; } ToggleLimitFields(joint.EnableLimit); base.BuildGUI(joint, true); }
private static void DrawSphericalJoint(SphericalJoint joint) { Vector3 target = GetAnchor(joint, JointBody.Target); Vector3 anchor = GetAnchor(joint, JointBody.Anchor); Vector3 center = target; Rigidbody rigidbody = joint.GetRigidbody(JointBody.Target); if (rigidbody != null) center = rigidbody.SceneObject.Position; Gizmos.Color = Color.White; Gizmos.DrawSphere(center, 0.05f); Gizmos.Color = Color.Yellow; Gizmos.DrawSphere(target, 0.05f); Gizmos.DrawSphere(anchor, 0.05f); Gizmos.Color = Color.Green; Gizmos.DrawLine(target, center); Gizmos.Color = Color.Green; if (joint.EnableLimit) { LimitConeRange limit = joint.Limit; Radian zAngle = MathEx.Min(new Degree(360), limit.ZLimitAngle * 2.0f); Radian yAngle = MathEx.Min(new Degree(360), limit.YLimitAngle * 2.0f); Gizmos.Transform = joint.SceneObject.WorldTransform; Gizmos.DrawWireArc(Vector3.Zero, Vector3.ZAxis, 0.25f, zAngle * -0.5f + new Degree(90), zAngle); Gizmos.DrawWireArc(Vector3.Zero, Vector3.YAxis, 0.25f, yAngle * -0.5f + new Degree(90), yAngle); Gizmos.Color = Color.Red; Radian remainingZAngle = new Degree(360) - zAngle; Radian remainingYAngle = new Degree(360) - yAngle; Gizmos.DrawWireArc(Vector3.Zero, Vector3.ZAxis, 0.25f, zAngle * 0.5f + new Degree(90), remainingZAngle); Gizmos.DrawWireArc(Vector3.Zero, Vector3.YAxis, 0.25f, yAngle * 0.5f + new Degree(90), remainingYAngle); } else { Gizmos.Color = Color.Green; Gizmos.Transform = joint.SceneObject.WorldTransform; Gizmos.DrawWireDisc(Vector3.Zero, Vector3.ZAxis, 0.25f); Gizmos.DrawWireDisc(Vector3.Zero, Vector3.YAxis, 0.25f); } }
/// <summary> /// Updates all GUI elements from current values in the joint. /// </summary> /// <param name="joint">Joint to update the GUI from.</param> protected void Refresh(SphericalJoint joint) { if (enableLimitField.Value != joint.EnableLimit) { enableLimitField.Value = joint.EnableLimit; ToggleLimitFields(joint.EnableLimit); } limitGUI.Limit = joint.Limit; base.Refresh(joint); }