在3D绘图的世界中,我们常用到以下三种矩阵;
一,世界矩阵...模型配置(移动/旋转/缩放)
二,视图矩阵...摄像机的位置(移动/旋转)
三,投影矩阵...摄像机的参数(视角/画面比)
在使用DirectXGraphics来进行rendering的时候,必须把这三种矩阵都设定到Rendering Pipeline去。
{dy},世界矩阵,我们在上面的模型的配置的时候已介绍过了。
第二,视图矩阵。
在DirectXGraphics中,我们用使用移动矩阵和旋转矩阵的方法,必有先在原点让摄像机产生旋转,
然后再去进行移动。这一点是和现实世界中不同的地方。
D3DXMatirxLookAtLH()提供对摄像机的位置以及被摄物的位置(注视点),以及摄像机的倾斜角度的设定。
设定之后,就会自动计算摄像机的方向,然后自动产生出配置摄像机时所需要的视图矩阵。
只要使用这个函数,像机的位置和方向了。
如下所示:
1 //声明一个视图矩阵
2 D3DXMATRIX m_view;
3
4 //产生单位矩阵
5 D3DXMatrixIdentity(&m_view);
6
7 //设定摄像机的位置和方向
8 D3DXMatrixLookAtLH(&m_view,//产生的视图矩阵
9 &D3DXVECTOR3(10.0f,5.0f,-10.0f),//摄像机位置
10 &D3DXVECTOR3(0.0f,0.0f,0.0f),//摄像机方向
11 &D3DXVECTOR3(0.0f,1.0f,0.0f),//摄像机倾斜度
12 );
13
14 //把产生的视图矩阵设置到Rendering pipeline
15 pD3DDevice->SetTransfrom(D3DTS_VIEW,&m_view);
第三,投影矩阵;
摄像机可以设定的的参数如下:
视角...................放大(Zoom in)/缩小(Zoon Out)
画面比.................rendering target的纵横比
Near plane/Far plane...前后的rendering范围(近端平面/远端平面)
首先,{dy}个视角是一种表示镜头的缩放比的参数。
要使被摄像物达到缩放的目的,可以调整此参数。
视角变小,则被摄像物变大;
视角变大,则被摄像物变小;
其次,画面比;
这个是指定Rendering target的纵横比的参数。
画面比是以宽/高的结果来指定。
所以说,当数值越大,画面的宽度就会变得比较长;
而当数据越小,则画面的高度就会变得比较长。
{zh1}一个Near plane/ Far plane是平常比较不常听到的用语。
这是在3D的空间中,把Renddering对象,限制在near与far之间进所使用的矩阵。
所以,只在在这个范围这内的物体,才会被渲染出来;
把以上三个参数组合出来,会切割出来梯形的3D空间。只有在这部分的范围才会被Rendering出来。
这个梯形区域,被称为 view Volume。
在进行rendering时,为了模型出实际世界中较近的物体看起来较大,
而较远的物体看起来较小的现象,
会把view volume变成为立方体。
这样以来,较近处的模型会被绘得较大一些;
而较远处的模型会被绘得相对较小一些。
像这种view volume变形的动作,这被称为投影转换(projection transform)
投影矩阵,就是要进行这个投影转换的时候要使用的矩阵。
在DirectXGraphics中,我们用D3DXMatrixPerspectiveFovLH()函数来产生投影矩阵。
1 //取得view Port
2 D3DVIEWPORT9 vp;
3 if(FAILED(pD3DDevice->GetViewport(&vp)))
4 {
5 return ;
6 }
7
8 //计算画面比
9 float aspect;
10 aspect = (float)vp.Width / (float)vp.Height;
11
12 //产生单位矩阵
13 D3DXMatrixIdentity(&m_proj);
14
15 //产生投影矩阵
16 D3DXMatrixPerspectiveFovLH(&m_proj,
17 D3DXTORadian(45.0f),//摄像机的视角
18 aspect ,//画面比
19 1.0f ,//Near plane
20 1000.0f );//Far plane
1 //把产生的矩阵设置到Rendering pipeline
2 pD3DDevice->SetTransfrom(D3DTS_PROJECTION,&m_proj);