アニメーションの作り方はMMDで二つのモデルを読み込み、出力は別々にしています。
そのためローカル座標内の比率は共有しております。
AからBに会話をした時にこのアニメーションを再生しているのですが、会話をした位置によってAの座標が変化してしまい困っております。
再生前に
//モーションのため相手の位置を代入
A_Pos = B_Pos;
//向きを合わせる
VECTOR B_Rot = MV1GetRotationXYZ( B_Handle );
MV1SetRotationXYZ( A_ModelHandle, B_Rot);
デバッグで確認した所、AとBの座標はアニメーション中もずっと同じでした。
またAにオブジェクト(剣など)が付属しているのですが、このオブジェクトも上記処理でAと位置、向きを同じにしております。
しかしこのオブジェクトはアニメーション中Aに付随せずに、ちゃんとアニメーション作成時に設定した位置にいます。
デバッグで確認してもAと同じ座標でした。
かなり不可解なのですが、モデルを描画する際に座標以外に描画位置が切り替わる事があるのでしょうか?
二点目はカメラモーションの読み込みについてです。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... st&no=2084
こちらを元に組んだのですが、
MATRIX VRotMat, HRotMat, MixRotMat, TwistRotMat ;
VECTOR CamLoc, CamDir, CamUp ;
VECTOR Location, Rotation ;
float Length, ViewAngle ;
// カメラの注視点を取得
Location = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 0, Time ) ;
//モデルの拡大率分スケールする
const float ZOOM_SIZE = 15.0f;
Location = VScale(Location,ZOOM_SIZE);
//拡大行列の取得
MATRIX ScaleMat = MGetScale( VGet( ZOOM_SIZE,ZOOM_SIZE,ZOOM_SIZE) );
// カメラの回転値を取得
Rotation = MV1GetAnimKeyDataToVectorFromTime( CameraHandle, 1, Time ) ;
// カメラの注視点までの距離の符号を逆転したものを取得
Length = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 2, Time ) ;
Length *= ZOOM_SIZE;
// カメラの視野角を取得
ViewAngle = MV1GetAnimKeyDataToLinearFromTime( CameraHandle, 3, Time ) ;
// 垂直方向の回転行列を取得
VRotMat = MGetRotX( -Rotation.x ) ;
// 水平方向の回転行列を取得
HRotMat = MGetRotY( -Rotation.y ) ;
// 垂直方向の回転行列と水平方向の回転行列を合成
MixRotMat = MMult( VRotMat, HRotMat ) ;
//拡大
//MixRotMat = MMult( MixRotMat, ScaleMat ) ;
// カメラの向きを算出
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 );
//Aに座標をあわせる
CamLoc = VAdd(CamLoc,A_Pos);
// カメラの注視点を算出
Location = VAdd( CamLoc, CamDir ) ;
// 視野角をセット
SetupCamera_Perspective( ViewAngle / 180.0f * DX_PI_F ) ;
// カメラの座標と注視点と上方向をセット
SetCameraPositionAndTargetAndUpVec( CamLoc, Location, CamUp ) ;
しかしこれだと思ったよりもカメラの動きによるカメラ位置の変化が大きすぎる結果となってしまいました。
(カメラの座標自体はそこそこ正しいのですが)
どの様に修正したら宜しいのでしょうか・・・?
正直な所どなたかに実際のソースコードを見て頂きたいのですが、モデルなどの兼ね合いで公開する訳にもいかず心底困っておりますorz