DirectX再々入門(View-Projection-World)

Direct3Dがよく分からなくなったので、
自分のためのメモ書き。

メンバ変数

// マトリクス
struct View // カメラの配置
{
	D3DXVECTOR3 pos;    // カメラ座標
	D3DXVECTOR3 lookat; // 注視点
	D3DXVECTOR3 up;     // 傾き
};
View       m_viewP;
D3DXMATRIX m_view;
struct Proj // カメラのパラメータ
{
	float angle;  // カメラの画角
	float aspect; // アスペクト比
	float near;   // nearプレーン
	float far;    // farプレーン
};
Proj       m_projP;
D3DXMATRIX m_proj

D3DXMATRIX m_world;


// メッシュ
LPD3DXMESH   m_pMesh
LPD3DXBUFFER m_pD3DXMtrlBuffer
DWORD        m_numMesh
// ライト
D3DLIGHT   m_light;
D3DVECTOR3 m_lightDir;

メッシュ読み込み

D3DXLoadMeshFromX(
	filepath,
	D3DXMESH_SYSTEMMEN,
	pD3DDevice,
	NULL,
	&m_pD3DXMtrlBuffer,
	NULL,
	&m_numMesh,
	&m_pMesh);

ライト

ZeroMemory(&m_light, sizeof(D3DLIGHT9));
m_light.Type      = D3DLIGHT_DIRECTIONAL;
m_light.Diffuse.r = 1.0f;
m_light.Diffuse.g = 1.0f;
m_light.Diffuse.b = 1.0f;
m_lightDir = D3DXVECTOR3(-0.5f, -0.5f, 1.0f);
D3DXVec3Normalize((D3DXVECTOR3*)&m_light.Direction, m_lightDir)
pD3DDevice->SetLight(0, &m_light);
pD3DDevice->LightEnable(0, TRUE);
pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE)

ビューマトリクスの設定

m_viewP.pos    = D3DXVECTOR3( 0.0f, 0.0f, -12.0f);
m_viewP.lookat = D3DXVECTOR3( 0.0f, 0.0f, 0.0f);
m_viewP.up     = D3DXVECTOR3( 0.0f, 1.0f, 0.0f));
D3DXMatrixIdentity(&m_view); // 単位行列に初期化
D3DXMatrixLookAtLH(
	&m_view,
	&m_viewP.pos,
	&m_viewP.lookat,
	&m_viewP.up);
pD3DDevice->SetTransform(D3DTS_VIEW, &m_view);

射影マトリクスの設定

D3DVIEWPORT9 vp;
if(FAILED(pD3DDevice->GetViewport(&vp))) return;
m_projP.aspect = (float)vp.Width / (float)vp.Height;
m_projP.near   = 1.0f;
m_projP.far    = 1000.0f;
D3DXMatrixIdentity(&m_proj); // 単位行列に初期化
D3DXMatrixPerspectiveFovLH(
	&m_proj,
	D3DXToRadian(m_projP.angle),
	m_projP.aspect,
	m_projP.near,
	m_projP.far);
);
pD3DDevice->SetTransform(D3DTS_PROJECTION, &m_proj);

モデルの描画

D3DXMatrixIdentity(&m_world); // 単位行列に初期化
pD3DDevice->SetTransform(D3DTS_WORLD, &m_world);
 
D3DMATERIAL9 mMaterial;
D3DXMATERIAL *pD3DXMaterials = (D3DXMATERIAL*)m_pD3DXMtrlBuffer->GetBufferPointer();
for(DWORD i = 0; i < m_numMesh; i++)
{
	mMaterial = pD3DXMaterials[i].MatD3D;
	pD3DDevice->SetMaterial(&mMaterial);
	m_pMesh->DrawSubset(i);
}

オブジェクトの破棄

SAFE_RELEASE(m_pD3DXMtrlBuffer);
SAFE_RELEASE(m_pMesh);