ご返信が遅くなり申し訳ありません
カメラアニメーションが入った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 )