示例#1
0
        public void AutoSetParameters()
        {
            AngleConstraintMB mb      = this;
            Transform         j       = mb.transform;
            Transform         jparent = j.parent;
            Transform         jchild  = mb.nextJoint;

            // decide the axis
            {
                if (jparent == null)
                {
                    mb.rotAxis = j.up;
                }
                else if (jchild == null)
                {
                    mb.rotAxis = j.up;
                }
                else
                {
                    var ppos = jparent.position;
                    var spos = j.position;
                    var cpos = jchild.position;

                    Vector3 cross = Misc.VecCross(spos, cpos, ppos, spos);
                    if (cross == Vector3.zero)
                    {
                        mb.rotAxis = j.up;
                    }
                    else
                    {
                        mb.rotAxis = cross.normalized;
                    }

                    mb.rotAxis = Misc.InverseTransformDirection(jparent, mb.rotAxis); //convert to parent space
                }
            }

            // decide the primAxis
            {
                Vector3 fwd = j.right;
                if (jparent != null)
                {
                    fwd = (j.position - jparent.position).normalized;
                }
                else if (jchild != null)
                {
                    fwd = (jchild.position - j.position).normalized;
                }
                mb.primAxis = Misc.InverseTransformDirection(jparent, fwd);
            }

            // decide the min/max limit
            {
                mb.minLimit = DEF_MINLIM;
                mb.maxLimit = DEF_MAXLIM;
            }

            mb.CalcInitData(); //calc startlocalRot
        }
示例#2
0
        // private method

        private void _OnNextJointChanged()
        {
            AngleConstraintMB mb = this;
            var nextJoint        = mb.m_nextJoint;

            if (nextJoint != null)
            {
                if (nextJoint.parent == mb.transform)
                {
                    AutoSetParameters();
                }
                else
                {
                    Dbg.CLogWarn(mb, nextJoint.name + " is not children of " + mb.name);
                    mb.m_nextJoint = null;
                }
            }
        }
        public void OnSceneGUI()
        {
            AngleConstraintMB mb = (AngleConstraintMB)target;

            if (mb == null)
            {
                return;
            }

            Transform j       = mb.transform;
            Transform jparent = j.parent;
            Transform jchild  = mb.nextJoint;

            if (jchild == null)
            {
                return;
            }

            var oldColor = Handles.color;

            float szMul = EUtil.GetHandleSize(j.position, 3f) * ms_markerSize;

            Vector3 worldRotAxis  = Misc.TransformDirection(jparent, mb.rotAxis).normalized;
            Vector3 worldPrimAxis = Misc.TransformDirection(jparent, mb.primAxis).normalized;

            float   minLimit     = mb.minLimit;
            float   maxLimit     = mb.maxLimit;
            Vector3 worldFromVec = Quaternion.AngleAxis(minLimit, worldRotAxis) * worldPrimAxis;

            Handles.color = ms_arcColor;
            Handles.DrawSolidArc(j.position, worldRotAxis, worldFromVec,
                                 maxLimit - minLimit, szMul);

            Handles.color = Color.red;
            Handles.DrawAAPolyLine(5f, j.position, j.position + worldRotAxis * szMul);  //rot axis
            Handles.color = Color.green;
            Handles.DrawAAPolyLine(5f, j.position, j.position + worldPrimAxis * szMul); //start dir

            Handles.color = oldColor;
        }
        public override void OnInspectorGUI()
        {
            AngleConstraintMB mb = (AngleConstraintMB)target;

            mb.enabled = EditorGUILayout.Toggle("Enabled", mb.enabled);

            EditorGUI.BeginChangeCheck();
            mb.nextJoint = EditorGUILayout.ObjectField("nextJoint", mb.nextJoint, typeof(Transform), true) as Transform;
            if (EditorGUI.EndChangeCheck())
            {
                EUtil.SetDirty(mb);
                EUtil.RepaintSceneView();
            }

            if (mb.nextJoint == null)
            {
                EditorGUILayout.LabelField("Set the nextJoint first...");
                return;
            }
            else
            {
                EUtil.PushGUIEnable(mb.enabled);

                GUILayout.BeginHorizontal();
                {
                    GUILayout.Space(30f);
                    if (EUtil.Button("ReInit", "decide all the parameters with default method", Color.green))
                    {
                        Undo.RecordObject(mb, "ReInit");
                        mb.AutoSetParameters();
                        EUtil.SetDirty(mb);
                        EUtil.RepaintSceneView();
                    }
                    GUILayout.Space(30f);
                }
                GUILayout.EndHorizontal();

                // min/max limit
                float min = mb.minLimit;
                float max = mb.maxLimit;
                EditorGUI.BeginChangeCheck();
                EUtil.DrawMinMaxSlider("Angle Limits", ref min, ref max, -180f, 180f);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(mb, "Modify Angle limits");
                    mb.minLimit = min;
                    mb.maxLimit = max;
                    EUtil.SetDirty(mb);
                    EUtil.RepaintSceneView();
                }

                EditorGUI.BeginChangeCheck();
                Vector3 newRotAxis  = EUtil.DrawV3P(new GUIContent("Rotation Axis", "in parent space, in world space if no parent joint"), mb.rotAxis);
                Vector3 newPrimAxis = EUtil.DrawV3P(new GUIContent("Primary Axis", "in parent space, in world space if no parent joint"), mb.primAxis);
                if (EditorGUI.EndChangeCheck())
                {
                    Undo.RecordObject(mb, "Modify Constraint parameters");
                    mb.rotAxis  = newRotAxis;
                    mb.primAxis = newPrimAxis;
                    mb.CalcInitData(); //!! recalc the startLocalRot
                    EUtil.SetDirty(mb);
                    EUtil.RepaintSceneView();
                }

                ms_showDisplaySetting = EditorGUILayout.Foldout(ms_showDisplaySetting, "Display Settings:");
                if (ms_showDisplaySetting)
                {
                    EditorGUI.BeginChangeCheck();
                    ms_markerSize = EditorGUILayout.FloatField("ArcSize", ms_markerSize);
                    ms_arcColor   = EditorGUILayout.ColorField("ArcColor", ms_arcColor);
                    if (EditorGUI.EndChangeCheck())
                    {
                        EUtil.RepaintSceneView();
                    }
                }

                EUtil.PopGUIEnable();
            }
        }