Chinaunix首页 | 论坛 | 博客
  • 博客访问: 128842
  • 博文数量: 44
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-07 23:06
文章分类

全部博文(44)

文章存档

2010年(6)

2009年(38)

我的朋友

分类:

2009-12-07 23:46:33

Tutorial 3 使用矩阵(Using Matrices



这一章将介绍矩阵的概念和使用方法,在Vertices例子中用2D顶点画一个三角形,这里你会在3D场景中变化顶点。矩阵也用来设定摄像机和视口。
在进行Matrices工程在绘制图形前,这个叫做SetupMatrices应用程序,创建矩阵变换函数进行3D三角形的绘制。作为3D场景主要有三种类型的变换场景。每一步的创建主要矩阵如下:

Steps:
Step 1- 定义世界矩阵(Defining The World Transformation Matrix
Step 2- 定义视口矩阵(Defining The View Transformation Matrix
Step 3-定义投影矩阵(Defining the Projection Transformation Matrix

这些变换矩阵的创建顺序不影响物体在场景在布局,但Direct3D调用的顺序如下:
1.
World

2.
View

3.
Projection

Matrices工程中和例子中的代码几乎和Vertices工程一样,Matrices教程在主要讲解矩阵的使用而没有初始化Direct3D,处理系统消息,显示,和关闭的代码。

Step 1-定义世界矩阵(Defining the World Transformation Matrix


世界矩阵定义如何在3D模型空间在进行几何图形的移动、缩放和旋转。下面的代码片段将三角形绕Y轴进行旋转然后设定当前世界矩阵作用到Direct3D设备环境中。

D3DXMATRIX matWorld;
D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f );
g_pd3dDevice -> SetTransform( D3DTS_WORLD, &matWorld);

第一步通过调用D3DXMatrixRotationY()方法将三角形绕Y轴旋转,第一个参数是D3DXMATRIX结构体指针存储操作后的结果。第二个参数是旋转的角度(弧度制);
下一步是调用IDirect3DDevice9::SetTransform()将世界矩阵作用到Direct3D设备环境,IDirect3DDevice9::SetTransform()接受的第一个参数是告诉Direct3D进行设定哪一类变换。此例使用D3DTS_WORLD宏来指定世界矩阵将被设定。第地个参数是指向当前设定的矩阵指针。要查看更多的关于世界变换操作查看WorldTransform(Direct3D9)
在定义了世界变换后你可以准备进行视口矩阵的定义了。再一次声明,各矩阵的设定顺序是没有严格限定的。但Direct3D使用的是如下的顺序:
1.
World

2.
View

3.
Projection

下一章定义视口矩阵。

Step 2-定义视口矩阵(Defining the View Transformation Matrix


视口矩阵定义视点的位置和视角。视口矩阵是场景的摄像机。
下面的片段创建视口矩阵并设定当前矩阵到Direct3D设备。

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, &matVeiw);

第一步通过调用D3DXMatrixLookAtLH()定义视口矩阵,第一个参数是指向D3DXMATRIX结构体的指针保存操作的结果。第234个参数依次定义眼睛的位置、朝向和向上方向。这里眼睛延Z轴后移五个单位,向上三个单位,视点朝向定为原点,向上为Y轴正方向。
下一步是调用IDirect3DDevice9::SetTransform()将视口矩阵作用到Direct3D设备,Idirect3DDevice9::SetTransform()接受的第一个参数告诉Direct3D将设定哪一类矩阵,例子中使用D3DTS_VIEW标记指定将设置视口矩阵,第二个参数是指向当前设定的视口矩阵的指针。
更多关于视口矩阵的信息查看View Transform(Direct3D9)
在定义了视口矩阵后可以准备设定投影矩阵了。再次声明各种矩阵的定义顺序对程序没有影响,但Direct3D使用的是以上提过的顺序。

Step 3 定义投影矩阵(Defining the Projection Transformation Matrix


投影矩阵定义如何将一个3D视角转换到2D的视口空间。
正同的代码设定了投影矩阵后将当前矩阵作用的Direct3D设备。

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

第一步调用D3DXMatrixPerspectiveFovLH()来设定投影矩阵。第一个参数是D3DXMATRIX结构体的指针保存操作结果,第二个参数定义视口范围,告知如何将远处物体变小,例子使用典型的90度(1/4PI),第三个参数定义屏幕高宽比。例子使用常用比例为1.第四和五个参数定义近、远剪切面。这将决定一定距离的几何图形将不再显示。Matrices工程中将近剪切面设为1远剪切面设为100.
下一步是调用IDirect3DDevice9::SetTransform()将投影矩阵应用到Direct3D设备,IDirect3DDevice9::SetTransfomr()接受的第一个参数告诉Direct3D将设定哪类矩阵,此例中使用D3DTS_PROJECTION标记指定投影矩阵将被指定,第二个参数是指向当前矩阵的指针。
关于更多投影矩阵的信息查看ProjectionTransform
些教程展示了如何使用矩阵,下一教程如何向你的场景中加入光照得到更真实的效果。

阅读(1188) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-02-20 20:01:48

高手啊。 学习学习。