예제 #1
0
        public static void BindShoulder(MSelectionList jointList = null)
        {
            if (jointList == null)
            {
                jointList = BasicFunc.GetSelectedList(MFn.Type.kJoint);
            }
            if (jointList.length != 4)
            {
                Debug.Log("please select joints");
                return;
            }

            MDagPath dag_shoulder = new MDagPath(), dag_armRoot = new MDagPath(), dag_elbow = new MDagPath(), dag_wrist = new MDagPath();

            jointList.getDagPath((uint)0, dag_shoulder);
            jointList.getDagPath((uint)1, dag_armRoot);
            jointList.getDagPath((uint)2, dag_elbow);
            jointList.getDagPath((uint)3, dag_wrist);
            //string shoulderIkName = JointProcess.AddIKHandle(dag_shoulder, dag_armRoot, JointProcess.IKSolverType.SingleChain)[0];
            MDagPath[] shoulderResult = BindIKControl(dag_shoulder, dag_armRoot, JointProcess.IKSolverType.SingleChain);
            MDagPath[] armResult      = BindIKControl(dag_armRoot, dag_wrist, JointProcess.IKSolverType.RotatePlane);

            MDagPath dag_ctl_shoulder = shoulderResult[1], dag_ctl_arm = armResult[1], dag_ctl_pole = armResult[2];

            BasicFunc.SetTransformParent(dag_ctl_arm.fullPathName, dag_ctl_shoulder.fullPathName);
            BasicFunc.SetTransformParent(dag_ctl_pole.fullPathName, dag_ctl_shoulder.fullPathName);
            BasicFunc.AddConstraint(dag_ctl_arm.fullPathName, dag_wrist.fullPathName, ConstantValue.ConstraintType.Orient);
            //MFnTransform trans_ctl_shoulder = new MFnTransform(dag_ctl_shoulder);
            //MFnTransform trans_ctl_arm = new MFnTransform(dag_ctl_arm);
            //MFnTransform trans_ctl_pole = new MFnTransform(dag_ctl_pole);

            //BasicFunc.SetTransformParent(trans_ctl_arm, trans_ctl_shoulder);
            //BasicFunc.SetTransformParent(trans_ctl_pole, trans_ctl_shoulder);
        }
예제 #2
0
        public static MDagPath[] BindIKControl(MDagPath rootDagPath, MDagPath endDagPath, JointProcess.IKSolverType iKSolverType = JointProcess.IKSolverType.RotatePlane, MDagPath ctlDagPath = null)
        {
            MFnTransform endTrans      = new MFnTransform(endDagPath);
            MDagPath     middleDagPath = MDagPath.getAPathTo(endTrans.parent(0));

            if (ctlDagPath == null)
            {
                ctlDagPath = BasicFunc.AddChildCircle(endDagPath);
                BasicFunc.UnparentTransform(ctlDagPath);
                BasicFunc.FreezeTransform(new MFnTransform(ctlDagPath));
            }


            //string resultStr = MGlobal.executeCommandStringResult("ikHandle -sj " + rootObject.fullPathName() + " -ee " + endObject.fullPathName() + " -sol ikRPsolver -n ik_" + rootObject.partialPathName() + "_" + endObject.partialPathName(),true);
            //string resultStr = MGlobal.executePythonCommandStringResult("cmds.ikHandle(sj='" + rootDagPath.fullPathName + "',ee='" + endDagPath.fullPathName + "',sol='ikRPsolver',n='ik_" + rootDagPath.partialPathName + "_" + endDagPath.partialPathName + "')");

            //[u'ik_joint1_joint4', u'effector1']
            string[] resultArr = JointProcess.AddIKHandle(rootDagPath, endDagPath, iKSolverType, ctlDagPath.fullPathName);
            MGlobal.executeCommandStringResult("pointConstraint " + ctlDagPath.fullPathName + " " + resultArr[0]);

            if (iKSolverType == JointProcess.IKSolverType.RotatePlane)
            {
                MDagPath locDagPath = AddRPIKPole(middleDagPath);
                if (locDagPath != null)
                {
                    BasicFunc.FreezeTransform(new MFnTransform(locDagPath));
                    //begin to add constriant
                    BasicFunc.AddConstraint(locDagPath.fullPathName, resultArr[0], ConstantValue.ConstraintType.PoleVector);
                    //string poleConstraintResult = MGlobal.executeCommandStringResult("poleVectorConstraint " + locDagPath.fullPathName + " " + resultArr[0]);
                    //Debug.Log(poleConstraintResult);
                    return(new MDagPath[3] {
                        BasicFunc.GetDagPathByName(resultArr[0]), ctlDagPath, locDagPath
                    });
                }
            }

            return(new MDagPath[2] {
                BasicFunc.GetDagPathByName(resultArr[0]), ctlDagPath
            });
        }