基于DirectX库的游戏引擎的实现
2017-04-26董佳驹詹玲超秦兴杰王坡
董佳驹+詹玲超+秦兴杰+王坡
摘 要:DirectX库不只是图形的API函数,也是实现多用途的API函数,在此基础上借鉴Unity引擎组件+对象框架的模式设计了一款基于DirectX库的游戏引擎。该文的主要工作是引擎组件和对象的实现。引擎组件主要包括渲染组件、物理组件和动画组件,其中渲染组件从变换、网格和材质3个方面实现。引擎对象包括三大系统,分别是摄像机系统、地形系统和光照系统。这样就实现了一个游戏引擎。
关键词:DirextX库 游戏引擎 组件对象
中图分类号:TP393 文献标识码:A 文章编号:1672-3791(2017)02(c)-0008-02
DirectX库是微软针对Windows操作系统的非实时性推出的一个开发库,目的是让图形图像、动画、多媒体和游戏程序开发人员在Windows开发环境下很容易地编制高级程序。该游戏引擎就是基于该库设计制造的。一个游戏就如同一辆汽车,是由一个个的零部件拼接组装而成。而游戏引擎和游戏是部分对整体的关系,就如同汽车的发动机一样,是一个不可或缺的载体。游戏引擎借鉴了Unity引擎组件+对象的框架模式。该框架的主要特点是用一个对象来表示三维空间中的位置。该框架的最大亮点是实现脚本模块。有了这样的框架就能进行引擎组件和对象的实现。组件主要分为渲染组件、物理组件动画组件,对象包含摄像机、地形以及光照。
1 引擎组件
引擎组件是实际功能的承载者,是整个代码的核心。这里按照功能分类,分别为渲染组件、物理组件和动画组件。
1.1 渲染组件
渲染组件主要由变换、网格和材质来承载。在游戏里方位是一个重要的属性,方位包含物体的位置、方向和大小,主要依靠幾何坐标变换来实现,变换由平移、旋转和缩放构成,每一个变换可以由一个矩阵来表达和计算,这就是变换组件的实现。
在游戏里,物体模型是通过多边形网格来逼近表示,网格模型文件可以将物体轮廓的顶点位置、纹理和材质等存储在一个外部文件中。但是网格模型可能包含一些冗余的数据,就有必要通过算法对网格模型进行优化,删除一些多余的信息。从外部文件中通过网格组件加载并渲染该网格是该组件的主要作用,这就是网格组件的实现。
还有,材质也是物体的一个重要属性,材质决定物体能够反射哪些颜色的光线。在DirectX库中有一个结构体记录物体表面材质属性,该结构体包含4个参数,物体顶点颜色的亮度就由这4个参数来决定,其计算公式是:物体的最终颜色=物体反射环境率+物体反射漫反射率+物体反射镜面反射率+自发光,这就是材质组件的实现。
1.2 物理组件
物理组件主要是实现外力效果、摩擦力效果、反弹效果和碰撞等其他物理效果。在物理模块中,通过声明Physics Effect类作为物理组件类,其构造函数初始化相关数据。通过该类生成很多效果函数,方便调用。
1.3 动画组件
动画之所以能动起来是因为有数据记录了每个时间点物体网格各个顶点所在的具体位置,通过插值算法计算两个网格顶点的位置,实现网格的平滑移动,在60帧及以上的帧率下就能看到一个会动的网格,这就是该引擎的动态显示原理。在动画组件中声明Animation Effect类作为动画组件类,其构造函数初始化相关函数。
2 引擎对象
这里主要分为3个系统,分别为摄像机系统、地形系统和光照系统。
2.1 摄像机系统
在摄像机系统中,首先需要实现出取景变换矩阵。其核心思想是:确定摄像机对象的方位。根据摄像机的方位计算出其方位矩阵并通过计算来获得取景变换矩阵。取景变换本质是解决如何以摄像机作为新的坐标原点来表示原来三维世界中物体坐标的问题。换一种方式就是说坐标系中的物体需要随着摄像机一起进行方位变换,来达到摄像机自身坐标系与世界坐标系完全重合的目的,如图1所示。
2.2 地形系统
在三维世界里,地形是一个非常重要的元素。没有光照,没有大地,没有各种生物,就不能称之为世界。在讨论地形系统的实现原理前,先看图2的几张图。
可以发现上面这三张图似乎存在着某种关联。首先在图2(a)上可以看到,一个个网格顶点有规律的排列着,这里每个点都可以用二维坐标(x,y)来表示。而图2(b)则在图2(a)的基础上增加了高度这个属性,可以说图2(a)是平面的,而在图2(b)上每个点在原来的方位上有了不同的高度,这时每个点可以用三维坐标(x,y,z)来表示,这样就把一张二维的图变成了一张三维的图,地形便出来了。而图2(c)则在第二张图的基础上添加了纹理图片,这样一个逼真的地形就显示出来了。
2.3 光照系统
计算机所描绘的三维世界作为现实世界的高度逼真的模仿,必然需要光照系统。在光照系统中可以使用光照功能,只需要告诉光照系统需要使用什么类型的光照,而不用为物体的每个网格顶点都指定颜色值,然后调用DirectX库的光照设置函数,该函数就会根据其内置的算法计算出每个顶点的颜色值,从而产生出逼真的光照效果。
3 结语
游戏引擎只是游戏的一个“零部件”,是一个游戏的载体。游戏的渲染和实现都是基于这个载体之上。真正创建出一个3D游戏世界,还需要使用Windows编程编写Windows应用程序,让三维世界有一个可以被呈现的载体。通过该游戏引擎所创建的三维世界,还是需要编写简单的代码产生程序窗口,并通过该游戏引擎来创建一个简单的三维世界。
参考文献
[1] Jason Gregory.游戏引擎架构[M].北京:电子工业出版社,2014.
[2] Frank D Luna.DIRECTX 9.0 3D游戏开发编程基础[M].北京:清华大学出版社,2012.
[3] Jim Adams.DirectX高级动画制作[M].重庆:重庆大学出版社,2013.