private void ApplyIK(Model model)
        {
            //追加: 加速度センサONの場合に回転不変性取るよう改善
            var boneHip    = QumarionModel.Bones[StandardPSBones.Hips];
            var initPosHip = boneHip.InitialWorldMatrix.Translate;
            var posHip     = boneHip.WorldMatrix.Translate;
            //NOTE:
            var rotHipInverse = MatrixRotationDif.CreateDifFrom(
                boneHip.WorldMatrix.Rotate,
                boneHip.InitialWorldMatrix.Rotate
                ).Transpose();


            foreach (var t in _targetIKBones)
            {
                var src  = QumarionModel.Bones[QumaBone2MMDBone.GetQumaBone(t)];
                var dest = MMDStandardBones.GetBone(model, t);
                if (dest == null)
                {
                    continue;
                }

                //1: Tポーズでの Hip -> t のベクトル取得(これは直立)
                var initPosWorld = src.InitialWorldMatrix.Translate;
                var initPos      = new Vector3f(
                    initPosWorld.X - initPosHip.X,
                    initPosWorld.Y - initPosHip.Y,
                    initPosWorld.Z - initPosHip.Z
                    );
                //2: 現在の Hip -> t のベクトルを回転除去しつつ取得

                var posWorld = src.WorldMatrix.Translate;
                var pos      = new Vector3f(
                    posWorld.X - posHip.X,
                    posWorld.Y - posHip.Y,
                    posWorld.Z - posHip.Z
                    );
                //ここ大事: posのベクトルは体の回転込みの値なので逆回転して相殺
                pos = MatrixUtil.Multiply(rotHipInverse, pos);

                //NOTE: MMMではZ軸が後ろ向き正だがQumarionだと前向き正
                var dif = new Vector3(
                    pos.X - initPos.X,
                    pos.Y - initPos.Y,
                    -pos.Z + initPos.Z
                    );

                var motion = dest.CurrentLocalMotion;
                motion.Move             = dif * LegIKScaleFactor;
                dest.CurrentLocalMotion = motion;
            }
        }
        /// <summary>Qumarion側のボーン情報と親ボーンを指定してインスタンスを初期化します。</summary>
        /// <param name="bone">Qumarion側のボーン</param>
        /// <param name="boneType">Qumarion側のボーンが標準ボーンのどれに該当するか</param>
        /// <param name="parent">親ボーン(ルートのボーンを生成する場合nullを指定)</param>
        public QumaBone2MikuMikuMoving(Bone bone, StandardPSBones boneType, QumaBone2MikuMikuMoving parent)
        {
            _bone   = bone;
            _parent = parent;

            QumaBoneType = boneType;
            //StandardPSBones -> MMDBoneの対応確認
            try
            {
                MMDBone     = QumaBone2MMDBone.GetMMDBone(boneType);
                IsValidBone = true;
            }
            catch (KeyNotFoundException)
            {
                MMDBone     = MMDStandardBone.Hip;
                IsValidBone = false;
            }

            InitialRotation = CreateQuaternion(_bone.InitialLocalMatrix);

            //ゼロ回転状態での固定座標軸を参照するため親のワールド座標を確認: ルート(Hips)はワールド座標直下。
            Matrix4f initMat = (_bone.Parent != null) ?
                               _bone.Parent.InitialWorldMatrix :
                               Matrix4f.Unit;

            //疑似座標系の初期化: QumarionもMMMも右手系(左-上-前)で一緒なのでほぼそのまま使ってOK
            xAxis = new Vector3(initMat.M11, initMat.M21, initMat.M31);
            yAxis = new Vector3(initMat.M12, initMat.M22, initMat.M32);
            zAxis = new Vector3(initMat.M13, initMat.M23, initMat.M33);

            //再帰的に子ボーンを初期化。
            _childs = bone
                      .Childs
                      .Select(b => new QumaBone2MikuMikuMoving(b, StandardPSBonesUtil.GetStandardPSBone(b.Name), this))
                      .ToArray();
        }
        //モデルを接地させる(接地の定義は実装を見よ。)
        private void BoundCenterToGround(Model model)
        {
            //追加: 加速度センサONの場合に回転不変性取るよう改善
            var boneHip    = QumarionModel.Bones[StandardPSBones.Hips];
            var initPosHip = boneHip.InitialWorldMatrix.Translate;
            var posHip     = boneHip.WorldMatrix.Translate;
            //NOTE:
            var rotHipInverse = MatrixRotationDif.CreateDifFrom(
                boneHip.WorldMatrix.Rotate,
                boneHip.InitialWorldMatrix.Rotate
                ).Transpose();


            var heights = new List <float>();

            foreach (var t in _groundingIKBones)
            {
                var src  = QumarionModel.Bones[QumaBone2MMDBone.GetQumaBone(t)];
                var dest = MMDStandardBones.GetBone(model, t);
                if (dest == null)
                {
                    continue;
                }

                //1: Tポーズでの Hip -> t のベクトル取得(これは直立)
                var initPosWorld = src.InitialWorldMatrix.Translate;
                var initPos      = new Vector3f(
                    initPosWorld.X - initPosHip.X,
                    initPosWorld.Y - initPosHip.Y,
                    initPosWorld.Z - initPosHip.Z
                    );
                //2: 現在の Hip -> t のベクトルを回転除去しつつ取得

                var posWorld = src.WorldMatrix.Translate;
                var pos      = new Vector3f(
                    posWorld.X - posHip.X,
                    posWorld.Y - posHip.Y,
                    posWorld.Z - posHip.Z
                    );
                //ここ大事: posのベクトルは体の回転込みの値なので逆回転して相殺
                pos = MatrixUtil.Multiply(rotHipInverse, pos);

                //NOTE: MMMではZ軸が後ろ向き正だがQumarionだと前向き正
                var dif = new Vector3(
                    pos.X - initPos.X,
                    pos.Y - initPos.Y,
                    -pos.Z + initPos.Z
                    );

                heights.Add(dif.Y * LegIKScaleFactor);
            }
            if (heights.Count == 0)
            {
                return;
            }

            //移動差分のうちもっとも低い値を取る
            float lowestPosDif = heights.Min();
            var   centerBone   = MMDStandardBones.GetBone(model, MMDStandardBone.Center);

            if (centerBone == null)
            {
                return;
            }

            var motion = centerBone.CurrentLocalMotion;

            //CAUTION: X, Zを勝手に書き換えないように!
            motion.Move = new Vector3(motion.Move.X, -lowestPosDif, motion.Move.Z);

            centerBone.CurrentLocalMotion = motion;
        }