3Dゲーム関連
3Dゲーム制作関連の書籍を読むと内積の計算が出てきます。
数学が得意ではない自分にとって、どうして内積を求める必要があるのかわかりませんでした。
内積はどんな時に使うのかを理解していな状態でした。
ベクトルってなんなの?って状態でした。
やっぱり理解するためには、図に描いて値を正確に把握する必要があります。本を読んで、関数をコピーして、なんとなく使えば、それらしいグラフィックは描けます。
だけれども、オリジナリティー溢れるゲームを作る場合には、やっぱり自分で計算式を作れるようにならないと話になりません。
僕が勉強している時に、思いついた事を書いています。
これから、アルゴリズムを勉強しようと思っている方の役に立てれば幸いです。
■内積
参考書や広辞苑で内積の定義を調べてみると、「二つのベクトルA,Bのなす角をΘとするとき、ABcosΘをA,Bの内積という。ふつうA・Bと表す。ゼロベクトルでない二つのベクトルが直行するための必要条件は、それらの内積が0となる事である。スカラー積」とあります。
この短い定義で、本当に重要なことがいくつも見つかります。
二つのベクトルから角度が求めらるので、例えば物体が視野内にあるかを判定できます。
DirectXでよく利用するAPIをまとめてみました。
■D3DXVECTOR3
使用例)
D3DXVECTOR3(0.0f, 0.0f, 1.0f);
ベクトルの生成。パラメータで指定されたx,y,zに基づいたベクトルを生成する。
ベクトル同士の演算は普通に可能です。
使用例)
D3DXVECTOR3(1.0f, 2.0f, 3.0f) + D3DXVECTOR3(4.0f, 5.0f, 6.0f);
■D3DXMatrixIdentity
何もしないマトリックスを生成します。
マトリックスの初期化って意外と面倒なので、よく使うと思います。
使用例)
D3DXMatrixIdentity(&matWorld);
■D3DXMatrixLookAtLH
カメラを制御するマトリックスは2種類あります。カメラの位置を管理するマトリックスと、フォーカスを制御するマトリックスです。
この関数はカメラの位置を算出するマトリックスになります。具体的な利用方法は、以下のように利用します。
D3DXMatrixLookAtLHの第一引数に設定されたマトリックスに値が設定されます。
D3DXVECTOR3 vecCamera(0.0f,0.0f,-50.0f); //カメラ座標
D3DXVECTOR3 vecDir(0.0f,0.0f,0.0f); //カメラの見ている方向
D3DXMATRIX matWorld; //ワールド座標のマトリックス
D3DXMATRIX matProj; //カメラの投影座標のマトリックス
D3DXMATRIX matView; //カメラ座標のマトリックス
D3DXVECTOR3 vecAt = D3DXVECTOR3(0.0f, 0.0f, 1.0f) + vecCamera; //カメラの位置から常に奥の位置を見ている
D3DXMatrixLookAtLH(&matView, &vecCamera, &vecAt, &D3DXVECTOR3(0,1,0));
■D3DXVec3Unproject
画面でマウスクリックした座標を取得する場合に利用します。通常行う演算の逆行列を生成してくれると考えればいいと思います。
D3DVIEWPORT9 vp;
D3DXVECTOR3 vecMouse
POINT pt;
pDevice->GetViewport(&vp);
GetCursorPos(&pt);
D3DXVec3Unproject(&vecMouse, &D3DXVECTOR3((float)pt.x, (float)pt.y, 0), &vp, &matProj, &matView, &matWorld);
■D3DXMatrixRotationYawPitchRoll
X軸、Y軸、Z軸の回転を同時に行う場合に利用します。注意することは、各パラメータはベクトルで指定して、マトリックスを取得するということです。
そのため、回転後に移動をする場合には、マトリックスからベクトルに変換する必要があります。
ecDir.x -= D3DXToRadian(1.0f);
ecDir.y += D3DXToRadian(1.0f);
D3DXMatrixRotationYawPitchRoll(&mat, vecDir.y, vecDir.x, 0.0f);
■サンプル
■数学関連のリンク