// カメラクラス //
class C3DCamera{
D3DXVECTOR3 vEyePt;
D3DXVECTOR3 vLookatPt;
D3DXVECTOR3 vUpVec;
D3DXMATRIXA16 matView;
public:
// カメラの初期姿勢をセットする
// (モデルが(0,0,0)にある時のカメラ姿勢)
// モデルが移動する場合は↓のGetViewMatrix()のパラメーターで移動する
C3DCamera ( D3DXVECTOR3 eye, D3DXVECTOR3 look, D3DXVECTOR3 up )
: vEyePt(eye),vLookatPt(look),vUpVec(up){
}
////////////////////////////////////////////////////////////
// x,y,x : 映したいモデルの移動座標
// rx, ry, rz : カメラの回転(ラジアン・D3DX_PI*2で1周)
// zoom : ズーム
////////////////////////////////////////////////////////////
D3DXMATRIX* GetViewMatrix ( float x=0, float y=0, float z=0, float rx=0, float ry=0, float rz=0, float zoom=1.0 ){
D3DXMATRIX matCamera, matCZoom, matCRot, matCPos;
D3DXVECTOR3 eye, look, up;
D3DXMatrixScaling ( &matCZoom, zoom, zoom, zoom ) ;
D3DXMatrixRotationYawPitchRoll ( &matCRot, ry, rx, rz ) ;
D3DXMatrixTranslation ( &matCPos, x, y, z ) ;
matCamera = matCZoom*matCRot*matCPos ;
return D3DXMatrixLookAtLH(
&matView,
D3DXVec3TransformCoord(&eye, &vEyePt, &matCamera ),
D3DXVec3TransformCoord(&look, &vLookatPt, &matCamera ),
D3DXVec3TransformNormal(&up, &vUpVec, &matCamera ));
}
////////////////////////////////////////////////////////////////////
// FPS視点の場合は
// 3Dモデルのワールド行列を直接突っ込んだ方が楽かもしれない
////////////////////////////////////////////////////////////////////
D3DXMATRIX* GetViewMatrix ( const D3DXMATRIX* matWorld ){
D3DXVECTOR3 eye, look, up;
return D3DXMatrixLookAtLH(
&matView,
D3DXVec3TransformCoord(&eye, &vEyePt, matWorld ),
D3DXVec3TransformCoord(&look, &vLookatPt, matWorld ),
D3DXVec3TransformNormal(&up, &vUpVec, matWorld ));
}
} ;
----------------------------------------------------------------------------------------
// 使用例
// TPS視点
C3DCamera tps_camera(D3DXVECTOR3(0.0f,3.0f,-5.0f), D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,1.0f,0.0f)) ;
//3Dモデルを中心に(Y軸で)カメラを回転させる
static float ry = 0.0f ;
ry += (D3DX_PI/180);
Device->SetTransform( D3DTS_VIEW, tps_camera.GetViewMatrix(0, 0, 0, 0, ry, 0, 1.0f) );
// FPS視点
D3DXMATRIX matWorld; // 3Dモデルの"計算済み"ワールド行列
C3DCamera fps_camera(D3DXVECTOR3(0.0f,0.0f,0.0f), D3DXVECTOR3(0.0f,0.0f,1.0f), D3DXVECTOR3(0.0f,1.0f,0.0f)) ;
Device->SetTransform( D3DTS_VIEW, fps_camera.GetViewMatrix(&matWorld) );