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