使用矩阵控制摄像机- 东临碣石- apprehensive - 和讯博客
使用矩阵控制摄像机 [转贴 2010-04-22 14:15:57]   

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

郑重声明:资讯 【使用矩阵控制摄像机- 东临碣石- apprehensive - 和讯博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——