这一次内容仍然为渲染一个基本图形,但与上次不同的是,这一次采用3D的形式,也就是说,矩阵变换工作需要自己完成。
Step 1 - Defining the World Transformation Matrix
世界变换矩阵定义了几何物体在3D模型空间内的平移、缩放和旋转,也就是位置、大小和朝向。
D3DXMATRIX matWorld; D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f ); g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
上面的代码将物体沿Y轴旋转timeGetTime()/150.0f度。
Step 2 - Defining the View Transformation Matrix
视角变换矩阵决定了视角的位置和旋转角度,也就是说,这个矩阵决定了观察的位置和角度。
D3DXVECTOR3 vEyePt ( 0.0f, 3.0f,-5.0f );
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
D3DXVECTOR3 vUpVec ( 0.0f, 1.0f, 0.0f );
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
上面的代码说明观察者在(0.0f, 3.0f, -5.0f),以(0.0f, 1.0f, 0.0f)为向上向量,望向(0.0f, 0.0f, 0.0f)。
Step 3 - Defining the Projection Transformation Matrix
投影矩阵决定3D物体如何投影到2D窗口上。
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
上面的代码说明设置FOV为0.25PI,长宽比例为1,近截面为1.0f,远截面为100.0f。
至此完成了矩阵变换工作。值得一提的是,矩阵变换应该在绘制物体前完成。如下:
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
// Setup the world, view, and projection Matrices
SetupMatrices();
// Render the vertex buffer contents
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );
// End the scene
g_pd3dDevice->EndScene();
}