3D変換行列を自分でやる
DirectXの行列による変換は、普通IDirect3DDevice9::SetTransform()を使って
自動で行っているが、この仕組みを使わずに頂点変換するには、
world変換 * view変換 * projection変換
を、頂点に掛けることでできる。
// テストコード #include <stdio.h> #include <windows.h> #include <d3d9.h> #include <d3dx9.h> VOID SetupMatrices(D3DXMATRIX &mat) { D3DXMatrixIdentity(&mat); D3DXMATRIX matWorld; D3DXMatrixIdentity(&matWorld); mat *= matWorld; D3DXVECTOR3 vEyePt( 0.0f, 0.0f, 100.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMATRIX matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); mat *= matView; D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f ); mat *= matProj; } main() { D3DXMATRIX mat; SetupMatrices(mat); D3DXVECTOR3 vec; D3DXVec3TransformCoord(&vec, &D3DXVECTOR3(-40, -40, 0), &mat); printf("%f, %f %f\n", vec.x, vec.y, vec.z); }
X=40 Y=40 画面で見た場合 左上に点が出た vecの値 -0.965685, 0.965685 0.990991 X=-40 Y=-40 画面で見た場合 右下に点が出た vecの値 0.965685, -0.965685 0.990991
- 1より小さい場合や、1より大きい場合は画面外だった
zの値は前後を判定する為に使用する。
wは不明
+ ┃y ┃ ┃ ┃ ┃ ┃ ┃ ┃ ━━━━━━━━╋━━━━━━━━x + ┃ - ┃ ┃ ┃ - ┃