3d游戏从入门到精通

上传人:正** 文档编号:35230372 上传时间:2018-03-12 格式:DOC 页数:27 大小:110.50KB
返回 下载 相关 举报
3d游戏从入门到精通_第1页
第1页 / 共27页
3d游戏从入门到精通_第2页
第2页 / 共27页
3d游戏从入门到精通_第3页
第3页 / 共27页
3d游戏从入门到精通_第4页
第4页 / 共27页
3d游戏从入门到精通_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《3d游戏从入门到精通》由会员分享,可在线阅读,更多相关《3d游戏从入门到精通(27页珍藏版)》请在金锄头文库上搜索。

1、2.10.1坐标系 在D3D里使用的坐标系是左手坐标系,就是当你看屏幕时,左手边是X轴的负方向,右手边是X轴的正方 向。屏幕下边是Y轴的负方向,屏幕上边是Y轴的正方向。远离屏幕是Z轴的负方向,指向屏幕里面是Z 轴的正方向。 坐标系还有右手坐标系,还有其它各种各样的坐标系。如果需要从其它坐标里的图形显示在D3D里,就需 要进行转换。 2.10.2点 在三维空间里表示物体位置,就需要用坐标来表示。由上面的坐标系可知,任何一点,都可以用三个坐标 轴的值来表示。比如表示零点,就是O(0,0,0) 。只要给出三个坐标轴的值,就可以知道这个点在什么 位置了。 从坐标系里,就知道我们定义的坐标轴是有方向的。

2、那么在坐标系里的点,是否也有方向呢?为了表示方 便,使用起来简单,在D3D里的点也是有方向的。用向量来表一个点的位置和方向。一个点的方向,都是 从原点出发指向这点的方向。比如下面的图中,OA就是一个点的位置和方向。 从几何上知道这种表示方法了,但在程序里是怎么样表示一个向量呢?在编程里,是需要特定的编程语言 来表达向量的。由于C具有强大的功能和特别快的处理速度,目前大部份游戏都是采用C来编写。 因此D3D游戏也不例外地采用C。如果你还不会使用C,建议你先去找本C的书来看看,然 后再接着看本书,否则很多东西是看不懂的。 在C里是使用结构(struct)或者类(class)来表达一个向量的。下面就

3、是D3D里的向量表示方法: typedef struct _D3DVECTOR float x; float y; float z; D3DVECTOR; D3DVECTOR向量定义了三个成员x,y,z来表示坐标系三个坐标轴的值。这里使用typedef来定义向量类型, 以后就可以使用它来定义其它向量类型变量了。为了方便对它的操作,因此又需要继承它,生成一个新类 D3DXVECTOR3。D3DXVECTOR3类有很多方法,使用起来非常方便。因而在程序里,主要使用它来定义变量, 这样就有很函数可以使用了。比如赋值,相加,相减等等。它的定义如下: typedef struct D3DXVECTOR3

4、 : public D3DVECTOR public: D3DXVECTOR3() ; D3DXVECTOR3( CONST FLOAT * ); D3DXVECTOR3( CONST D3DVECTOR D3DXVECTOR3( CONST D3DXFLOAT16 * ); D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z ); / casting operator FLOAT* (); operator CONST FLOAT* () const; / assignment operators D3DXVECTOR3 D3DXVECTOR3 D3DXVECTOR

5、3D3DXVECTOR3 / unary operators D3DXVECTOR3 operator + () const; D3DXVECTOR3 operator - () const; / binary operators D3DXVECTOR3 operator + ( CONST D3DXVECTOR3 D3DXVECTOR3 operator - ( CONST D3DXVECTOR3 D3DXVECTOR3 operator * ( FLOAT ) const; D3DXVECTOR3 operator / ( FLOAT ) const; friend D3DXVECTOR3

6、 operator * ( FLOAT, CONST struct D3DXVECTOR3 BOOL operator = ( CONST D3DXVECTOR3 BOOL operator != ( CONST D3DXVECTOR3 D3DXVECTOR3, *LPD3DXVECTOR3; 在这里已经实现向量的加减、数乘、数除,也许你发现这里有没有点积和叉积运算。它们是通过其它公共 函数实现的。说到这里,如果你对点积和叉积运算不是很懂,看来又需要去看看向量代数了。在游戏 里,要表示一个人沿着OA的方向行走,那么只需要对着OA向量数乘,就可以了。有了这样的向量类型定 义,就可像下面那样方便使

7、用: D3DXVECTOR3 vOA(1.0f,1.0f,1.0f); 2.10.1平面的表示 3D空间里的物体都是实体的,主要由平面组成。比如正方体,就有6个平面。在D3D里组成三维物体的基 本平面是三角形,无论是多么复杂的物体,都是有三角形组成的。并且D3D里支持显示最小的图形也是三 角形,它是没有点和直线显示的。因此,要显示正方体,就需要把每个平面分成两个三角形,才能显示。 如下图所示: 为什么选择三角形作为D3D里最小的平面呢?由于三个点组成的平面,肯定是共面的,是平坦的,并且显 示效率是最高的。如果选择其它多边形的话,就存在点不共面的情况,这样变得非常复杂,所以目前显示 卡也是针对三

8、角形进行优化显示的。 要在D3D里显示物体,就是显示很多的三角形,让这些三角形连接起来,就组成游戏里的人体,动物,武 器等等。在几何里就知道每个三角形都有三个顶点组成,那么只要设置了三个顶点的值,就可以在D3D里 显示三角形出来了。用D3D里的向量表示三个顶点就是: A: D3DXVECTOR3( -1.0f, -1.0f, 0.0f ); B: D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); C: D3DXVECTOR3( 1.0f, -1.0f, 0.0f ); 只要把所有三角形的顶点,都按上面格式设置到顶点缓冲区里,就可以显示一个三角形出来。但这个三角 形又可分为两个表

9、面:前表面和后表面。在D3D缺省情况下,只会显示前表面。那么怎么样来区别前表面 和后表面呢?由于D3D是采用左手坐标系,正对着平面看去是顺时针方向的顶点顺序就是前表面。如下图 所示: 如果不小心把顶点的顺序搞反,就会看不到表面显示。并且还会关系到后面的灯光显示,纹理显示。其实,前表面就是平面的法向量指向的表面。 只要认识到组成平面的顶点以及顶点排列顺序,就可以用平面构成三维物体了。不管多么复杂的物体,都 可以由顶点组成平面,再有平面组成物体。不管是圆的物体,还是方的物体,都可以使用三角形去组成。 其实这种三维物体是数字化的,永远都是尽可能逼近,不可能是完全相同的。比如要显示一个足球,它是 圆的

10、,需要非常多的三角形去构成它,但不可能完全一样的。并且使用过多的三角形,就会导致CPU或者 GPU处理不过来。在目前的个人电脑里,虽然处理三角形的速度快了很多,但真的要显示大量三角形,还 是不行的。 21 使用Direct3D 2.11.1最简单三角形显示 前面已经学习了顶点、平面以及平面的法向量。接着下面就带你进入奇幻的3D世界,由你去创造这个美 好的3D世界。任何美好的事物都是简单的东西组成的,所以也需要从最简单的物体构造开始。这里主要 显示一个三角形,其它关于窗口和初始化D3D的设备都已经由MM3D引擎做好了,目前只要设置顶点、世 界坐标变换矩阵、观察变换矩阵、投影变换矩阵,然后渲染这个

11、三角形,就可以显示屏幕里了。最终显示 效果如下图: 1、 顶点格式 顶点格式是可变的,是灵活的。由前面可知,顶点肯定是有三个值的,就是三个坐标轴的值。下面先来看 看最简单的顶点格式,它定义如下: /定义顶点缓冲区里用到的顶点格式。 struct VT_CAITRIANGLE D3DXVECTOR3 vPosition; / 顶点位置。 static const DWORD dwFVF = D3DFVF_XYZ; ; 这里使用一个结构来定义顶点的格式,后面就可使用这个结构来定义顶点了。看到这个结构里第一个成员 vPosition是很熟悉的吧,前面已经说明过使用一个向量来表示一个顶点的。最简单的顶

12、点格式,就是只 有一个向量值,其它什么也没有。后面一个成员dwFVF是说明顶点的有什么样数据,这里只有顶点的坐标, 所使用了宏定义D3DFVF_XYZ。其实顶点还可以有其它数据在里面的,比如要表示这个顶点的法向量,就 需要加入法向量的成员,比如要显示纹理在这个表面上,就需要设置纹理坐标。 1、 顶点缓冲区 顶点的数据是怎么样保存在内存里的呢?由于渲染需要,就要把顶点保存在内存缓冲区里。最简单的 方法就是使用D3D提供的顶点缓冲区,即是使用IDirect3DVertexBuffer9接口的顶点缓冲区管理, 它是通过D3D的设备来创建。这个接口实现顶点的资源管理,使用起来非常方便,由于它管理内存分

13、 配,这样就省了内存管理。下面就是通过IDirect3DDevice9:CreateVertexBuffer函数来创建一个 顶点缓冲区: HRESULT hr; / 创建顶点缓冲区。 if( FAILED( hr = m_pd3dDevice-CreateVertexBuffer( 3*2*sizeof(VT_CAITRIANGLE),0, VT_CAITRIANGLE:dwFVF, D3DPOOL_MANAGED, 上面这段代码,就是创建6个顶点的缓冲区。指定的格式为VT_CAITRIANGLE:dwFVF,这个在前面已 经定义过,只包括顶点向量数据。D3DPOOL_MANAGED指明了创建

14、的缓冲区在系统内存里,并且需要时 就拷贝到显示卡内存里。我们知道显示卡内存越来越大了,如果把很多变化不大的物体放到显示卡内 存里,就可以加速显示,减少占用系统局部总线的带宽。像NV新出来的显示卡,都有1G显示内存, 显然可以放更多物体在那里,以便显示的速度更快。 由于显示卡内存和系统内存的复杂性,而通过这个接口可以方便地使用了。由于它是还一个内存池, 所以产生内存碎片的机会就更加少了。 创建顶点缓冲区之后,就需要往里面填充顶点数据,先来看看下面的代码: / 用两个三角形填充顶点缓冲区。 VT_CAITRIANGLE* pVertices; if( FAILED( hr = m_pVB-Lock

15、( 0, 0, (VOID*) / 前面三角形。 pVertices0.vPosition = D3DXVECTOR3( -1.0f, -1.0f, 0.0f ); pVertices1.vPosition = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); pVertices2.vPosition = D3DXVECTOR3( 1.0f, -1.0f, 0.0f ); / 后面三角形。 pVertices3.vPosition = D3DXVECTOR3( -1.0f, -1.0f, 0.0f ); pVertices4.vPosition = D3DXVECTOR3( 1.0f, -1.0f, 0.0f ); pVertices5.vPosition = D3DXVECTOR3( 0.0f, 1.0f, 0.0f ); /解锁顶点缓冲区。 m_pVB-Unlock(); 这段代码是通过IDirect3DVertexBuffer9:Lock方法来获取到顶点缓冲区的指针,然后把6个顶点 赋值。最后调用IDirect3DVertexBuffer9:Unlock方法解锁,如果不解锁,D3D显示不了这个缓冲 区里的数据,就会出错的,所以一定要小心地操作。 1、 世界坐标变换矩阵 在设置顶点缓冲区之后,就需要设置物体的世界坐标变换矩阵。从解析几何里可以知道,无论二维还

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号