Пример #1
0
        public void ボーンを指定したフレームの姿勢に更新する(float 目標フレーム)
        {
            // 目標フレームの前後のキーフレームを探す

            _frameManager.現在のフレームの前後のキーフレームを探して返す(目標フレーム, out MMDFileParser.IFrameData 過去フレーム, out MMDFileParser.IFrameData 未来フレーム);

            var 過去のボーンフレーム = (ボーンフレーム)過去フレーム;
            var 未来のボーンフレーム = (ボーンフレーム)未来フレーム;


            // 目標フレームの前後キーフレーム間での進行度を求めてペジェ関数で変換する

            float 進行度合0to1 = (未来のボーンフレーム.フレーム番号 == 過去のボーンフレーム.フレーム番号) ? 0 :
                             (float)(目標フレーム - 過去のボーンフレーム.フレーム番号) / (float)(未来のボーンフレーム.フレーム番号 - 過去のボーンフレーム.フレーム番号);          // リニア

            var 移行度合 = new float[4];

            for (int i = 0; i < 4; i++)
            {
                移行度合[i] = 過去のボーンフレーム.ベジェ曲線[i].横位置Pxに対応する縦位置Pyを返す(進行度合0to1);         // リニア → ベジェ[4]
            }
            // ボーンを更新する

            _ボーン.移動 = CGHelper.ComplementTranslate(過去のボーンフレーム, 未来のボーンフレーム, new Vector3(移行度合[0], 移行度合[1], 移行度合[2]));

            _ボーン.回転 = CGHelper.ComplementRotateQuaternion(過去のボーンフレーム, 未来のボーンフレーム, 移行度合[3]);
        }
Пример #2
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);
        }