public static MMDBoneManager BuildBoneManager(MikuMikuDance.Model.Ver1.MMDModel1 model)
 {
     List<MMDBone> bones;
     List<MMDIK> iks;
     bones = new List<MMDBone>();
     iks = new List<MMDIK>();
     Matrix[] absPoses = new Matrix[model.Bones.LongLength];
     //各ボーンの絶対座標を計算
     for (long i = 0; i < model.Bones.LongLength; ++i)
     {
         Matrix.CreateTranslation((decimal)model.Bones[i].BoneHeadPos[0],
                         (decimal)model.Bones[i].BoneHeadPos[1],
                         (decimal)model.Bones[i].BoneHeadPos[2],
                         out absPoses[i]);
     }
     for (long i = 0; i < model.Bones.LongLength; ++i)
     {
         Matrix localMatrix;
         if (model.Bones[i].ParentBoneIndex != 0xffff)
         {
             Matrix parentInv;
             Matrix.Invert(ref absPoses[model.Bones[i].ParentBoneIndex], out parentInv);
             Matrix.Multiply(ref parentInv, ref absPoses[i], out localMatrix);
         }
         else
         {
             localMatrix = absPoses[i];
         }
         SQTTransform bindPose = SQTTransform.FromMatrix(localMatrix);
         Matrix inverseBindPose;
         Matrix.Invert(ref absPoses[i], out inverseBindPose);
         bones.Add(new MMDBone(model.Bones[i].BoneName, bindPose, inverseBindPose, model.Bones[i].ParentBoneIndex));
     }
     for (long i = 0; i < model.IKs.LongLength; ++i)
     {
         List<int> ikChildBones = new List<int>();
         foreach (var ikc in model.IKs[i].IKChildBoneIndex)
             ikChildBones.Add(ikc);
         iks.Add(new MMDIK(model.IKs[i].IKBoneIndex, model.IKs[i].IKTargetBoneIndex, model.IKs[i].Iterations, model.IKs[i].AngleLimit, ikChildBones));
     }
     //ボーンインデックス→ボーンオブジェクト化
     IKSetup(iks, bones);
     return new MMDBoneManager(bones, iks);
 }
        internal static MMDMotion Convert(MikuMikuDance.Motion.Motion2.MMDMotion2 input)
        {
            MMDMotion result = new MMDMotion();
            //ボーンモーションデータの変換
            MMDBoneKeyFrame[] BoneFrames = new MMDBoneKeyFrame[input.Motions.LongLength];
            for (long i = 0; i < input.Motions.LongLength; i++)
            {
                BoneFrames[i] = new MMDBoneKeyFrame();
                BoneFrames[i].BoneName = input.Motions[i].BoneName;
                BoneFrames[i].FrameNo = input.Motions[i].FrameNo;

                BoneFrames[i].Curve = new BezierCurve[4];
                for (int j = 0; j < BoneFrames[i].Curve.Length; j++)
                {
                    BezierCurve curve = new BezierCurve();
                    curve.v1 = new Vector2((float)input.Motions[i].Interpolation[0][0][j] / 128f, (float)input.Motions[i].Interpolation[0][1][j] / 128f);
                    curve.v2 = new Vector2((float)input.Motions[i].Interpolation[0][2][j] / 128f, (float)input.Motions[i].Interpolation[0][3][j] / 128f);
                    BoneFrames[i].Curve[j] = curve;
                }
                BoneFrames[i].Scales = new Vector3(1, 1, 1);
                BoneFrames[i].Location = new Vector3((decimal)input.Motions[i].Location[0], (decimal)input.Motions[i].Location[1], (decimal)input.Motions[i].Location[2]);
                BoneFrames[i].Quatanion = new Quaternion((decimal)input.Motions[i].Quatanion[0], (decimal)input.Motions[i].Quatanion[1], (decimal)input.Motions[i].Quatanion[2], (decimal)input.Motions[i].Quatanion[3]);
                BoneFrames[i].Quatanion.Normalize();
            }
            result.BoneFrames = MotionHelper.SplitBoneMotion(BoneFrames);
            //表情モーションの変換
            MMDFaceKeyFrame[] FaceFrames = new MMDFaceKeyFrame[input.FaceMotions.LongLength];
            for (long i = 0; i < input.FaceMotions.Length; i++)
            {
                FaceFrames[i] = new MMDFaceKeyFrame();
                FaceFrames[i].Rate = input.FaceMotions[i].Rate;
                FaceFrames[i].FaceName = input.FaceMotions[i].FaceName;
                FaceFrames[i].FrameNo = input.FaceMotions[i].FrameNo;
                float temp = input.FaceMotions[i].FrameNo;
            }
            result.FaceFrames = MotionHelper.SplitFaceMotion(FaceFrames);
            //カメラモーションは無視(使わんので)
            //ライトモーションは無視(使わんので)
            //変換したデータを返却
            return result;
        }