已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Visual Studio的模拟三维空间飞行游戏设计第1章 绪 论 1.1引言近几年来,由于3D硬件绘图技术的突破,使得实时描绘的画面越来越精致,而且3D游戏性更多元化更逼近真实世界,因此在游戏产业中,3D游戏己经逐渐取代ZD游戏而成为游戏市场的主流,即使是网络游戏,也慢慢趋向3D化。在3D游戏制作方面,欧美和日本的一些厂商都拥有自己成熟的3D游戏引擎,他们所制作的游戏也有庞大且固定的玩家群,诸如虚幻系列、合金装备2等,甚至被奉为经典,市场潜力巨大。国内3D游戏近年来也不乏精品,如长久以来倍受好评的轩辕剑,仙剑系列都开始向3D游戏过渡。 目前流行的3D游戏开发技术主要有Direct3D和OpenGL。在我所研究的项目中,采用Direct3D技术开发一个模拟三维空间的飞行游戏设计。本课题以Visual Studio 2003为开发平台,利用用于三维景观显示的图形相关函数库创建3D对象,在景观的三维显示中,使用三维空间的本地坐标系、世界坐标系、投影坐标系,空间的矢量、平面,3D变换所需的矢量和矩阵及几何体表面纹理显示设计做变换,对三维空间进行渲染。实现景观的三维显示,最终完成飞行游戏设计过程。在图像方面需要解决的主要问题在于:三维空间的生成和渲染、光线的运用、3D模型和2D对象的调用和显示等等。 本文主要介绍了用DirectX9.0进行计算机图像设计的技术,其中着重强调了在游戏方面的应用。其中讲述了Direot3D的基本原则和一些较高级的技术。从开发者的角度来说,DirectX是一组Windows平台上的多媒体API。本文中主要论述的是其中的Direct3D,也就是用于3D图像编程的部分。 本文主要有以下要点:首先第一部分介绍了3D编程中所需的一些数学知识,诸如三维空间中的矢量、平面,3D变换所需的矢量和矩阵运算知识等等;第二部分,讲述了Direct3D与显示硬件的关系,Direct3D所扮演的角色,设备的分类和运用及初始化,三维空间的本地坐标系、世界坐标系、投影坐标系等概念。介绍了怎样在Direct3D中显示3D对象,3D技术的一些元素,诸如光,包括光源的种类和光与表面相交的情况等。包括凡何体表面纹理的显示;作为最主要的第三部分,着重讲述了Direct3D中各种技术,主要是地形的渲染,包括实现景观的三维显示,飞行游戏的设计过程等。 1.2研究背景随个人电脑以及Internet的普及,游戏业迎来了蓬勃发展的时代。数年之前在486机器上运行的DOS游戏已经让人玩的如痴如醉,兴奋不已。现在,由于CPU以及显卡等设备的飞速发展,为人们开发更加炫目多彩的游戏提供了可能。一块高性能的显卡能在一秒钟内完成数千万个多边形的处理,高速CPU在显卡的辅助下,所营造出的游戏环境几乎可以乱真。 这几年游戏产业的发展可以说是一波接着一波,呈现一片欣欣向荣,百家争鸣的景象。游戏产业发展至今虽然只有30年左右的时间,却己经成为全球娱乐市场的主流,游戏软件的销售量更是与日俱增,甚至超过悠久历史的电影与音乐产业。此外,三大游戏主机厂商一Sony的PlaystationZ、任天堂的GameCube以及微软的XB0X之间竞争趋于白热化,更使得整个游戏产业成为众所瞩目的焦点。在60年代,第一台台式计算机问世,当时运行在Unix机器上的Core Wars,是最早的计算机游戏之一。在70年代的黄金岁月到来时,全世界的台式计算机和小型计算机流行着文本游戏和粗糙的图片游戏。在PC界,有史可考的最早一款PC游戏是斯考特亚当斯1978年为TRS80开发的文字冒险游戏冒险岛,正是这款不起眼的游戏开启了今天近百亿霉运的电脑游戏市场。80年代是电脑游戏升温的年代。第一台16位计算机问世,如IBM PC及兼容机、Mac、AtariST等等,这时候,游戏已经变得很好看,甚至有了一些3D的游戏。但是,PC机仍然落后于游戏主机。在90年代初期,IBM PC及兼容机渐渐成为主流,伴随着Windows3.0的发布,Apple Macintosh寿终正寝。用户从此可以真正的在PC上进行游戏、编程、开发并连接其他东西。但是,PC在图像和声音上还依然落后。在1993年的后期,随着Id Software发行了DOOM作为Wolfestein3D的换代产品,PC机开始成为家用微机市场玩游戏和编程的选择。DOOM的成功表明了微机上是可以做任何事情的,而微软敏锐的发现了这一点,并开始制定巨大的计划涉足游戏,由此,DirectX1.0为游戏而生。进入21世纪,使用大型3D引擎架构的游戏逐渐成为市场的主流,并以绚丽的画面和逼真的场景一次又一次的吸引着人们的目光。DirectX技术也成为当今图形处理及多媒体处理的主流技术,目前版本已经发展到了DirectX9.0c。 近几年来,由于3D硬件绘图技术的突破,使得实时描绘的画面越来越精致,而且3D游戏性更多元化更逼近真实世界,因此在游戏产业中,3D游戏己经逐渐取代ZD游戏而成为游戏市场的主流,即使是网络游戏,也慢慢趋向3D化。虽然开发3D游戏过程中存在着诸如技术更新快、程序人员与美工的配合、各厂商所生产的3D硬件规格和特性不同、失败率高等风险,但不可否认,3D游戏己是大势所趋。 3D游戏引擎的发展会日趋成熟,因此游戏开发的困难度也将随着3D游戏引擎的成熟而逐日降低。由于这些3D游戏引擎的成熟发展,将使得游戏开发厂商可以将其开发的重心放在游戏内容及游戏设计上,因此未来游戏厂商将可以摆脱复杂的3D绘图技术的程序设计、沟通不易、跨平台等等的困难,而更容易地设计出画面华丽、内容充实的游戏。 1.3国内外研究现状 随着电脑绘图技术的不断演进,3D绘图硬件效能的增强以及宽带网络的普及,3D技术的应用也有了新的风貌。目前3D技术的使用非常广泛,它已经成为各界研究、应用的主题,3D应用发展纵然也就成为了时势所趋最热门的研究话题,也是各行业努力的方向,它的发展主题跨及了制造设计、电子商务、动画制作、多媒体教学、虚拟现实以及游戏行业等。 游戏产业有着丰厚的利润的光辉的前景。就国内的发展来看,最近这两三年内国内的游戏公司如雨后春笋般的成立,所开发或代理的网络游戏更是不胜枚举。这几年韩国的表现最为突出,特别是在网络游戏的技术研发与游戏制作,其所发行的网络游戏更成为全球游戏产业重要的指针之一。去年在美国洛杉矶所举行的E3(ElectronicEntertainmentExposition)展中,已经有几家的韩国厂商挤入世界第一线游戏开发厂商之列。以全球游戏业界的发展来看美国一个市场研究就发表的报告显示,到2002年底,全球电脑游戏产业已经形成一个200亿美元的巨大市场。日本是游戏产业最发达的地区,在这两个国家内,电子游戏已经相继超过以汽车制造为代表的传统制造业而成为国民经济主导产业之一;而在美国,游戏业已经超越拥有百年历史的好莱坞电影业而成为整个电子娱乐产业的龙头。游戏正成为与影视、音乐并驾齐驱的娱乐产业之一。而网络游戏凭借着信息双向交流、速度快、不受空间限制等互联网优势,具有诱人的互动性、仿真性和竞技性,已成为网络业盈利优厚的三大领域之一,游戏产业已被称为“阳光产业”。 第2章 数学基础2.1三维空间中的矢量几何学中,用有向线段表示矢量。矢量并不需要放在特定的坐标系中讨论,矢量的两个属性是它的长度和他的顶点所指的方向。因此,可以用矢量来模拟既有大小又有方向的物理模型。例如,以后要实现的粒子系统。用矢量来模拟粒子的速度和加速度。在3D计算机图形学中我们用矢量不仅仅模拟方向。例如我们常常想知道光线的照射方向,以及在3D世界中的摄像机。矢量为在三维空间中表示方向提供了方便。为我们提供了便利的描述3D空间方向的机制。 矢量与位置无关。有同样长度和方向的两个矢量是相等的,即是他们在不同的位置。在3D图形程序中,虽然我们主要关心3D矢量,但有时也会用到2D和4D矢量。在D3DX库中提供了D3DX VECTOR2和D3DX VECTOR4类来分别表现2D和4D矢量。不同维数的矢量有着和3D矢量一样的性质,也就是他们描述大小和方向,仅仅是在不同的维数中。所有这些矢量的数学运算对于不同维数矢量都有效,只是有一个是除外,就是矢量积。这些运算我们可以通过论述3D矢量扩展到2D,4D甚至n维矢量。2.1.1矢量点乘 点乘是对两相乘矢量的代数定义: u*v=ux vx +uy vy +uz vz =s (3.1)该算法似乎并没有明显的几何意义,我们可以从下式找出其隐含意义: u*v=|u|v| (3.2)两点乘的矢量夹角大小与其点乘结果有如下关系:乘积为0时,表示两矢量垂直乘积大于0时,两矢量粮食两夹角小于90度乘积小于0时,两矢量夹角大于90度2.1.2矢量差乘 矢量乘法的另一种模式是差乘。不同于点乘,所得结果是同时垂直于两差乘矢量的得另一矢量:u*v=(uyvz - uz vy),(uz vx -uxvz),(ux vy -uy vx) (3.3)2.2矩阵基本变换一个mxn矩阵是拥有m行n列的数组。行数和列数决定了矩阵的维数。在Direct3D编程过程中,我们用4X4的矩阵来描述特定的变换,因为4x4的矩阵能够提供变换所需的所有信息,这样的大小能表现我们需要的所有变换。3x3的矩阵看似更加符合3D变换,然而很多变换都不能用3x3的矩阵来描述,例如平移、投影、反射等。增加为4x4的矩阵使我们能够描述通过矢量与矩阵相乘所完成的矩阵变换。也正因为如此我们使用的是1X4的矢量,因为1x3的矢量是不能与4x4矩阵相乘的。主要的矩阵变换有平移,缩放和旋转。下面的这幅图是一个矩阵的例子,这个矩阵能使一个对象(由它的所有顶点)缩放到原来的三倍。 当把一个相匹配的点或者一个向量的成员放置到一个1x4的行矩阵中,点和向量却是3D的,所以就必须把3D点向量增大为4D的单行矩阵,这样就符合向量与矩阵的乘法定义,而1x3的单行矩阵和4x4的矩阵相乘是不允许的。 那么,在使用第四个成员时(用w来表示),当把一个点放置到一个1x4的行矩阵中时,设置w为1。允许对点进行适当的平移。因为向量和位置无关,所以向量的平移没有被定义,如果试图这样做会返回一个无意义的向量。为了防止对向量进行平移,当把一个向量放置到一个1x4行矩阵中时,把w设置为0。例如:把点p=(p1,p2,p3)放置到一个单行矩阵中,就像这样:p1,p2,p3,1,同样把向量v=(v1,v2,v3)放置到一个单行矩阵中,就像这样:v1,v2,v3,0设置w=1是为了让点可以被恰当移动,同样我们设置w=0是为了防止向量被平移。当检查矩阵实际平移时这是一个非常清晰的模型。 矩阵是怎样改变顶点的位置的呢?要改变一个顶点的x,y与z值,应该把它们与某个矩阵相乘。 这其实是一种简单的计算,只需要将x、y和z值分别与每列上的数相乘再相加,每列上得出的数都是新顶点的一个坐标值。所以,只需操作矩阵就能完成这些类似旋转、缩放或移动的变幻。幸运的是, DirectX给我们提供了一些函数能方便地生成一些通常的矩阵。那么,怎样完成即缩放又旋转(复合变换)的变幻呢?首先,我们需要两个矩阵:一个用来旋转的一个用来缩放的;然后,我们把两个矩阵相乘,得出一个新的复合矩阵,即缩放又旋转的矩阵;然后利用这个新的矩阵来变幻顶点。应该注意的是,矩阵相乘并不是普通的乘法,而且,也不满足交换率:矩阵AX矩阵B和矩阵BX矩阵A是不相等的。要把两个矩阵相乘,需要把第一个矩阵的每一行和第二个矩阵的每一列都相乘。在上面的例子中,我们把第一个矩阵的第一行的每个元素与第二个矩阵的第一列的对应元素相乘,然后把得出的四个结果相加,按此方法,我们得出了新矩阵的第一行的四个元素(Columnl-4),其它元素的计算方法依此类推。 第3章 DirectX 技术简介3.1DirectX概述现在游戏的种类与数量几乎是在呈爆炸式的增长,游戏的制作水平也在不断的提高,其实就是DirectX造就了这一切。 DirectX(简称:DX)是一个用于多媒体应用程序和硬件增强的编程环境,它是微软开发的基于Windows平台的一组多媒体应用程式接口API(Application Programming Interface,应用程序接口),该接口为设计高性能、实时的应用程序提供了所需的资源,也是游戏制作者的API。在开发中,DirectX分为两个部分,一个是运行库,通过DirectX编译出来的程序必须要有运行库的支持,另外一个是开发库,也就是游戏程序设计者们通常所说的SDK,这部分是在编译DirectX程序是必需的,也就是说在程序编译时我们既使用了DirectX的运行库同时也使用了DirectX的开发库。DirectX为程序员提供了一套完美的基于COM(Componet Object Model,组件对象模型)的游戏,从内部原理探讨,DirectX就是一系列的DLL(动态链接库),通过这些DLL,开发者可以在无视于设备差异的情况下访问底层的硬件,DirectX封装了一些COM对象,这些COM对象为访问系统硬件提供了一个主要的接口。使用DirectX的目的在于,可以使应用程序(特别是游戏)在Microsoft Windows下的性能可以达到甚至超过在MS-DOS下的性能,并且为之提供一个强壮、标准化以及文档化的编程环境。DirectX优势主要表现在两个方面:1. 为软件开发者提供硬件无关性 Microsoft 开发DirectX的初衷就是增强Windows系的游戏开发环境,在DirectX之前,多数的游戏开发都是基于MS-DOS的,那时游戏开发者不得不自己判别硬件的种类并逐一适应。有了DirectX,游戏开发者就可以享受DirectX给他们带来的设备无关性,而丝毫不受影响地直接访问硬件。DirectX的首要目标即是将MS-DOS下的许多特性移植到Windows平台上来,在提高应用程序的性能的同时,清楚个人呢电脑不断更新的硬件给程序带来的障碍。 另外,通过提供应用程序和硬件之间一致的接口,DirectX让基于Windows的应用程序能对现有及未来的硬件系统进行高性能的、实时的访问,发挥了硬件的最大潜能,也使应用程序安装和设置的复杂度大大降低。使用DirectX提供的编程接口,软件开发人员能充分的利用硬件特性,却不用操心硬件的具体实现。基于 Windows的高性能游戏将从下列技术中获利:(a) 专门为提高速度而设计的极速卡(b) 即插即用及其他Windows硬件和软件(c) Windows内建的通信支持(包括DirectPlay)2. 为硬件开发提供的规范 DirectX建议硬件设计遵循一定的规范,这个规范的制定基于高性能应用程序的开发者和独立硬件供应商的反馈,因而,DirectX程序员参考的有关内容甚至可能对现在尚未出现的加速硬件的特性进行描述,另一方面,软件业可能仅仅关心在规范所限范围之内的硬件能力,而略过那些不被范围所支持的特性。3.2 DirectX的基本结构及组成3.2.1DirectX的基本结构DirectX需要以设备无关的方法提供设备相关的性能,所以DirectX的结构是由两个驱动程序构成的:硬件操作层(HAL)和硬件模拟曾(HEL),当DirectX对象创建时,会同时建立一张“兼容表”,其中记录了当前用剑系统支持的功能,当DirectX需要实现某个功能时就查询该表,得到硬件对功能的支持信息,如果功能能够得到硬件支持,则向HAL发出请求,以得到硬件的支持,否则就向HEL发出请求,以模拟方式实现该功能。图3-1所示的是DirectX的基本结构。图3-1 DirectX的基本结构3.2.2 DirectX的基本组成DirectX SDK是微软所开发出的一套API函数库,最初用于游戏的开发,如今许多的多媒体软件都是使用它所开发出来的。DirectX中包含了各种组件用来处理2D和3D图像、声音、网络连接以及控制各类输入装置,是游戏开发中不可缺少的主角。它包含了编制计算机游戏和多媒体应用程序最新技术和工具,为广大程序员提供了一整套的应用程序接口API,是程序员能够设计高性能实时的应用程序。图3-2描述的是DirectX的基本组成:图3-2 DirectX基本组成DirectX目前主要由表3-1所示的七个主要部分组成:表3-1 DirectX主要组件3.3 Direct3D 主要组件介绍3.3.1 DirectDraw组件 DirectDraw是DirectX SDK的主要组件之一,它允许直接对显示内存操作,支持硬件位块传输、硬件覆盖、表面翻转,并且保持同目前基于Windows的应用程序和驱动程序兼容。DirectDraw是一种软件接口,除了能直接对显示设备存取外,还保持了与Windows图形设备接口(Graphics Device Interface,GDI)的兼容性。 DirectDraw主要提供了完成以下任务的工具:管理多页面、直接访问视频RAM、换页(Page flipping)、后台缓存(Back buffering)、管理调色板(Palette)、裁剪(Clipping)、视频端口(Video port)。图3-3显示了DirectDraw,图形设备接口(Graphics Device Interface,GDI),硬件操作层(Hardware Abatraction Layer,HAL),硬件抽象层(Hardware Emulation Layer,HEL)及硬件(Hardware)之间的关系。DirectDraw组件与GDI位于同一层次,都通过一个与设备相关的抽象层来直接处理硬件设备。与GDI不同的是,DirectDraw会尽可能的利用硬件加速特性。如果硬件不支持某种特性,DirectDraw会使用硬件抽象层(HEL)试图将该特性进行软件模拟。DirectDraw可以以设备环境(DC)的形式提供页面存贮器,使得开发者可以使用GDI的函数操作页面对象。图3-3 DirectDraw与GDI、HAL、HEL、硬件的关系(1) 硬件操作层(Hardware Abatraction Layer,HAL) DirectDraw通过硬件操作层(HAL)提供设备索引。HAL是特殊设备接口,由硬件厂商提供,DirectDraw可以直接操作硬件,程序无须与HAL进行接触。相反,通过HAL提供的基础结构,DirectDraw使用相同的结构让应用程序来显示图形。硬件制造商在Windows下实现的HAL包含16-bit及32-bit的代码。在Windows NT下,HAL则是纯32-bit的代码。HAL可以是显示卡驱动程序的一部分或单独的动态衔接库,以驱动程序的接口来通信,接口是由驱动程序设计者定义的。(2) 硬件抽象层(Hardware Emulation Layer,HEL) 当通过硬件操作层(HAL)硬件无法支持某些特性,DirectDraw就试图对其进行模拟,这功能时通过硬件抽象层来实现的。HEL提供的与HAL相同的功能。还有,在HAL,程序并不直接与HEL工作。在主要功能上其结果大体相同,而程序不必理会是由硬件提供的还是HEL模拟的。3.3.2 Direct3D 组件 Direct3D提供了在窗口操作系统上运行的3D互动游戏的可能,它提供了独立于各种3D图形加速硬件的一些独立调用函数。用户可以在两种模式下使用Direct3D即立即模式(Immediate Mode)和保留模式(Retained Mode)。Direct3D立即模式适合于快速开发,Direct3D保留模式为高级。实时的三维图形提供了更高层次的支持和为层次结构和动画之类的图形技术提供内在支持。Direct3D保留模式建立在Direct3D立即模式之上。Direct3D为程序开发人员提供了许多高级功能,如:可切换的三度缓冲(使用z-buffer或w-buffer),平面和Gouraud阴影,多种光线和光线类型,丰富的素材和纹理支持功能,可靠的软件仿真驱动程序,变换和裁剪,与硬件无关性,在Windows NT上的完全硬件加速(提供合适的设备驱动程序时),对专门的CPU指令集的内嵌式支持,其中包括Intel的MMX和PentiumIII结构以及AMD 3DNow的结构。3.3.3 DirectSound组件 DirectSound提供了程序和音频适配器的混音及播放功能之间的链接。还支持波形声音的捕获和播放。DirectSound为多媒体应用程序提供低潜伏混合、硬件加速以及直接访问声音设备。在维护与现有设备驱动程序的兼容性时提供该功能。DirectSound设计目标是提高声音的输出速度,实现多路声音混合播放。3.3.4 DirectInput 组件 DirectInput为Windows环境的游戏和实时多媒体应用程序处理输入设备信息,尤其对游戏控制器和力反馈设备提供了完备的支持。DirectInput和其他DirectX组成部分一样,是通过硬件抽象层和硬件仿真层来实现,但是一般来说,所有的游戏控制器都有合适的驱动程序来支持,所以一般来说使用硬件仿真层的内容并不多,大多数的控制器是通过DirectX调用驱动程序来完成。DirectInput可识别三种基本设备类型:1. 键盘,标准系统键盘。2. 鼠标,这一类中包括素有类似于鼠标的设备,如触摸板、跟踪球以及相应的按 键。3. 游戏杆,相对于其他类型的控制器和力反馈设备而言,这是易于产生误解的名 称,其范围从简单的游戏杆直至虚拟现实的复杂设备。3.3.5 DirectPlay 组件DirectPlay是为了满足现在流行的网络游戏而开发的API,它是一个用于连接传输协议和网络设备之间的接口程序。DirectPlay支持多通信协议,可以运行在采用TCP/IP或者是IPX协议的网络上,甚至也可以使用Modem进行连接,而且DirectPlay还为将来的协议预备了很好的扩展空间。DirectPlay提供了高级的传输服务(例如,有保证或无保证的传递,慢速链接上的通讯扼杀,以及放弃连接检测等),也提供了会话层服务(包括玩家名称表管理和点对点主机转移)。图3-4显示了DirectPlay体系结构,以及它如何提供与通讯服务提供层序无关的独立性。图3-4 DirectPlay体系结构3.4 Direct3D基础3.4.1 Direct3D设备Direct3D是让我们能够用3D硬件加速完成渲染3D世界的底层显示API。扮演了联系应用程序和显示设备的调度者的角色。Direct3D设备是Direct3D渲染的组成部分。它用来封装(encapsulate)和存储(store)渲染状态它们之间的关系如下图所示:图4-1 Direct3D设备关系图 当前Direct3D支持两种主要类型的Direct3D设备:一种是硬件抽象层(HAL)设备,应用程序不能直接访问3-D加速卡。他们要调用Direct3D的函数和方法。Direct3D通过HAL来访问硬件。如果程序运行的计算机支持HAL,那么使用HAL设备就能获得最好的性能。HAL设备具有硬件光栅化加速,并可用软硬件顶点处理进行着色操作;另一种是参考设备(REF)。可以认为这些设备是两个单独的驱动程序。软件和参考设备由软件驱动程序表示,而HAL设备由硬件驱动程序表示。 HAL是一个设备相关的接口,由设备制造商提供,Direct3D使用HAL与显示硬件协同工作。应用程序从不直接与HAL打交道。相反,通过队L提供的基础,Direct3D提供了一组统一的接口和方法,应用程序用这些接口和方法绘制/显示图形。 或许你想用Direct3D提供的功能进行编程但在你的设备却无法实现,为此,Direct3D提供了用软件模拟整个Direct3D API的REF设备,这使你能够在设备不支持的情况下使用Direct3D特征编写和测试代码。3.5初始化Direct3D3.5.1获取Direct3D9接口利用Direct3D函数可以方便地获取IDirect3D9接口指针: IDirect3D9*_ d3d9; _d3d9=Direct3DCreate9(D3D_ SDK VERSION); IDirect3D9对象主要用于两个方面:枚举设备特征和创建IDirect3DDevice9对象。设备特征主要有:设备能力、显示模式、格式和关于每个系统中其他可用设备的信息。3.5.2检测硬件顶点处理 创建IDirect3DDevice9对象后,我们必须指定顶点处理类型以便使用。如果允许的话我们应该使用硬件顶点处理,但由于并不是所有设备都支持硬件顶点处理,所以首先要检测设备是否支持: RESULT IDirect3D9:GetDeviceCaps( UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS9 *pCaps ); /检查此适配器上的设备对希望使用的功能的支持度 m_pd3dDevice-GetDeviceCaps(8rm_d3dCaps):然后检测设备能力。3.5.3实例化D3DPRESENT_ PARAMETERS结构成员变量D3DPRESENT_ PARAMETERS 结构用于指定我们将要创建的IDirect3DDevice9对象的一些属性。3.5.4创建IDirect3DDevice9接口 使用设备接口,主要是用来操作一个Direct3Ddevice对象的渲染状态、灯光状态以及执行渲染操作。尽管设备支持三个设备接口(IDirect3DDevice,IDirect3DDevice2,和IDirect3DDevice3),但是程序中并不需要使用多个设备接口。使用那种接口,要有所使用的渲染方法来决定,即DrawPrimitive方法或执行缓冲方法。最新的两个设备接口是IDirect3DDevice3和IDirect3DDevice2,它们都支持DrawPrimitive渲染方法和执行缓冲。DrawP rim itive方法大大简化了准备和渲染顶点的过程,是首选的渲染方法。以下方法创建IDirect3DDevice9对象: RESULT IDirect3D9:CreateDevice( DINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS *pPresentationParameters, IDirect3DDevice9* ppReturnedDeviceInterface ); hr=pD3D-CreateDevice(D3DADAPTER_ DEFAULT, dwDevType, hwnd, dwBehaviorFlags, &m_d3dpp,如_pd3dDevice):3.6使用设备3.6.1设备枚举 我们让程序对所使用的硬件进行查询,这样就可以确定它支持哪种Direct3D设备。3.6.2选择一个被枚举的设备 对于设备的选择,主要基于以下考虑:n 放弃所有不适合当前显示深度的设备。n 放弃所有明暗处理三角形的设备。n 如果一个硬件设备符合第一和第二点,那么就使用这个设备。但是如果程序正处于debug模式,那么它不会使用硬件设备。3.6.3创建一个Direct3D设备 创建一个设备时,必须要选择Direct3D程序使用执行缓冲或DrawPdmitive方法。这一选择将决定在创建一个设备时程序需要获得哪种类型的接口指针。如果选择使用执行缓冲,那么程序就必须得到一个指向旧irect3Ddevice接口的指针。如果选择DrawPrimitive方法,程序必须得到一个指向IDirect3DDevice3接口的指针。第4章 仿真实现4渲染通道 3D场景是怎样显示在屏幕上的呢?渲染通道负责创建由3D空间几何描述和透视矩阵所指定的虚拟摄像机所给定几何描述的2D图形,即是我们眼睛在显示屏幕上所见的景象。4.1模型表示 场景是对象和模型的集合,对象可看作是相邻三角网格,网格的三角形是我们建模时对象的组成块,我们将三角形归为以下可互换的术语:多边形、简单几何体、几何网格。多边形的某两边交点成为顶点,指定三顶点的位置便可以描述一个三角形。4.1.1顶点模式 上述的顶点定义在数学上是正确的,但当我们在Direct3D运用该概念时,它显得不够完整。因为Direct3D中的顶点可能有指定位置之外的附加属性。例如,顶点拥有颜色和法线等。Direct3D在构造顶点格式方面给予我们很大的灵活性,换句话说,让我们可定义顶点的其他属性。 创建自定义的顶点格式时,我们首先创建包含我们所需的顶点属性的结构。例如顶点位置和颜色。Struet ColorVertex Float _x,_y,_z; /位置 Dword_color; /颜色 一旦顶点结构创建完成,我们需要结合柔性顶点格式(FVF)来描述我们创建顶点格式的方法。#define FvF_COLOR(D3DFV_XYZ|D3DFvF_DIFFUSE) 必须提醒注意的是,指定的柔性顶点标识必须和指定的顶点结构中的数据一致。4.1.2三角形 三角形是3D对象中的基本构成块。要创建对象,就必须创建三角形序列以描述对象的外形和轮廓。三角形序列包括我们想呈现的每个单独三角型的数据。例如,要创建一个矩形,我们将其分为两个三角形。图4.14.1.3顶点索引 组成3D对象的三角形之间很多顶点是重复的,这会增加模型的细节和复杂程度。要解决这一问题我们需要用到索引这个概念:我们创建一个顶点序列和一个索引序列。顶点序列包括不同顶点的数据,索引序列包括顶点序列的索引数据,索引数据定义了这些三角形是怎样相互连接。4.2虚拟摄像机摄像机指定了观看者所能看见的空间范围,即是我们需要为多大范围的3D物体生成2D图像。摄像机拥有空间位置和方向并定义了可见范围。以下是摄像机的模型。 可见空间由摄像机的角度和近平面及远平面组成的平截头体来决定。因为当把显示屏目看作矩形时,用平截头体来表示显得更加容易理解。不在该范围内的对象是不可见的。 简单的设置虚拟摄像机的方法如下:首先,创建左手投影矩阵:图5.34.3渲染通道一旦我们描述了3D几何场景并设置了虚拟摄像机。我们的工作便是在显示屏上生成ZD图像。简单的渲染路径如下:图5.44.3.1本地坐标 本地坐标,或者说是模型空间,是定义对象三角形序列的坐标系。本地坐标用处在于它的建模过程简单。围绕其本地坐标系建模比直接在世界坐标中建模容易得多,本地坐标允许我们在不需要特别指定其位置、大小、方向的情况下构造模型。在渲染通道最初,还没有进行任何变换,所以一个模型的所有顶点都是相对于一个本地坐标系来说明的。4.3.2世界坐标当我们需要创建不同模型时,由于每个对象围绕其本地坐标系创建,这时需要将他们全部转换到一个全局的坐标系中,这是一个名为世界变换的过程。包括平移、旋转、和缩放操作,涉及到对象在世界坐标系中的位置、方向和模型大小。将本地坐标系模型转换到世界坐标系的简单过程如下:D3DXATRIX matworld:D3DXMATRIX matseale;D3DXMATRIX matTrans:D3DXMatrixsealing(&Matseale,1.0f,/模型在本地坐标系的x轴大小1.0f, /模型在本地坐标系的y轴大小1.0f ) ; /模型在本地坐标系的z轴大小/天空位置D3DXMatrixTranslation(&matTrans,30.0f, /模型在世界坐标系的x坐标60.0f, /模型在世界坐标系的y坐标10.0f): /模型在世界坐标系的z坐标/平移,大小转换到世界坐标系D3DXMatrixMultiply(&Matworld,&MatTrans,&Matseale);4.3.3观察坐标系 我们将摄像机转换到世界坐标系并将其旋转以保证它朝z轴正方向俯视。观察坐标系根据摄像机的位置摄像机空间的原点和方向重定位世界中的所有物体。 D3DXMTRIX matView; D3DXMatrixLookAtLH(&MatView, /存放结果的地址 &vFromPt, /Camera位置 &vLookatPt, /Camera方向 &vUpvec):; /y方向4.3.4背面拣选 背面拣选其实是一个很简单的概念。就是:所有的三角形面,面向我们的面将会被渲染出来(可见),否则将不被渲染(不可见,被拣选出来了)。举个例子:假如空间中有一个正方形面(要想象成一块方形纸片),我们把正面涂成红色,背面涂成蓝色,你把它拿在手里,如果你没有弄弯它,那你始终只会看见面向你的那个面,而不会看见它背面(有透视眼者另当别论)。那么这个“背面拣选”在Direct3D中有什么用呢?假如我们创建了一个封闭的立方体(要想象成一个方纸盒),那末里面的六个面将不会被我们看见,所以,也不用被渲染。“背面拣选”将使渲染更有效率。 那么怎么知道那个面被渲染而哪个面被拣选(不渲染)呢?一切都在你定义的顶点的顺序上。如果你定义的三角形是顺时针的,将会被渲染出来;但如果你把它翻过来,那它就变成逆时针的了,就不会被渲染出来。嗯,其实你可以指定哪个面将被拣选,顺时针或逆时针,但是Direct3D默认是拣选逆时针的三角形。4.3.4投影坐标系 投影变换将视棱锥转变为一个立方体。因为视棱锥的近端比远端小,所以这就产生了离摄像机近的物体被放大的效果,这就是透视如何被应用于场景的。在透视变换中,x和y方向的边界值是一1和1。Z方向的边界值分别是,0对应于前平面,1对应于后平面。这个矩阵根据指定的从摄像机到近裁剪平面的距离,平移并缩放物体。 D3DXMATRIX matProj: D3DXMatrixPerspeetiveFovLH(&matProj, D3Dx_PI/4, /y向可见的角度范围 800.0f/600.0f, /平截头体长宽之比 0.lf, /近平面距离 500.0f); /远平面距离g_pd3dDeviceSetTransfom(D3DTS_PR叮ECTION,&matProj);g_pd3dDevieeSetTransfom(D3DTS_WORLD,&matworld);4.3.5视口变换 从概念上来将,一个视口就是一个二维的矩形,一个三维场景投影在这个举行中。投影变换将顶点变换到视口使用的坐标系统中。在Direct3O中,可以用视口来声明下面列出的特性:v 用来限制渲染的屏幕空间视口(screen-space viewport)v 背景材质(backgroundmaterial)。视口可以清空为这一材质颜色v 后台深度缓冲(background depth buff),用来在渲染场景之前初始化z-buff 裁剪空间是用来定义要显示到渲染目标表面上的部分场景的区域。如果选择的视口太小,使得场景中的一部分不可见,那么就应该裁剪掉不可见的部分,以免系统再渲染这一部分。4.4Direct3D中的图形显示4.4.1顶点和索引缓存 顶点和索引缓存使用近似的方法和接口;顶点缓存只是包含顶点数据的相邻内存区域,类似的,顶点缓存是包含索引数据的相邻内存区域。因为顶点和索引数据可以放在显存中,所以我们用顶点缓存和索引缓存来保持数据,在显存中渲染数据比在系统内存中效率高得多。4.4.2创建顶点和索引缓存HRESULT IDireet3DDevice9:Create Vertex Buffer( UINT Length, DWORD Usage DWORD FVF, D3DPool Pool IDirect3DVertexBuffer9*PP Vertex B
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 装修公司转盘活动策划方案
- 虎年平台集卡活动方案
- 读书趣味活动方案
- 虹桥交友活动策划方案
- 装修公司拍摄策划方案
- 蒙氏幼儿园晨读活动方案
- 营地植树活动方案
- 消防中心参观申请报告标准模板
- 试吃活动特卖活动方案
- 保障能源公司信息安全措施
- 2025年中国环保型脲醛树脂数据监测报告
- 2025年广播电视台灯光音响师面试题集锦及解析
- 协同共进:黄骅市冬枣企业品牌与区域公用品牌耦合发展路径探究
- 风电叶片维修技术2025年市场分析报告
- 监考员基础知识培训课件
- 中国邮政储蓄银行2025年反洗钱知识考试题库(带答案)
- 公路养护作业标准与检查表
- 圆圈正义读书汇报
- 医学检验质控汇报
- 台湾光复课件
- (2025年标准)延迟退休协议书
评论
0/150
提交评论