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);