今回はカメラワークの話です。
昨夜、3Dゲーム作成でカメラワークを作っていました。
作成内容は・・・
1・プレイヤーと一定の距離を保つ
2・カメラはプレイヤーの周りを球状に移動
の条件で今回は2を作成。
が、結果は上手く作れませんでした(T_T)
ソースは
//////////////////////////////////////
// カメラ移動
//////////////////////////////////////
void CAMERA::Move( D3DXVECTOR3 Player_Pos ){
//プレイヤーpos - カメラpos の単位化
D3DXVECTOR3 A;
D3DXVec3Normalize( &A, &( Player_Pos - Pos ) );
//カメラの基準となる単位ベクトル
D3DXVECTOR3 B = D3DXVECTOR3( 0, 1, 0 );
//ベクトルAとベクトルBの内積にてコサイン値算出
float ang = D3DXVec3Dot( &A, &B );
// 回転軸算出
D3DXVECTOR3 rot;
D3DXVec3Cross( &rot, &A, &B ) );
//回転行列作成(回転軸rotで回転量のang(コサイン値)回転)
D3DXMatrixRotationAxis( &RolMatrix, &rot, acos( ang ) );
}
//////////////////////////////////////
// カメラの座標変換
//////////////////////////////////////
void CAMERA::setCamera ( ){
matView = World ( pos, RolMat, 1 );
lpD3DDevice->SetTransform(D3DTS_VIEW, &matView)
D3DXMatrixPerspectiveFovLH (&matProj,
D3DXToRadian(45.0f),
800.0f/600.0f,
1, 500);
lpD3DDevice->SetTransform(
D3DTS_PROJECTION,
&matProj);
}
//////////////////////////////////////
// 座標変換
//////////////////////////////////////
D3DXMATRIX World (D3DVECTOR Pos,
D3DXMATRIX Rol, float Size){
D3DXMATRIX matXYZ;
D3DXMATRIX matScale;
D3DXMatrixTranslation (&matXYZ, Pos.x, Pos.y, Pos.z);
D3DXMatrixScaling (&matScale, Size, Size, Size);
return matScale * Rol * matXYZ;
}
コメントを見てもらえばわかると思いますが、Move で回転行列作成して
setCamera で反映してるんですが上手くいきませんでした・・・
それで徹夜して調べたのですが、途中から眠くて頭に入らないわ、
計算式や関数が出てこないわで、結局その日のうちに終わりませんでした・・・
翌日、クラスメイトに上記のソースを見せながら作りたいカメラワークを
説明したところ、
M君 「DirectXのヘルパー関数にあるよ」
私 「・・・え?」
心の声 「な、なんだってー!!」
要は、ググれカスってことですね、わかります
ソースは上記のsetCamera が
void CAMERA::setCamera (D3DXVECTOR3 ppos){
//この関数で解決!左手座標系ビュー行列を作成
//引数は左から、座標変換後に格納される行列、
//カメラpos 、プレイヤーpos 、カメラの基準となるpos
D3DXMatrixLookAtLH(&matView, &pos, &ppos,
&D3DXVECTOR3(0, 1, 0));
lpD3DDevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMatrixPerspectiveFovLH (&matProj,
D3DXToRadian(45.0f),
800.0f/600.0f,
1, 500);
lpD3DDevice->SetTransform(
D3DTS_PROJECTION,
&matProj);
}
になり Move 内の処理が要りません。
なんだよ~、1行で終わるじゃんよ~・・・orz
私は過去に3Dゲームを作成してきて(といっても、課題数しか完成品は無い)、
カメラワークは先生側が用意してくれたプログラムしか使用していなかったため、
勉強はしていませんでした。
でも、これで忘れずに覚えることが出来そ~
とりあえず、ポジティブに行こうぜ!!
余談ですが、
学校遅刻しました・・・
PR