《基于D3D的三维游戏引擎的设计与实现.pdf》由会员分享,可在线阅读,更多相关《基于D3D的三维游戏引擎的设计与实现.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6卷 第10期 2006年5月167121815(2006)1021431206科 学 技 术 与 工 程Science Technology and EngineeringVol.6No.10May 2006 2006Sci.Tech.Engng.基于D3D的三维游戏引擎的设计与实现樊 翠 王丽芳3(西北工业大学软件与微电子学院,西安710065)摘要 设计了一种基于Direct3D的三维游戏引擎的框架结构及各个模块的相互关系。并给出了纹理映射、加密解密、GU I的设计、和系统接口的实现方法。关键词 游戏引擎 三维游戏 纹理映射中图法分类号 TP317.4;文献标识码 B2006年1月19
2、日收到第一作者简介:樊翠,(1981),男,江西南昌人,西北工业大学硕士研究生,研究方向:网络游戏引擎,网络游戏设计。3 通信作者简介:王丽芳,女,西北工业大学计算机学院,副教授。2003年,我国科技部首次将网络游戏技术纳入国家863科技发展计划,这标志着国家对年增长率近3倍、带动上下游经济增长超过10倍的网络游戏产业态度明朗化。在网络游戏发展、运营、管理等诸方面,与日、韩、欧、美等国和地区相比,我国还存在较大差距。三维游戏中的关键就是游戏引擎的研发。研究三维游戏引擎中的关键技术成为当前的重点。游戏引擎就是在对部分通用技术细节进行整理和封装的基础上,形成一个面向游戏应用的应用程序接口(API)
3、函数(我们称之为“引擎”),使得游戏开发人员不必再关心底层技术的实现细节,大大减少开发人员的工作难度和工作量,缩短开发周期。所谓引擎,是借用了机器工业的同名术语,表明其在整个系统中的核心地位。在这里,也可以把它称之为“支持应用的底层函数集”,或者说是对特定应用的一种抽象。引擎最大的特点就是具有“驱动性”,即引擎仅仅在功能上支持某个方面的应用,但具体的实现细节则依赖于应用本身。其次,引擎具有“完整性”的特点,即引擎是能完整实现某个方面功能的函数集。第三,引擎还具有“独立性”的特点,即引擎可以不依赖于具体的应用而独立存在。游戏引擎一般包含渲染、编辑工具、物理学、人工智能、网络等内容。1D irec
4、t3D硬件访问方式 1通常的应用程序对硬件设备的访问是通过调用图形设备接口(graphics device interface,GD I)来实现的。由于GD I的技术局限,使得应用程序不能高效地访问或操作硬件资源,难以用来开发复杂的三维应用程序如三维游戏、OpenGL和Direct3D,以提供了更专业的图形硬件访问接口,见图1。Open2GL的三维重建功能主要通过直接访问DD I来实现。由于DD I的通用性降低了对图形硬件的访问效率。Direct3D则提供了访问图形设备的立即模式,该模式通过硬件抽象层(hardware abstraction lay2er,HAL)获得更高效率。HAL还允许图
5、形硬件在渲染、光栅化等方面保留自己独特的性能,从而获得更优化的显示效果。图1W indow环境下不同三维应用程序访问图形厉件的方式2 三维游戏引擎的框架结构游戏引擎是游戏中与具体的游戏无关的核心技术部分,而游戏的部分就是场景和角色模型、动画、声音和代码等其他控制部分。经过游戏业的不断的发展,如今的游戏引擎己经发展为一套由多个子系统共同构成的复杂系统。一般这些引擎都是3D游戏引擎,从建模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业的编辑工具和插件,几乎涵盖了开发过程中的所有重要环节。2.13D游戏引擎的一般功能组成 221111 光影特效场景中的光源对处于其中的人和
6、物的影响方式。游戏的光影效果完全是由引擎控制的,折射、反射等基本的光学原理以及动态光源、彩色光源等高级效果都是通过引擎的不同编程技术实现的。21112 渲染引擎它是引擎最重要的功能之一,负责游戏画面的实时渲染(real2time rendering)。当3D模型制作完毕之后,美工会按照不同的面把材质贴图赋予模型,这相当于为骨骼蒙上皮肤,最后再通过渲染引擎把模型、动画、光影、特效等所有效果实时计算出来并展示在屏幕上。渲染引擎在引擎的所有部件当中是最复杂的,它的强大与否直接决定着最终的输出画面质量。21113 动画系统目前游戏所采用的动画系统可以分为两种:一是骨骼动画系统,一是模型动画系统。前者用
7、内置的骨骼带动物体产生运动,比较常见;后者则是在模型的基础上直接进行变形。引擎把这两种动画系统预先植入游戏,方便动画师为角色设计丰富的动作造型。其中物理系统控制物体的运动遵循固定的规律;例如,当角色跳起的时候,系统内定的重力值将决定他能跳多高,以及他下落的速度有多快;子弹的飞行轨迹、车辆的颠簸方式也都是由物理系统决定的。碰撞检测汇(collision detection)是物理系统的核心部分,它可以探测游戏中各物体的物理边缘。当两个3D物体撞在一起的时候,这种技术可以防止它们相互穿过。21114 输入控制模块引擎还有一个重要的职责就是负责玩家与电脑之间的沟通,处理来自键盘、鼠标、摇杆和其它外设
8、的信号。如果游戏支持联网特性的话,网络通信代码也会被集成在引擎中,用于管理客户端与服务器之间的通信。21115 音效模块处理游戏世界所有音效,包括背景音乐和各种事件声音的管理和播放,一些高性能的游戏引擎还能实现3D音效和环境环绕音等复杂的功能。21116 人工智能模块为游戏中的非玩家控制角色的行为和决策提高智能支持,游戏中人工智能在现代游戏引擎中越来越重要,它直接影响到游戏的可玩性和游戏设计的复杂性。2.2 三维游戏引擎各功能模块之间的关系游戏引擎中的每个模块并不是独立存在的,模块与模块之间有调用与被调用、包含与被包含的关系。图2描述的是一个基于Direct3D的3D游戏引擎模块图。3 游戏引
9、擎的部分关键技术研究3.1 纹理映射技术 3纹理映射技术是近几年来发展最快的技术之一,广泛应用于三维真实感图形的生成与显示中。运用纹理映射可以方便地制作真实感图形而不花更多的时间去考虑物体的表面细节,纹理映射的本质是对三维物体进行二维参数化,即先求得三维物体表面上任一点的二维(u,v)参数值,进而得到该点的纹理值,最终生成三维图形表面上的纹理图案。在光滑曲面上添加纹理图案的核心问题是映射,因此纹理问题可以简化为从一个坐标系到另一个坐标系的变换。其中至少涉及两个映射,一个是从纹理空间到景物空间,有时也称为曲面参数化;2341科 学 技 术 与 工 程6卷图2基于Direct3D的3D游戏引擎模块
10、图注:虚箭头表示调用关系。第二个映射是从景物空间到图像(屏幕)空间,即取景变换。通常,这两个变换被合成为一个变换。如果纹理图案定义在纹理空间中一个正交坐标系(u,v)中,曲面定义在景物空间的正交坐标系(x,y,z)中,它在参数空间(,)的表示为x(,),y(,),z(,),那么在曲面上添加纹理将涉及在两曲面之间确定或指定一个映射函数。例如,从纹理空间到参数空间的映射为:=f(u,v),=g(u,v)(1)从参数空间到纹理空间的逆映射为:u=r(,),v=s(,)(2)OpenGL提供两类纹理,其中一类纹理图像的大小必须是几何级数的,另一类MipMap纹理可为任意大小。3.2基于XML的GUI(
11、图形用户界面)的设计方案 为了提高游戏开发的效率,特别是图形用户界面的开发,用XML来描述游戏中的图形界面显得非常重要。所有的界面如对话框、按纽、编辑框、列表框等都是通过读取相应的XML文本来实现的。下面举一个游戏登陆界面为例:dialog id=”1”text=”游戏登入框”xpos=”0”ypos=”0”height=”200”width=”300”static id=”2”text=”用户名”xpos=”100”ypos=”40”height=”20”width=”100”/staticedit id=”3”text=”xpos=”180”ypos=”40”height=”20”widt
12、h=”200”type=”0”/editstatic id=”4”text=”密码”xpos=”100”ypos=”80”height=”20”width=”100”/staticedit id=”5”text=”xpos=”180”ypos=”80”height=”20”334110期樊 翠:基于D3D的三维游戏引擎的设计与实现width=”200”type=”1”/editbuttom id=”6”text=”确定”xpos=”100”ypos=”130”height=”20”width=”100”/buttombuttom id=”7”text=”取消”xpos=”180”ypos=”1
13、30”height=”20”width=”200”/buttom/dialog3.3 游戏引擎的数据加密和解密为了防止游戏数据的被非法截取,游戏引擎中需要有个加解密模块。可以运用两种加解密算法,三重DES算法4 和RC6算法5。其中RC6比DES算法快,一般用于游戏登入时;而三重DES算法虽然比较慢,但是安全性更高,可用于游戏登入以后的数据传输加解密。两种加密算法同时运用在一个游戏系统中可以大大提高数据的安全性。3.4 游戏引擎的系统接口的设计为了进一步提高游戏开发者的效率、游戏引擎模块的高隐藏性和游戏引擎的可拓展性,设计一个好的系统接口对于一个游戏引擎来说显得尤为重要。通过注册类的成员函数和
14、成员变量的地址和虚函数的原理对游戏引擎中各个模块中的类再次封装,以便实现游戏引擎的高隐藏性和拓展性。下面以游戏中场景接口设计为例阐述设计过程。图3 无场景接口的游戏引擎和游戏客户端交互图3.411 一个没有场景接口的游戏引擎和游戏客户端程序的交互过程 从图3可以看出,游戏客户端直接调用场景模块中的各个子模块,如人物角色模块、灯光模块和天空模块等。这种直接调用的方式有以下几个缺点。第一,引擎场景模块的隐藏性差。场景模块中的每个子模块对于客户端来说都是可见的,客户端可以随心所欲地调用场景模块中的信息。第二,引擎的可拓展性较弱。客户端直接调用引擎场景模块中的函数和成员变量,这样会导致引擎中场景模块的
15、升级困难。举个例子,当场景中某个函数发生变化时,客户端程序必须重新编译。而场景模块是客户端调用非常频繁的一个模块。这样一来,势必导致游戏开发和维护量大大增加。3.4.2 拥有场景接口的游戏引擎和游戏客户端程序的交互过程 增加场景接口以后,客户端程序只需要调用场景接口模块就能访问到场景模块中的任何信息,而接口本身只包含场景模块中的函数和成员变量地址。这样一来,场景模块就完全隐藏了。同时,把场景模块生成DLL,这使得场景模块的更新和升级更为容易。DLL中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。如图4所示,场景接口类(Sce2neInterface)
16、是场景模块中人物(Human)、天空(Sky)和灯光(Light)等类的父类,并且场景接口类(SceneInterface)保存了各场景类(如Human)的需要暴露接口的成员函数和成员变量的地址。场景对象工厂类(SceneObjFactor)作为所有场景API的父类,调用了场景接口类(SceneInterface),记录了场景模块各类需要暴露接口的的成员函数和成员变量的地址。但是,要获取一个类中的所有信息,除了获取类中的成员函数和成员变量以外,还必须获取类中的虚函数。巧妙的是,场景接口类(Sce2neInterface)正好是场景模块各类的父类,通过父类的指针可以访问子类的虚函数。而场景对象工
17、厂类(SceneObjFactor)正是通过调用场景模块中的DLL输出函数(CreateSceneObj)得到一个指向场景模块中某个类的指针,该指针的类型为其父类类型即(SceneInterface3),这样是为了场景模块信息的隐藏。在实现了对场景类的各种信息的获取以后,就可以对信息进行再次封装。类HumanAPI、SkyA2PI、LightAPI就相当与类Human、Sky、Light的映射。4341科 学 技 术 与 工 程6卷图4 具有场景接口的游戏引擎和游戏客户端UML交互图3.4.3 游戏场景模块接口的详细设计 场景接口类(SceneInterface)的设计在场景接口类(Scene
18、Interface)中可以用两个哈希表来分别存放成员函数和成员变量的信息。成员变量的地址可以通过类的起始地址和变量在类中的地址偏移得到(即:成员变量的地址=类的起始地址+变量在类中的地址偏移量)。而存储成员变量所需的地址大小正好是变量本身类型的大小。因此,要存储成员变量需要该变量所在的类名、成员变量名、成员变量类型和该变量的别名(暴露给游戏客户端调用)。成员函数的存储则相对较为简单,只需要保存函数地址。游戏场景模块中的场景类的设计游戏场景中各类只需在原有设计的基础上做以下两个方面的改变:第一,场景类都必须继承场景接口类(ScriptInt2erface);第二,场景类的构造函数中需注册要暴露给
19、游戏开发的成员变量和成员函数地址。场景模块中的DLL输出函数(CreateSce2neObj)的设计场景接口通过传入一个ScriptInterface类型的指针地址和场景类标识名得到一个ScriptInterface类型的对象指针。游戏场景对象工厂类(SceneObjFactor)的设计从图4中我们可以看出,所有场景API类(如HumanAPI)都必须继承SceneObjFactor。第一,需要把SceneObjFactor类设计为模板类。这样做是为了得到子类的类标识名。第二,需要定义一个场景接口类(SceneInter2face)指针,用于记录了场景模块各类需要暴露接口的成员函数和成员变量的
20、地址。第三,需要通过场景模块DLL的输出函数并把相应的参数传入后得到一个ScriptInterface类型的指针。游戏场景接口API类(以HumanAPI为例)的设计。场景接口API类是对场景模块各类的封装,通过地址访问场景模块中的信息。客户端程序只需要调用该场景接口API类就能访问到场景模块中的对应类的所有注册了的信息。第一,在HumanA IP类的构造函数中通过哈希表得到场景类中成员函数地址和成员变量地址。第二,对各成员函数二次封装。第三,对类中虚函数的二次封装。(下转第1450页)534110期樊 翠:基于D3D的三维游戏引擎的设计与实现Based on W insock Control
21、 of VB to Realize C/S Network Commun icationGONGAn(China University of Petroleum,Dongying 257061)AbstractW insock control is a network program interface ofW indows.The attribute,method and event ofW in2sock control in VB has been introduced.And a si mplemethod of the use ofW insock control to realiz
22、e network com2munication is presented.Key wordsW insock controlTCPC/Snetwork communication(上接第1435页)第四,把类名通过模板参数传给父类SceneObjFac2tor。4 结束语根据部分的设计思想,作者所在的公司正在开发商业的3D游戏引擎。引擎的设计思路主要来源于国外的开源引擎OGRE和NELUBA2。相信本文对于游戏引擎开发者有一定的参考价值。参 考 文 献1 张钧,吴云东,张强,王慧.利用Direct3D的地形三维快速重建法.海洋测绘,2005;25(3):6062,662 李辉,吴建国,游志胜
23、,等.基于微机的面向对象三维图形引擎.计算机工程,2001;27(4):1691733 左鲁梅,黄心渊.纹理映射技术在三维游戏引擎中的应用.计算机仿真,2004;21(10):1461484 傅德胜,孙文静.基于三重DES与ECC相结合的数据加密方案的实现.计算机应用与软件,2002:(11):5 宋宇波,疏朝明,曹秀英.RC6加密算法在VPN中的应用.通信技术,2001;(07):6 蓝雯飞.C+中的多态性和虚函数.微计算机应用,1999;(01):7 于继江.动态嵌入式DLL木马实现方法.电脑知识与技术,2005;(21):The Design and I mplement of the
24、Game Engine Base on D irect3DFANCuiWANG Lifang3(Department of Software andMicro-electronics,Northwestern Polytechnic University,710065)AbstractA 3D game engine based on Direct3D is designed.Then the implementation of texture mapping,GU I,the encryption system and the system interface are presented.Key wordsgame engine3D gametexture mapping0541科 学 技 术 与 工 程6卷