Пример #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 void BindBodySplineIK(MSelectionList jointList = null)
        {
            if (jointList == null)
            {
                jointList = BasicFunc.GetSelectedList();
            }
            //check if all of selected objects are joint
            int count = (int)jointList.length;

            if (count < 2)
            {
                return;
            }
            MDagPath dag_breastJoint = new MDagPath(), dag_hipJoint = new MDagPath();

            for (int i = 0; i < count; i++)
            {
                MDagPath jtDagPath = new MDagPath();
                jointList.getDagPath((uint)i, jtDagPath);
                if (jtDagPath != null)
                {
                    if (!jtDagPath.hasFn(MFn.Type.kJoint))
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
            }

            jointList.getDagPath((uint)(count - 1), dag_breastJoint);
            jointList.getDagPath(0, dag_hipJoint);

            MFnIkJoint     breastJoint       = new MFnIkJoint(dag_breastJoint);
            MFnIkJoint     hipJoint          = new MFnIkJoint(dag_hipJoint);
            MDagPath       dag_curve         = JointProcess.CreateJointsCurve(jointList);
            MDagPath       dag_jtctl_breast  = JointProcess.CreateJoint(breastJoint, "jtctl_breast");
            MDagPath       dag_jtctl_hip     = JointProcess.CreateJoint(hipJoint, "jtctl_hip");
            MSelectionList bindSelectionList = new MSelectionList();

            bindSelectionList.add(dag_curve);
            bindSelectionList.add(dag_jtctl_breast);
            bindSelectionList.add(dag_jtctl_hip);
            BasicFunc.Select(bindSelectionList);

            MGlobal.executeCommand("SmoothBindSkin");
            string   ikName = JointProcess.AddIKHandle(dag_hipJoint, dag_breastJoint, JointProcess.IKSolverType.Spline, dag_curve.fullPathName)[0];
            MDagPath dag_ik = BasicFunc.GetDagPathByName(ikName);

            BasicFunc.ConnectAttr(dag_jtctl_breast.fullPathName + ".rotate.rotateY", dag_ik.fullPathName + ".twist", true, true);
        }
Пример #3
0
        public static void BindNCloth(MSelectionList selecteList = null)
        {
            if (selecteList == null)
            {
                selecteList = BasicFunc.GetSelectedList();
            }
            int count = (int)selecteList.length;

            if (count <= 1)
            {
                //Debug.Log("ncloth control switch target: select [ctl,ncloth0,ncloth1...]");
                return;
            }
            else
            {
                //Debug.Log("ncloth control switch target count:" + count);
            }
            MDagPath ctlDag = new MDagPath();

            selecteList.getDagPath(0, ctlDag);
            selecteList.remove(0);
            MFnDependencyNode dn_ctl = new MFnDependencyNode(ctlDag.node);

            BasicFunc.IterateSelectedDags((dag) =>
            {
                //Debug.Log("ncloth control set for:"+dag.fullPathName);
                MPlug ctlNewAttrPlug = BindAttr.AddBoolAttr(dn_ctl, "Dynamic_" + dag.partialPathName, true, "", false);
                dag.extendToShape();
                MFnDependencyNode dn_nCloth = new MFnDependencyNode(dag.node);
                MPlug plug_isDynamic        = dn_nCloth.findPlug(ConstantValue.plugName_nCloth_isDynamic);
                MPlug plug_currentTime      = dn_nCloth.findPlug(ConstantValue.plugName_nCloth_currentTime);
                if (plug_isDynamic != null && plug_currentTime != null)
                {
                    MPlugArray inputArr_currentTime = new MPlugArray();
                    plug_currentTime.connectedTo(inputArr_currentTime, true, false);
                    MFnDependencyNode dn_time = new MFnDependencyNode(inputArr_currentTime[0].node);

                    BindAttr.ProjectPlug(plug_isDynamic, dn_time.findPlug(ConstantValue.plugName_nClothTime_nodeState), 0, 1, (int)ConstantValue.TimeNodeState.Stuck, (int)ConstantValue.TimeNodeState.Normal);
                }
                BasicFunc.ConnectPlug(ctlNewAttrPlug, plug_isDynamic);
            }, MFn.Type.kNCloth, selecteList);


            //List<string> nclothNameList = new List<string>();
            //foreach (MDagPath dag in nclothList.DagPaths())
            //{
            //    nclothNameList.Add()
            //}
        }
Пример #4
0
        public static void BindEyes(MSelectionList jointList = null)
        {
            if (jointList == null)
            {
                jointList = BasicFunc.GetSelectedList();
            }
            List <MDagPath> jointDags = new List <MDagPath>();

            for (int i = 0; i < jointList.length; i++)
            {
                MDagPath dag_joint = new MDagPath();
                jointList.getDagPath((uint)i, dag_joint);
                jointDags.Add(dag_joint);
            }
        }
Пример #5
0
        public static List <CommandData> GetCommandDatas()
        {
            List <CommandData> cmdList = new List <CommandData>();


            //cmdList.Add(new CommandData("网格", "材质"));
            cmdList.Add(new CommandData("网格", cmdStr, "printEdges", "打印所有边", () =>
            {
                BasicFunc.IterateSelectedDags((dag) =>
                {
                    dag.extendToShape();
                    MFnMesh mesh = new MFnMesh(dag);
                    CombineOverLappingEdge(mesh, 0.01f);
                }, MFn.Type.kMesh);
            }));

            cmdList.Add(new CommandData("网格", cmdStr, "realExtract", "老实地提取", () =>
            {
                ExtractFacesIntoOneObject(BasicFunc.GetSelectedList());
            }));


            return(cmdList);
        }
Пример #6
0
        public static List <MDagPath> AddBonesCTL(MSelectionList jointList = null, MFnTransform parentTrans = null)
        {
            if (jointList == null)
            {
                jointList = BasicFunc.GetSelectedList();
            }
            if (parentTrans == null)
            {
                parentTrans = new MFnTransform(BasicFunc.CreateEmptyGroup("grp_bonesCTL"));
            }
            if (jointList.length == 0)
            {
                return(null);
            }
            List <MDagPath> jointDags = new List <MDagPath>();

            for (int i = 0; i < jointList.length; i++)
            {
                MDagPath dag = new MDagPath();
                jointList.getDagPath((uint)i, dag);
                jointDags.Add(dag);
            }
            int count = jointDags.Count;

            MFnTransform[] jointTrans       = new MFnTransform[count];
            MFnTransform[] jointParentTrans = new MFnTransform[count];
            for (int i = 0; i < jointDags.Count; i++)
            {
                jointTrans[i]       = new MFnTransform(jointDags[i]);
                jointParentTrans[i] = new MFnTransform(MDagPath.getAPathTo(jointTrans[i].parent(0)));
            }
            MVector[] jointWorldPositions = new MVector[jointDags.Count];
            MVector   centerPos           = MVector.zero;

            for (int i = 0; i < count; i++)
            {
                jointWorldPositions[i] = jointTrans[i].getTranslation(MSpace.Space.kWorld);
                centerPos += jointWorldPositions[i];
            }
            centerPos = centerPos * (1.0f / count);

            double[] minDist_y = new double[count];
            double[] minDist_x = new double[count];

            if (count > 1)
            {
                for (int i = 0; i < count; i++)
                {
                    double closestY = double.MaxValue, closestX = double.MaxValue;
                    //int minDistIndex = 0;

                    for (int j = 0; j < count; j++)
                    {
                        if (i == j)
                        {
                            continue;
                        }
                        MVector direct = jointWorldPositions[i] - jointWorldPositions[j];
                        direct.x = Math.Abs(direct.x);
                        direct.y = Math.Abs(direct.y);
                        if (direct.x >= direct.y)
                        {
                            if (direct.x < closestX)
                            {
                                closestX = direct.x;
                                //minDistIndex = j;
                            }
                        }
                        if (direct.y >= direct.x)
                        {
                            if (direct.y < closestY)
                            {
                                closestY = direct.y;
                            }
                        }
                    }
                    minDist_y[i] = closestY;
                    minDist_x[i] = closestX;
                }
            }
            else
            {
                minDist_x[0] = 1;
                minDist_y[0] = 1;
            }


            List <MDagPath> curves = new List <MDagPath>();

            for (int i = 0; i < count; i++)
            {
                float        width = (float)minDist_x[i] / 2, height = (float)minDist_y[i] / 2;
                MDagPath     curve      = BasicFunc.CreateCTL_Square("ctl_" + jointDags[i].partialPathName, height, width);
                MFnTransform curveTrans = new MFnTransform(curve);
                BasicFunc.SetTransformParent(curveTrans, parentTrans);
                curveTrans.setTranslation(jointWorldPositions[i] - centerPos, MSpace.Space.kTransform);
                BasicFunc.FreezeTransform(curveTrans);
                BasicFunc.SetTranslateLimit(curveTrans, -width / 2, -height / 2, 0, width / 2, height / 2, 0);

                MPlug plug_curveTX = curveTrans.findPlug(ConstantValue.plugName_tx);
                MPlug plug_curveTY = curveTrans.findPlug(ConstantValue.plugName_ty);
                MPlug plug_jointRY = jointParentTrans[i].findPlug(ConstantValue.plugName_ry);
                MPlug plug_jointRZ = jointParentTrans[i].findPlug(ConstantValue.plugName_rz);
                BindAttr.ProjectPlug(plug_curveTX, plug_jointRY, -width / 2, width / 2, -45, 45);
                BindAttr.ProjectPlug(plug_curveTY, plug_jointRZ, -height / 2, height / 2, -45, 45);
                curves.Add(curve);
            }
            return(curves);
        }