예제 #1
0
        public static MFnIkJoint[] AddReverseFootBone(MDagPath rootDagPath, MDagPath middleDagPath, MDagPath endDagPath)
        {
            //啊啊
            //*reverseBones = new MDagPath[8];
            MFnIkJoint[] result = new MFnIkJoint[8];

            MFnIkJoint rootJoint = new MFnIkJoint();
            MVector    rootPos   = new MFnTransform(rootDagPath).getTranslation(MSpace.Space.kWorld);
            MVector    middlePos = new MFnTransform(middleDagPath).getTranslation(MSpace.Space.kWorld);
            MVector    endPos    = new MFnTransform(endDagPath).getTranslation(MSpace.Space.kWorld);
            //Debug.Log("root:" + BasicFunc.ToCMDSParamStr(rootPos) + " middle:" + BasicFunc.ToCMDSParamStr(middlePos) + " end:" + BasicFunc.ToCMDSParamStr(endPos));

            MObject jt_ankle_Object = rootJoint.create();

            result[0] = new MFnIkJoint(MDagPath.getAPathTo(jt_ankle_Object));
            result[0].setTranslation(rootPos, MSpace.Space.kWorld);

            MObject jt_heel_Object = rootJoint.create(jt_ankle_Object);

            result[1] = new MFnIkJoint(MDagPath.getAPathTo(jt_heel_Object));
            result[1].setTranslation(new MVector(rootPos.x, endPos.y, rootPos.z), MSpace.Space.kWorld);

            MObject jt_side_Object = rootJoint.create(jt_heel_Object);

            result[2] = new MFnIkJoint(MDagPath.getAPathTo(jt_side_Object));
            MVector footDirect   = endPos - middlePos;
            MVector middleGround = new MVector(middlePos.x, endPos.y, middlePos.z);
            MVector offset       = BasicFunc.Cross(footDirect, new MVector(0, 0.6, 0));

            offset *= Math.Sign(BasicFunc.Dot(middleGround, offset));
            //float sideFactor = (float)(0.6 * (middlePos - endPos).length / Math.Abs(middlePos.z));
            result[2].setTranslation(middleGround + offset, MSpace.Space.kWorld);

            MObject jt_front_Object = rootJoint.create(jt_side_Object);

            result[3] = new MFnIkJoint(MDagPath.getAPathTo(jt_front_Object));
            result[3].setTranslation(endPos, MSpace.Space.kWorld);

            MObject jt_middleF_Object = rootJoint.create(jt_front_Object);

            result[4] = new MFnIkJoint(MDagPath.getAPathTo(jt_middleF_Object));
            result[4].setTranslation(middlePos, MSpace.Space.kWorld);

            MObject jt_middleB_Object = rootJoint.create(jt_front_Object);

            result[5] = new MFnIkJoint(MDagPath.getAPathTo(jt_middleB_Object));
            result[5].setTranslation(middlePos, MSpace.Space.kWorld);

            MObject jt_toe_Object = rootJoint.create(jt_middleF_Object);

            result[6] = new MFnIkJoint(MDagPath.getAPathTo(jt_toe_Object));
            result[6].setTranslation(endPos, MSpace.Space.kWorld);

            MObject jt_ankleIn_Object = rootJoint.create(jt_middleB_Object);

            result[7] = new MFnIkJoint(MDagPath.getAPathTo(jt_ankleIn_Object));
            result[7].setTranslation(rootPos, MSpace.Space.kWorld);

            Debug.Log("create joints ok");

            return(result);
        }