您的位置:首页 > 其它

D3D9 Samples(3)--Matrices

2013-09-10 11:51 246 查看
 

 

 

D3D9 Sample(3)—Matrices
 

 

 

       打开Tutorial 3: Matrices项目,编译后运行,界面如下:

 



 

       我们看到一个旋转的三角形,这个例子主要演示顶点的坐标转换。建立在上个例子Tutorial 2: Vertices的基础上,所以这里只看坐标转换那部分。绘制的每一帧都会设置下面几个矩阵:

SetupMatrices

设置世界(world)、视角(view)、投影(projection)变换矩阵。

 

 

 

1. 世界矩阵(world matrix)

 

D3DXMATRIXA16matWorld;
UINTiTime =timeGetTime() % 1000;
FLOATfAngle =iTime * ( 2.0f * D3DX_PI ) / 1000.0f;
D3DXMatrixRotationY( &matWorld,fAngle );
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld );

 

每次进入这里,都会让三角形的世界坐标系绕Y轴旋转fAngle角度。

 

世界变换(world transform),就是将模型根据世界矩阵转换到在世界坐标系中的位置、朝向和大小。固定管道中我们只要SetTransform设置世界矩阵,固定管道会做世界变换。而如果我们启用vertex shader,那么世界变换的计算应该由我们在shader代码中完成。

 

 

 

2. 观察矩阵(view matrix)

 

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

 

视角坐标系需要三个因素来确定:“眼睛”所在的坐标,目标点的坐标,向上的向量。

 

观察转换(view transform),无论世界中有多少模型元素,只有进入观察坐标系范围的才是最终需要显示的,所以根据观察矩阵,计算进入观察坐标系的模型。

 

 

 

3. 投影矩阵(projection matrix)

D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 800.0f/600.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );

 

D3DXMATRIX* D3DXMatrixPerspectiveFovLH(
_Inout_  D3DXMATRIX *pOut,
_In_     FLOAT fovy,
_In_     FLOAT Aspect,
_In_     FLOAT zn,
_In_     FLOAT zf );

 

投影矩阵是以观察坐标系作为标准。如下图:

 



 

fovy 是view区域在Y轴(观察坐标系)上的范围,单位为弧度。

Aspect 是截头体的纵横比,一般设为视口的宽度高度比,D3D9默认视口就是整个窗口,所以设为窗口的宽度高度比。

zn、zf分别是截头体近平面和远平面距离摄像机的距离。

 

投影转换(projection transform),把“世界”通过观察矩阵运算后,进入观察坐标系的模型也不是全部都显示,还需要一个范围,这个范围就是一个类似没有顶的金字塔,通常叫平截头体(Frustum),如下图:

 



 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Direct3D9 3D