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