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); }
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 }); }