トップページ > 過去ログ > 記事閲覧
カメラのvmdについて
名前:zonbun 日時: 2010/12/12 23:55

そのまま使うこと可能でしょうか?

Page: 1 |

Re: カメラのvmdについて ( No.1 )
名前:管理人 日時:2012/11/23 20:13

ご返信が遅くなり申し訳ありません カメラアニメーションが入ったVMDをそのまま使うことはできませんでしたので、 少しDXライブラリに手を加えて使えるようにしてみました よろしければその手を加えたバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) ただ、まだDXライブラリにおけるカメラアニメーションについての仕様は確定していませんので 専用の機能を今回はまだ用意していません 今回追加した機能でモデルのアニメーションと一緒にカメラのアニメーションを再生するプログラムを 組んでみましたので、よろしければご覧になってください m(_ _)m 下記のプログラムは、初音ミク.pmd というモデルファイルと 初音ミク000.vmd というモデルの アニメーションファイルと Camera.vmd というカメラのアニメーションだけを保存した vmd ファイル ( MikuMikuDance で「カメラフレーム全て選択」をした状態で「モーションデータ保存」したもの )が あることを想定しています 今回はカメラのアニメーションだけの vmd ファイルを単体で読み込めるようにしたのと、 アニメーションキーの値を時間指定で取得するための関数を追加しました 専用の機能は用意しませんでしたが、カメラのモーションからカメラの設定を行うのは サンプル中の SetupVMDCameraMotionParam を使うことで実現しています #include "DxLib.h" #define PI 3.1415926535897932384626433832795f // VMDカメラモーションからカメラのパラメータを抽出してDXライブラリの設定に反映させる void SetupVMDCameraMotionParam( int CameraHandle, float Time ) { MATRIX VRotMat, HRotMat, MixRotMat, TwistRotMat ; VECTOR CamLoc, CamDir, CamUp ; VECTOR Location, Rotation ; float Length, ViewAngle ; // カメラの注視点を取得 Location = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 0, Time ) ; // カメラの回転値を取得 Rotation = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 1, Time ) ; // カメラの注視点までの距離の符号を逆転したものを取得 Length = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 2, Time ) ; // カメラの視野角を取得 ViewAngle = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 3, Time ) ; // 垂直方向の回転行列を取得 VRotMat = MGetRotX( -Rotation.x ) ; // 水平方向の回転行列を取得 HRotMat = MGetRotY( -Rotation.y ) ; // 垂直方向の回転行列と水平方向の回転行列を合成 MixRotMat = MMult( VRotMat, HRotMat ) ; // カメラの向きを算出 CamDir = VTransform( VGet( 0.0f, 0.0f, 1.0f ), MixRotMat ) ; // 捻り回転行列を取得 TwistRotMat = MGetRotAxis( CamDir, -Rotation.z ) ; // 捻り回転行列を合成行列に合成 MixRotMat = MMult( MixRotMat, TwistRotMat ) ; // カメラの上方向の向きを算出 CamUp = VTransform( VGet( 0.0f, 1.0f, 0.0f ), MixRotMat ) ; // カメラの座標を算出 CamLoc = VTransform( VGet( 0.0f, 0.0f, Length ), MixRotMat ) ; CamLoc = VAdd( CamLoc, Location ) ; // カメラの注視点を算出 Location = VAdd( CamLoc, CamDir ) ; // 視野角をセット SetupCamera_Perspective( ViewAngle / 180.0f * PI ) ; // カメラの座標と注視点と上方向をセット SetCameraPositionAndTargetAndUpVec( CamLoc, Location, CamUp ) ; } // WinMain int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle, CameraHandle, AttachAnimIndex ; float Time ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // モデルを読み込み ModelHandle = MV1LoadModel( "初音ミク_2.pmd" ) ; if(ModelHandle == -1) return -1; // カメラモーションの読み込み CameraHandle = MV1LoadModel( "Camera_2.vmd" ) ; if(CameraHandle == -1) return -1; // モデルにアニメーションをアタッチ AttachAnimIndex = MV1AttachAnim( ModelHandle, 0 ) ; // 初期設定では Near クリップが遠すぎるのでクリップの範囲を変更 SetCameraNearFar( 1.0f, 1000.0f ) ; // メインループ Time = 0.0f ; while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen(); // モーションの時間を進める( モーションの時間に到達したら0に戻す Time += 30.0f / 60.0f ; if( Time > MV1GetAttachAnimTotalTime( ModelHandle, AttachAnimIndex ) ) { Time = 0.0f ; } MV1SetAttachAnimTime( ModelHandle, AttachAnimIndex, Time ) ; // VMDカメラモーションのパラメータをDXライブラリの設定に反映させる SetupVMDCameraMotionParam( CameraHandle, Time ) ; // モデルを描画 MV1DrawModel( ModelHandle ) ; // 再生時間の表示 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Time %.1f/%.1f", Time, MV1GetAttachAnimTotalTime( ModelHandle, AttachAnimIndex ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } ( 2012/11/18 カメラの角度や注視点計算を修正、みょもさんありがとうございますm(_ _)m )
Re: カメラのvmdについて ( No.2 )
名前:zonbun 日時:2010/12/29 10:26

ありがとうございました うまく使えました!

Page: 1 |