狂想的天空

狂想,只要你想!

C++博客 首页 新随笔 联系 聚合 管理
  21 Posts :: 0 Stories :: 2 Comments :: 0 Trackbacks
上面的章节,我们说明了让模型产生移动或旋转的方法,
但那些例子中,摄像机的位置和它的缩放比率都是固定的。

这部分我们介绍以下怎样用矩阵来控件摄像机。

在3D绘图的世界中,我们常用到以下三种矩阵;

一,世界矩阵...模型配置(移动/旋转/缩放)
二,视图矩阵...摄像机的位置(移动/旋转)
三,投影矩阵...摄像机的参数(视角/画面比)

在使用DirectXGraphics来进行rendering的时候,必须把这三种矩阵都设定到Rendering Pipeline去。

第一,世界矩阵,我们在上面的模型的配置的时候已介绍过了。

第二,视图矩阵
在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范围(近端平面/远端平面)

首先,第一个视角是一种表示镜头的缩放比的参数。
要使被摄像物达到缩放的目的,可以调整此参数。
视角变小,则被摄像物变大;
视角变大,则被摄像物变小;

其次,画面比;
这个是指定Rendering target的纵横比的参数。
画面比是以宽/高的结果来指定。
所以说,当数值越大,画面的宽度就会变得比较长;
而当数据越小,则画面的高度就会变得比较长。

最后一个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);




posted on 2008-12-30 13:45 狂之想 阅读(777) 评论(0)  编辑 收藏 引用 所属分类: C++2D,3D

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


//