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
      +               ┃              -
                      ┃
                      ┃
                      ┃
                    - ┃