/// <summary>
        /// ボーンを指定したフレーム番号の姿勢に更新する
        /// </summary>
        /// <param name="frameNumber">フレーム番号</param>
        public void ReviseBone(ulong frameNumber)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData pastFrame, futureFrame;
            frameManager.現在のフレームの前後のキーフレームを探して返す(frameNumber, out pastFrame, out futureFrame);
            var pastBoneFrame   = (BoneFrame)pastFrame;
            var futureBoneFrame = (BoneFrame)futureFrame;

            // 現在のフレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する
            float s = (pastBoneFrame.frameNumber == futureBoneFrame.frameNumber) ? 0 :
                      (float)(frameNumber - pastBoneFrame.frameNumber) / (float)(futureBoneFrame.frameNumber - pastBoneFrame.frameNumber);                 // 進行度
            BezInterpolParams p = pastBoneFrame.interpolParameters;
            float             s_X, s_Y, s_Z, s_R;

            if (p != null)
            {
                s_X = BezEvaluate(p.X1, p.X2, s);
                s_Y = BezEvaluate(p.Y1, p.Y2, s);
                s_Z = BezEvaluate(p.Z1, p.Z2, s);
                s_R = BezEvaluate(p.R1, p.R2, s);                   // ペジェ変換後の進行度
            }
            else
            {            //ベジェ曲線のパラメータがないときは線形補完の量としてsを利用する
                s_X = s_Y = s_Z = s_R = s;
            }
            // ボーンを更新する
            bone.移動 = new SharpDX.Vector3(
                CGHelper.Lerp(pastBoneFrame.position.x, futureBoneFrame.position.x, s_X),
                CGHelper.Lerp(pastBoneFrame.position.y, futureBoneFrame.position.y, s_Y),
                CGHelper.Lerp(pastBoneFrame.position.z, futureBoneFrame.position.z, s_Z));
            bone.回転 = SharpDX.Quaternion.Slerp(pastBoneFrame.rotation.ToSharpDX(), futureBoneFrame.rotation.ToSharpDX(), s_R);
        }
示例#2
0
        public float 指定したフレームにおけるモーフ値を取得する(float フレーム)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData 前フレーム, 後フレーム;

            _frameManager.現在のフレームの前後のキーフレームを探して返す(フレーム, out 前フレーム, out 後フレーム);

            var pastMorphFrame   = (モーフフレーム)前フレーム;
            var futureMorphFrame = (モーフフレーム)後フレーム;

            // 現在のフレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する
            float s = (futureMorphFrame.フレーム番号 == pastMorphFrame.フレーム番号) ? 0 :
                      (float)(フレーム - pastMorphFrame.フレーム番号) / (float)(futureMorphFrame.フレーム番号 - pastMorphFrame.フレーム番号);                 // 進行度

            return(CGHelper.Lerp(pastMorphFrame.モーフ値, futureMorphFrame.モーフ値, s));
        }
示例#3
0
        public float 指定したフレームにおけるモーフ値を取得する(ulong フレーム)
        {
            // 現在のフレームの前後のキーフレームを探す
            MMDFileParser.IFrameData 前フレーム, 後フレーム;

            _frameManager.現在のフレームの前後のキーフレームを探して返す(フレーム, out 前フレーム, out 後フレーム);

            var pastMorphFrame   = (MorphFrame)前フレーム;
            var futureMorphFrame = (MorphFrame)後フレーム;

            // 現在のフレームの前後キーフレーム間での進行度を求める
            float s = (futureMorphFrame.frameNumber == pastMorphFrame.frameNumber) ? 0 :
                      (float)(フレーム - pastMorphFrame.frameNumber) / (float)(futureMorphFrame.frameNumber - pastMorphFrame.frameNumber);                 // 進行度

            // 線形補完で値を求める
            return(CGHelper.Lerp(pastMorphFrame.value, futureMorphFrame.value, s));
        }
示例#4
0
        private void _フレームを更新する(カメラフレーム cameraFrame1, カメラフレーム cameraFrame2, カメラ camera, 射影 projection, float 進行度合い0to1)
        {
            float ProgX = cameraFrame1.ベジェ曲線[0].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);
            float ProgY = cameraFrame1.ベジェ曲線[1].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);
            float ProgZ = cameraFrame1.ベジェ曲線[2].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);
            float ProgR = cameraFrame1.ベジェ曲線[3].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);
            float ProgL = cameraFrame1.ベジェ曲線[4].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);
            float ProgP = cameraFrame1.ベジェ曲線[5].横位置Pxに対応する縦位置Pyを返す(進行度合い0to1);

            // カメラ(ビュー)

            camera.移動する(
                注視点からの距離: CGHelper.Lerp(cameraFrame1.距離, cameraFrame2.距離, ProgL),
                注視点の位置: CGHelper.ComplementTranslate(cameraFrame1, cameraFrame2, new Vector3(ProgX, ProgY, ProgZ)),
                回転: CGHelper.ComplementRotateQuaternion(cameraFrame1, cameraFrame2, ProgR));

            // 射影

            float angle = CGHelper.Lerp(cameraFrame1.視野角, cameraFrame2.視野角, ProgP);

            projection.視野角rad = CGHelper.ToRadians(angle);
        }