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