ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:53.42KB ,
资源ID:21488566      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21488566.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(精品基于Direct3D的投篮游戏Word格式文档下载.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

精品基于Direct3D的投篮游戏Word格式文档下载.docx

1、Now games has gone deep into the peoples lives, almost everyone played games. With more and more people increasing interest in games, the game industry is becoming to be a developing industry. At the same time, game design has become the dream of many players. This is a space shooting game design ba

2、sed on DirectX technology, using Visual C+ in programming. DirectX is a widely used game design and develop tool (SDK) which is supplied by Microsoft Corporation. It basically covers the 2D, 3D, sound, control, and network, makes programmer without dealing directly with the hardware, greatly enhanci

3、ng the simplicity and efficiency of the development of game. This design is based on Direct3D, it has graphic render module, user interface module, physic module, camera module. Then implement these modules by coding, so we have a simple basketball game.Keyword: Game Design, DirectX, Basketball1.绪论1

4、.1 课题背景我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体。我们又生活在一个充满信息的世界中,能否尽快地理解并运用这些信息将直接影响事业的成败,所以我们需要用一种最直接的形式来表示这些信息。最近几年计算机图形学的发展使得三维表现技术得以形成,这些三维表现技术使我们能够再现三维世界中的物体,能够用三维形体来表示复杂的信息,这种技术就是可视化(Visualization)技术。可视化技术使人能够在三维图形世界中直接对具有形体的信息进行操作,和计算机直接交流。这种技术已经把人和机器的力量以一种直觉而自然的方式加以统一,这种革命性的变化无疑

5、将极大地提高人们的工作效率。可视化技术赋予人们一种仿真的、三维的并且具有实时交互的能力,这样人们可以在三维图形世界中用以前不可想象的手段来获取信息或发挥自己创造性的思维。机械工程师可以从二维平面图中得以解放直接进入三维世界,从而很快得到自己设计的三维机械零件模型。医生可以从病人的三维扫描图象分析病人的病灶。军事指挥员可以面对用三维图形技术生成的战场地形,指挥具有真实感的三维飞机、军舰、坦克向目标开进并分析战斗方案的效果。更令人惊奇的是目前正在发展的虚拟现实技术,它能使人们进入一个三维的、多媒体的虚拟世界,人们可以游历远古时代的城堡,也可以遨游浩翰的太空。所有这些都依赖于计算机图形学、计算机可视

6、化技术的发展。随着三维技术的进步,对于普通电脑用户最大的感受就是电脑游戏的发展了,如今游戏的画面基本上全部都是3D化,在游戏市场的巨大利益推动下,游戏开发商和硬件厂商不断推陈出新,技术的发展可以用一日千里来形容。1.2 国内外研究现状和发展趋势目前游戏开发采用的主要有OpenGL与DirectX两种图形库。目前的游戏引擎都是基于这两种图形库来实现图形的渲染。OpenGL是在SGI等多家世界闻名的计算机公司的倡导下,以SGI的GL三维图形库为基础制定的一个通用共享的开放式三维图形标准。目前,包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都采用了OpenGL做为三维图形标准,

7、许多软件厂商也纷纷以OpenGL为基础开发出自己的产品。OpenGL目前版本为2.0,支持可编程渲染管线。DirectX是伴随着视窗操作系统的推出而出现的,DirectX的原名为 DirectX SDK(或Game SDK ),英文原意:DirectX Software Development Kit,是微软所开发出的一套主要用在设计多媒体、2D、3D 游戏及程序的 API ,其中包含了各类与制作多媒体功能相关的组件(Component),各个组件提供了许多处理多媒体的接口与方法。从这点介绍我们可以领会到DirectX是为游戏而诞生,从DirectX1.0到DirectX3.0,微软让它的Di

8、rectX开始在游戏领域树立起3D的标杆,尽管当时的3D很粗糙,但是雏形已初步形成,到DirectX7开始,随着OpenGL和Glide势力日渐衰弱,DirectX的霸气初现,到DirectX8发布后,DirectX已经在3D游戏领域树立起它的的权威地位,引人的Ps和Vs的出现令OpenGL和Glide自叹不如,DirecetX9.0,更是如日中天,权威地位无人能撼动。目前DirectX在桌面游戏方面更受开发者的欢迎。目前版本为10.0。1.3 本文结构本文分为五章,第一章为绪论。第二章为技术原理,主要简单介绍本设计中用到的一些基本原理。第三章为系统设计,主要讲解系统的设计方案。第四章为系统的

9、实现方案,讲解系统的具体实现。第五章展示系统的运行效果。2.技术原理2.1数学基础知识几何学中,我们用有向线段表示向量,向量的两个属性是它的长度和它的顶点所指的方向,因此,可以用向量来模拟既有大小又有方向的物理模型。向量为在3维空间中表示方向提供了方便.2.1.1 3D坐标系3D 坐 标 系中使用最广泛的是笛卡尔坐标系,它基于空间中三条相互垂直的坐标轴:X轴、Y轴和Z轴。要定义空间中的一个点P,需要三个坐标:X,Y, Z写成P(X,Y, Z)。三个坐标轴构成三个平面:X-Y平面、X-Z平面和Y-Z平面。这三个平面将整个空间分成8个子空间,在3D笛卡尔坐标系中共有8个卦限。 图2.1.1 左手坐

10、标系3D笛卡尔坐标系包括左手坐标系和右手坐标系两种。左手坐标系(LHS)假设X-Y为纸张上或屏幕上的水平轴和垂直轴,正Z轴指向纸内或屏幕内。右手坐标RHS)假设X-Y为纸张上或屏幕上的水平轴和垂直轴,正Z轴指向纸外或屏幕外。1. 向量相等几何学上,有同样方向和长度的两个向量相等。数学上,我们说有同样维数和分量的向量相等。例如:如果ux = vx, uy = vy, 且 uz = vz.那么(ux, uy, uz) = (vx, vy, vz)。在代码中我们能够用“=”判断两个向量相等。同样的,我们也能用“!=”判断两个向量不相等。2. 向量的模几何学上,向量的大小是有向线段的长度。知道向量的分

11、量,利用下面的公式我们就能计算出向量的大小。图 向量的模u表示向量u的长度。3. 标准化向量标准化向量是让向量的大小等于1,即被叫作单位向量。我们能利用向量大小以及各个分量把一个向量标准化,就象这样:图 标准化向量我们这样表示单位向量。4. 向量相加我们能够通过分别把两个向量的各个分量相加得到向量之和,注意在相加之前必须保证它们有相同的维数。图 向量相加下图显示的是几何学上的向量相加。图 几何上的向量相加5. 向量相减和加法类似,通过分别把两个向量的各个分量相减得到向量之差。再次重声两个向量必须是相同维数。图 向量相减下图显示的是几何学上的向量相减。图 几何上的向量相减6. 数乘我们能用一个标

12、量与向量相乘,就象名字暗示的一样,向量按比例变化。这种运算不会改变向量的方向,除非标量是负数,这种情况向量方向相反。图 向量数乘7. 点乘数学上定义点积是两个向量的乘积。按下面等式计算:图 向量点乘上面的等式不能很明显的体现几何上的意义。利用余弦定律,我们能够发现它们的关系。u v =|u|v|cos,表示两个向量的点积是它们的模和夹角的余弦之积。因此,如果u 和v都是单位向量,那么u v就是它们夹角的余弦。一些点积中有用的特性:假如u v = 0,那么uv。 v 0,那么两个向量的角度小于90度。 v 0,那么两个向量的角度大于90度。8. 叉乘第二种乘法在向量数学中叫叉积。不象点积,结果值

13、是一个标量,叉积的结果值是另一个向量。通过把两个向量u和v相乘得到另一的向量p,向量p垂直于u和v。也就是说向量p垂直于u并且垂直于u。十字相乘就象这样计算:图 向量叉乘如果u 同样的如果j k = 0并且j i = 0那么我们便能知道j既垂直于k又垂直于i的。当我们在编程时,通常都使用4x4矩阵来进行矩阵变换。因为下面所讨论的矩阵变换都是基于4x4矩阵的。1. 矩阵相乘矩阵相乘在3D计算机图形学中是非常重要的运算。通过矩阵相乘,我们能变换向量并且,将不同向量转换到一起。为了得到矩阵之积AB,A的列数必须等于B的行数。假如这个条件不满足,就不能相乘。考虑两个矩阵,A 和 B,分别是23 和 3

14、3,我们看乘积AB是可以计算的,因为A的列数等于B的行数。注意乘积BA,它们是不能计算的,因为B的列数不等于A的行数。由此说明:一般情况下矩阵乘法不满足乘法交换律(也就是, ABBA)。我们说“一般不可交换”因为有一些矩阵乘法的实例还是可以的。知道了矩阵乘法的计算方法,现在我们就能给出精确的定义:假如A是一个mn的矩阵,B是一个np的矩阵,那么它们之积AB可计算并且是一个mp 的矩阵C, C的成员ij 等于A的第i个与B的第j个相乘:图 矩阵乘法2. 矩阵平移通过与一个特定的矩阵相乘来达到矩阵平移的目的。例如有向量(x,y, z, m ),将其沿x轴移动dx个单位,沿y轴移动dy个单位,沿z轴

15、移动dz个单位,只需将其与下面矩阵相乘。图 平移矩阵3. 矩阵旋转例如向量(x,y, z, m)围绕x轴旋转弧度,只需与下面矩阵相乘:图 x轴旋转矩阵当要围绕y轴旋转弧度,只需与下面矩阵相乘图 y轴旋转矩阵当要围绕z轴旋转B弧度,只需与下面矩阵相乘图 z轴旋转矩阵4. 矩阵缩放通过矩阵相乘可以实现矩阵缩放例如向量(x,y,z,m),沿x轴缩放dx个单位,沿y轴缩放dy个单位,沿z轴缩放dz个单位,只需将其与下面矩阵相乘。图 缩放矩阵2.2 Direct3D基础2.2.1 Direct3D概述Direct 3D 是一种低层图形API( Application Programming Interf

16、ace,应用程序接口), 它能让我们利用3D 硬件加速来渲染3D 世界。我们可以把Direct3D看作是应用程序和图形设备(3D硬件)之间的中介。通过利用Direct3D API编程,能够屏蔽许多底层实现的技术细节,缩短开发周期。下图显示了Direct3D,H AL(Hardware Abstraction Layer,硬件抽象层)及硬件之间的关系。其中HAL即硬件抽象层,是一组指示设备执行某种操作的特殊设备代码的集合,由设备制造商实现,Direct3D不能直接作用于图形设备,通过使用HAL与硬件图形设备协同工作。如下图所示,Direct3D应用程序最终通过图形卡的设备驱动程序访问图形硬件。由

17、于HAL存在,Direct3D将可以不需要了解某个设备的具体硬件特性,使它能够独立于硬件设备。Direct3D提供了相应的方法在运行时检查设备是否能执行某项操作。图2.2 Direct3D层次2.2.2 Direct3D重要概念1. 顶点: 一个场景是多个物体或模型的集合。一个物体可以用三角形网格来近似表示,3D世界中最基本的图元就是三角形,一个多边形的两边相交的点叫做顶点。为了描述一个三角形,我们通常指定三个点的位置来对应三角形的三个顶点,这样我们就能够很明确的表示出这个三角形。3D物体中的三角形经常会有许多共用顶点。为了解决复杂精细场景重复顶点占用更多的渲染带宽,我们在创建一个顶点列表的同

18、时也创建一个索引列表。顶点列表包含所有不重复的顶点,索引列表中则用顶点列表中定义的值来表示每一个三角形的构造方式。通常每个顶点都包含如下信息:x,y,z坐标值、颜色值、用于计算灯光的法线和纹理坐标(u, v)。2. 表面:是一个像素点阵,主要用来存储2D图形数据。表面数据就像一个矩阵,像素数据实际上是存储在线性数组里面。Direct3D里面的IDirect3DSurface9接口用来描述表面,这个接口提供一些方法来直接操作表面数据。3. 多重采样(MultiSampling) :由于使用像素来表示图像,在显示时会出现锯齿状。MultiSampling就是使图像变得平滑的技术。它的最普通的用法就

19、是全屏抗锯齿。D3DMULTISAMPLE_TYPE枚举类型能使我们制定全屏抗锯齿的质量等级。4. 交换链和页面交换:Direct3D通常建立2-3个页面组成一个集合,即为交换链,通常由IDirect3DSwapChain接口来表示。交换链和页面交换技巧被用在使两帧动画之间过渡更加平滑。通常由Direct3D自己去管理。5. 深度缓冲:深度缓冲是一个表面,但它不是用来存储图像数据而是用来记录像素的深度信息。深度缓冲为每一个像素计算深度值,并进行深度测试。通过深度测试我们可以知道哪个像素离摄像机近从而把它画出来。这样就可以只绘制最靠近摄像机的像素,被遮住的像素就不会被画出来。6. 顶点处理:顶点

20、是3D图形学的基础,它能够通过两种不同的方法来处理,一种是:软件顶点处理(Software Vertex Processing),二种是:硬件顶点处理(Hardware Vertex Processing)。前者总是被支持而且永久可用,后者要显卡硬件支持顶点处理才可用。使用硬件顶点处理总是首选,因为它比软件方式更快,而且不占用CPU资源。如果一块显卡支持硬件顶点处理的话,也就是说它支持硬件几何变换和光照计算。7. 设备能力:Direct3D支持的每一种特性都对应于D3DCAPS9结构的一个数据成员,初始化一个D3DCAPS9实例应该以你的设备实际支持的特性为基础。因此,在我们的应用程序里,我们

21、能够通过检测D3DCAPS9结构中相对应的某一成员来检测设备是否支持这一特性。2.2.3 Direct3D初始化初始化步骤:1. 获得 IDirect3D9接口指针。2. 检查设备的技术特性,确定显卡是否支持硬件顶点处理。3. 初始化一个D3DPRESENT_PARAMETER结构实例,这个结构包含了许多数据成员,它允许我们指定将要创建IDirect3DDevice9接口的特性。4. 创建一个基于已经初始化好了的D3DPRESENT_PARAMETER结构的IDirect3DDevice9对象。2.3基本3D流水线简介大家都知道,一个3D场景中,我们见到的任何光辉灿烂的物体,都是由一个一个面片

22、组成的。而装载面片位置信息的就是其各个定点的三维坐标。这是用来在模型中存储的,而要把物体显示在屏幕上,还需要将它们转换成显示器上的二维坐标。这就需要对每个点实施一套 3 to 2 的转换公式,在Direct3D中叫做“几何流水线”(Geometry Pipeline)。 Direct3D中的Geometry Pipeline如下图所示:图2.3.1 3D流水线每渲染一帧,我们都要用到这条流水线把所有定点的坐标转化成当前要显示的位置。不过放心,D3D不会改变你原有的顶点坐标,变换出的顶点数据会存放在新的地方用来渲染。想一想物体,也就是面片,也就是顶点要显示在屏幕上,其位置取决于什么呢?首先它一定

23、取决于该点在场景中的位置,然后还在于你从什么角度看,更详细一点就是我的眼睛在哪儿,我注视着哪儿,以及我的视野宽窄等等。对于每个独立被引入程序的mesh物体,它们的坐标系、坐标原点理论上都应该是不同的,其顶点也都是用局部坐标表示的。那么要做统一的变换,首先应将它们引入到同一个坐标系下,也就是我们称之为“世界坐标系”的坐标。这个变换也因此得名世界变换(World Transform)。对物体所需要做的移动、旋转等工作也是要在此时完成的。经过了以上一些操作后,每个顶点(也就是每个物体)在整个场景中的位置就如你所愿确定下来了。要把它们映射到屏幕上,还要确定观察者(你可以叫他玩家、摄影机都无所谓)的位置

24、和视角。我们是要把所有的点变换到新建立的以观察者为基准的坐标系下。这个步骤就是“视图变换”(View Transform)。实际上和后面要说的射影变换相比,这两种变换并没有什么本质区别。有时候为了效率,可以把世界变换与视图变换合并为一个世界视图变换。这不就是说你一开始就选择观察者的位置为世界坐标系的原点,并按照视角来确定坐标轴么?后面一步是“射影变换”(Projection Transform)。实际上,我们要做的所有坐标转换归根结蒂是要把三维的点投影到二维的屏幕上,如图所示 图2.3.2 射影变换经过上述两次坐标转换后,我们已经让屏幕平行于坐标轴平面了,也就是说,经过一些比例范围的调整,理论

25、上我们能从点的三维坐标中的某两个直接得到期待已久的屏幕坐标。但是别急,此时得到的坐标绘出的图就像我们小时候画的那些画一样没有立体感。比如上图那个矩形,因为近大远小,在我们的视野中应该看起来像个梯形。但是如果我们不做任何处理就直接把它的顶点(已经过前两重变换)投影到显示器上(假设平行于图中的XY平面)这样还是一个方方正正的矩形。想象一下,投影实际上就是把空间中的所有点都压扁,扁到某一个平面上。这样出来的图形自然不会有透视效果。(之所以有近大远小是因为人眼的凸透镜成像,其像高是物距的减函数。这里不多说了)你可能想到让每个点像这样斜着投影,但是仔细想想,如何斜着投影呢?等你想明白了再回答这样做真的方

26、便么?于是另一种办法就是把整个空间范围变成一个棱台(里面的点随之进行放缩)。图2.3.3 投影效果相对来说把较远端缩小会造成数据的不准确,因此采用放大较近端。对每个点,我们进行最后一步变换就是根据其远近程度进行一下放缩。D3D把剪切也纳入此流水线中,尽管它没对顶点作任何变换,只是剔出那些不用的点。以上就是D3D中的几何流水线。幸运的是,我们并不需要自己去写代码来完成这些转换。实际上我们只需要设计好参数,调用相应的D3D函数设置上面提到的各种决定因素,它会在渲染画面的时候把每个顶点自动转化成所需的屏幕坐标的。正因为这一套流水线操作的通用性和规范性,各种3D渲染引擎都将它封装了,而当代很多先进的显

27、卡都将其固化到硬件线路上,这样大大提高了渲染速度。下面我们来看看一些具体的实施。在计算机图形学中,坐标的变换通常是通过与一个矩阵(Matrix)相乘来实现的。基本变换包括平移、缩放、旋转都用此方法完成,其他任何的变换,包括不同坐标系之间的互化,也都是通过这三种基本转换完成的。因此说,Matrix无处不在 , 在我们的周围,就在这间屋子里。你能在窗户往外看到它,在电视里看到它。具体到三维坐标系中,定义某点的坐标为(X,Y,Z)则用(X,Y,Z,W)乘以一个相应的4X4矩阵就可以得到新的坐标(X,Y,Z,W),这里的W自有用处,一般是1。还有一点很重要,一个矩阵就代表着一重变换,而几个矩阵的乘积就

28、代表着多重变换的合变换。那么在这条流水线中,按规范我们至少需要三个矩阵来实现以上三步变换,也就是世界矩阵(World Matrix)、视矩阵(View Matrix)以及射影矩阵(Projection Matirx)。世界矩阵有时候需要我们自己填写,根据我们的各种变换需要来填写一个D3DXMATRIX结构体(其成员就是各行各列的数值),之后通过调用IDirect3DDevice9:SetTransform( D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX *pMatrix )设置世界矩阵为你填好的那个。参数意义如下:D3DTRANSFORMSTATETY

29、PE State代表你要设置的变换类型。D3DTS_WORLD,D3DTS_VIEW,D3DTS_PROJECTION分别表示要射知识界、视图、射影三种变换 CONST D3DMATRIX *pMatrix指向一个矩阵结构的指针,就是你所要用到的矩阵。后面的两个矩阵也要通过此函数设置。D3D中,三个变换矩阵是要存放在固定位置的,每次执行流水线,D3D就依次从这三个位置读取矩阵信息,并乘以所有的点,得到新的点的坐标,这个过程是不用我们操心的。我们调用SetTransform()就是要把填充好的矩阵放进这三个位置中的某一个,第一个参数表示了哪一个。在设置视矩阵时,我们先要很清楚地(在脑子里或纸上)

30、建立好“视坐标系”。这个坐标系以观察着为原点,沿着视线方向(观察着注视点方向)为纵深方向(也就是Z轴方向)。仅有两个点还不足以确定一个三维坐标系,我们还需要一个参考点,能与另两个点构成某一个坐标平面。这样的坐标系构件起来后,就可以根据两个坐标系的变换填充视矩阵了。D3D提供了函数 D3DXMATRIX *D3DXMatrixLookAtLH( D3DXMATRIX *pOut, CONST D3DXVECTOR3 *pEye, CONST D3DXVECTOR3 *pAt, CONST D3DXVECTOR3 *pUp);或 D3DXMATRIX *D3DXMatrixLookAtLH( 参数同 ),区别仅在于前者用于左手系而后者用于右手系

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1