Beispiel #1
0
        public static List <CommandData> GetCommandDatas()
        {
            List <CommandData> cmdList = new List <CommandData>();

            cmdList.Add(new CommandData("绑定", "手指"));

            cmdList.Add(new CommandData("绑定", cmdStr, "bindFinger", "绑定手指控制器", () =>
            {
                BindFinger(BasicFunc.GetSelectedDagPath(0), "test", false);
            }));

            cmdList.Add(new CommandData("绑定", "旋转平面"));
            cmdList.Add(new CommandData("绑定", cmdStr, "rpik", "绑定旋转平面IK控制器", () =>
            {
                BindIKControl();
            }));
            cmdList.Add(new CommandData("绑定", cmdStr, "rpikPole", "生成极向量控制器", () =>
            {
                AddRPIKPole();
            }));

            cmdList.Add(new CommandData("绑定", "JIO"));
            cmdList.Add(new CommandData("绑定", cmdStr, "reverseFootBones", "生成反向脚部控制骨", () =>
            {
                AddReverseFootBone();
            }));
            cmdList.Add(new CommandData("绑定", cmdStr, "reverseFootRPIK", "绑定反向脚控制器", () =>
            {
                BindReverseFootRPIK();
            }));


            cmdList.Add(new CommandData("绑定", "上半身"));
            cmdList.Add(new CommandData("绑定", cmdStr, "bindBreast", "绑定上半身与腰部", () =>
            {
                BindBodySplineIK();
            }));
            cmdList.Add(new CommandData("绑定", cmdStr, "bindShoulder", "绑定人类肩膀-手臂", () =>
            {
                BindShoulder();
            }));


            cmdList.Add(new CommandData("绑定", "面部"));
            cmdList.Add(new CommandData("绑定", cmdStr, "bindTongue", "绑定花京院型舌头", () =>
            {
                //BindReverseFootRPIK();
            }));
            cmdList.Add(new CommandData("绑定", cmdStr, "bindSight", "绑定平视控制器", () =>
            {
                //BindReverseFootRPIK();
            }));
            cmdList.Add(new CommandData("绑定", cmdStr, "createJointCTLs", "根据骨骼位置创建控制器阵列", () =>
            {
                AddBonesCTL();
            }));

            return(cmdList);
        }
Beispiel #2
0
        public static MDagPath AddRPIKPole(MDagPath middleDagPath = null)
        {
            if (middleDagPath == null)
            {
                middleDagPath = BasicFunc.GetSelectedDagPath(0);
                if (middleDagPath == null)
                {
                    Debug.Log("please select middle joint");
                    return(null);
                }
            }

            MDagPath   rootDagPath = new MDagPath(), endDagPath = new MDagPath();
            MFnIkJoint middleJoint = new MFnIkJoint(middleDagPath);

            if (middleJoint.parentCount > 0)
            {
                MDagPath.getAPathTo(middleJoint.parent(0), rootDagPath);
                MFnIkJoint rootJoint = new MFnIkJoint(rootDagPath);
                if (middleJoint.childCount > 0)
                {
                    MDagPath.getAPathTo(middleJoint.child(0), endDagPath);
                    MFnIkJoint endJoint  = new MFnIkJoint(endDagPath);
                    MVector    rootPos   = rootJoint.getTranslation(MSpace.Space.kWorld);
                    MVector    middlePos = middleJoint.getTranslation(MSpace.Space.kWorld);
                    MVector    endPos    = endJoint.getTranslation(MSpace.Space.kWorld);


                    //double len0 = (middlePos - rootPos).length;
                    //double len1 = (endPos - middlePos).length;

                    MVector fitLinePos            = (rootPos + endPos) * 0.5;
                    MVector direct_pole           = middlePos - fitLinePos;
                    MVector direct_fitLine        = rootPos - endPos;
                    MVector direct_projectPolePos = BasicFunc.VerticalProject(direct_pole, direct_fitLine).normal;

                    //MVector nmPos = (rootPos * len0 + endPos * len1) * (1 / (len0 + len1));
                    float   factor  = (float)((rootPos - endPos).length / 3);
                    MVector polePos = factor * direct_projectPolePos + middlePos;

                    string locName = "loc_" + rootJoint.name + "_" + endJoint.name;
                    return(BasicFunc.CreateLocator(polePos, locName));
                }
            }
            return(null);
        }