现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许。在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求。现代游戏引擎的复杂级别已不同于以往。引擎中有错综复杂的功能模块,以及同样重要且复杂的游戏编辑器,其中的任何一方面内容都足以独立成书。然而本书篇幅有限,实在难以面面俱到。我们将在这里迈出第一步,在游戏开发的海洋中扬帆起航。

2.1 游戏编程

既然要开始游戏编程,首先要选择语言工具,C和C 是开发游戏引擎的首选。

游戏编程广义上讲可以分成游戏逻辑编程和游戏引擎编程。然而,它们两者之间的边界往往又没有那么泾渭分明。

游戏逻辑开发是指集中力量开发游戏中的剧情和玩法,要决定的是什么时候显示什么内容,什么时候播放什么声音,什么时候通过网络传输什么数据,什么时候这个物体或者人物做某个动作。至于图像如何显示,声音如何处理,数据如何传输,物体动作如何实现,游戏逻辑开发者其实并不用关心,这些归游戏引擎来处理。所以说游戏逻辑负责游戏核心玩法方面的内容,游戏引擎负责底层方面的处理。

有人可能会有疑问:“既然你解释了做什么和怎么做,那么可不可以理解为,我想开发一个已经写好了剧本的游戏,既然内容确定了,游戏引擎就应该能给我马上做出来,至于怎么做,我可以不关心吗?”是的,没错,只要你选择的游戏引擎足够强大。

成功的游戏是以好的游戏逻辑为基础的,虽然引擎并不能是一款游戏成败与否的决定性因素,但好的游戏内容通过好的游戏引擎来实现,会给人一种全新的视觉和听觉感受,会更加震撼人心,这就好比传统的2D电影与3D乃至4D电影的效果对比。

游戏逻辑就像电影的剧本,至于能否拍摄出预期的效果,不但取决于导演对剧本的理解和演员的演绎,还取决于拍摄的技术和后期的特效处理。

2.2 游戏引擎的组成

现在的游戏引擎比早些年的游戏引擎更加规范,通常包括图形引擎、声音引擎、网络引擎、脚本引擎、图形用户界面、人工智能引擎、物理引擎以及各种编辑器。

游戏画面能正常显示是最基本的要求,所以图形引擎是游戏的基石,其他模块则是为游戏添砖加瓦的。如果一个引擎同时具备下面7个模块,至少说明这个引擎的功能是比较强的。

现在很少有引擎全部自研所有模块,很多引擎通过第三方技术授权形式来实现相应模块的功能。

(1)图形引擎——作为游戏的“基石”模块,图形引擎还是以各自实现开发为主,毕竟图形引擎还没能够抽象得那么完美。为了达到更好的画面效果和满足游戏的功能需要,研发图形引擎是必不可少的。

(2)声音引擎——市面上用得最多的插件就是FMOD。除了可以播放音乐音效之外,FMOD还包括底层支持及各种声音资源的管理工作。

(3)网络引擎——目前的网络引擎并没有一套完全成熟的解决方案,能同时满足各种游戏服务器类型,并且便于接入和开发。单从开发便捷来说,还是以Unreal作为网络引擎比较好,既可用于客户端开发,也可以支持网络端,不过它的架构只适合做“开房间”的游戏。

(4)脚本引擎——这里所说的脚本是面向游戏策划或用户的,可以是指令形式,也可以是简单语句。《魔兽争霸3》(见图2.1)就可以使用脚本写出很多有趣的游戏内容,还有当年的《红色警戒2》(见图2.2),甚至《国家的崛起》(见图2.3),玩家可以自己用脚本写AI。如果希望更深入地了解这些高级的脚本语言,推荐《游戏脚本高级编程》这本书。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(1)

图2.1 《魔兽争霸3》游戏画面

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(2)

图2.2 《红色警戒2》游戏画面

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(3)

图2.3 《国家的崛起》游戏画面

(5)图形用户界面(GUI)——包括血条、分数等在屏幕位置固定不变的2D图案。UI也可以做得很炫,不要小看UI,它也算是游戏里最重要的组成部分。业界比较知名的UI引擎是ScaleForm。

(6)人工智能引擎——Unreal Engine内部有自己集成的AI,并且是带编辑器的。Unity也有专门的AI插件,可以到商店购买。这里推荐一些关于游戏AI的图书,如《游戏人工智能编程案例精粹》《游戏编程中的人工智能技术》《游戏开发中的人工智能》等。

(7)物理引擎——多数游戏开发使用的是刚体和刚体运动、碰撞、射线检测、布料检测等功能,而使用软体和真实流体、气体等功能的则相对较少。现在市面上有Physx、Havok、Bullet三大物理引擎(Physx和Bullet开源了),如果读者想要零起步学习物理引擎,推荐学习《游戏物理引擎开发》《游戏开发物理学》《游戏中的数学与物理学》《实时碰撞检测算法技术》等图书。

2.3 游戏引擎编辑器的组成

常用的引擎编辑器包括场景编辑器、粒子特效编辑器、模型浏览器、材质编辑器和动画编辑器。除了常用的以外,还有物理编辑器、AI行为树编辑器、脚本编辑器和技能编辑器。引擎编辑器不仅可以编辑各种资源,还负责管理和整理各种资源。按照现在引擎的设计理念,编辑器还包括性能分析、打包和部署以及版本发布等功能。

下面以Unity和Unreal Engine为例,列出一些功能编辑的界面,并介绍一些初步的概念。

(1)场景编辑器,负责摆放模型物体、光源、摄像机等(见图2.4)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(4)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(5)

图2.4 场景编辑器

(2)粒子特效编辑器,负责制作各种特效(见图2.5)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(6)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(7)

图2.5 粒子特效编辑器

(3)模型浏览器,负责浏览和编辑模型(见图2.6)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(8)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(9)

图2.6 模型浏览器

(4)动画编辑器,负责编辑动画功能,可以触发游戏逻辑中的某些事件(见图2.7)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(10)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(11)

图2.7 动画编辑器

(5)材质编辑器,负责编辑模型效果(见图2.8)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(12)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(13)

图2.8 材质编辑器

(6)资源管理器,管理游戏中各种资源(见图2.9)。

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(14)

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(15)

图2.9 资源管理器

上面只是简单罗列了Unity和Unreal Engine的一些常用编辑器。对于新手而言,建议先看看Unity开发的相关图书,尝试开发简单游戏来熟悉各种编辑器。

提示

在接下来几节中,我们将回顾开发游戏引擎所需的基础知识。这里并不会详细地介绍每个部分。当然,书中会提及从哪里可以学习到这些知识,不过这并非本书重点。

2.4 数学

数学可以说是引擎的根基,它的作用是不言而喻的。不但开发引擎需要数学知识,而且开发游戏逻辑也需要,所需知识基本覆盖了大学里与数学相关的所有课程——《高等数学》《线性代数》《概率与数理统计》。很多人可以把这些课程学得很好,但能创造性地应用在游戏引擎中的人寥寥无几,能把论文中高深的技术在游戏中真正实现出来的人更是凤毛麟角。加入游戏引擎里的数学算法,大多是已经非常成熟的技术,并且已经被标准程序库化,会有效地使用它们其实已经足够。

另外,本书提及的数学知识,大部分是一些基础的数学知识,也是引擎中最常用到的。那种复杂的多重微积分的应用,本书并不涉及。下面列出的都是我们需要掌握的基本内容。强烈推荐《3D数学基础:图形与游戏开发》这本书。

1.向量

向量(也称几何向量、矢量)是指具有大小(magnitude)和方向的量。这是图形学和物理学中经常用到的概念,希望读者能了解2D、3D、4D向量的含义,标量和点的含义。在游戏中,3D向量既可以表示一个方向,也可以表示一个点。

读者还要了解向量之间的运算以及对应的含义,包括向量与标量的加减乘除、向量长度、向量点积、向量叉乘、向量单位化、向量加法、向量减法等。

2.矩阵

矩阵也是图形学中最常用的概念,它的一个作用就是空间变换。对于没有学过线性代数的人来说,矩阵可能有些难以理解,不过也没关系,引擎中最常用的就是3×3矩阵和4×4矩阵。本书后面在空间变换中会详细讲述它们的功能。

不过这里还要了解关于矩阵的一些特性,包括矩阵的维度、矩阵的逆、矩阵的转置、单位矩阵、方阵、标量和矩阵相乘、矩阵和矩阵相乘、矩阵和向量相乘、向量和矩阵相乘(不同顺序得到的结果也不一样)、正交矩阵、向量与基向量的关系等。

3.四元数

关于四元数,需要了解的包括四元数的定义以及四元数的模、单位四元数、四元数的逆、四元数的共轭、四元数的点乘和叉乘等,相关的知识在网上非常容易查到。

4.几何体

引擎中的几何体基本是用来做碰撞检测和相交检测以及求相互距离的。所有的几何体都以参数化方式表示。

我们需要弄清楚的是直线、射线、线段、圆、三角形、矩形、平面、球体、立方体、胶囊体等。我们需要用到的是它们之间的相交检测以及点到它们的距离。

5.欧拉角

欧拉角和坐标轴的指向没什么关系,它是按照方位来定义的,是以前向量(Roll)、右向量(Pitch)、上向量(Yaw)作为作为旋转轴得到的角度。按不同顺序旋转得到的结果是不一样的,一般有两种旋转顺序,分别为Roll→Pitch→Yaw和Yaw→Pitch→Roll。本书配套的引擎中采用的是第一种旋转顺序。

读者要深刻了解欧拉角、矩阵、四元数之间的相互转换关系。本书配套引擎中的转换关系如下。

(1)分别绕z、x、y轴旋转AngleZ、AngleX、AngleY角度的矩阵和构建欧拉角的矩阵一样。

Matrix(z Axis, AngleZ) * Matrix(x Axis, AngleX) * Matrix(y Axis, AngleY) = Matrix(Roll_AngleZ, Pitch_AngleX,Yaw_AngleY)

(2)分别绕z、x、y轴旋转AngleZ、AngleX、AngleY角度的四元数和构建欧拉角的四元数一样。

Quaternion(z Axis, AngleZ) * Quaternion (x Axis, AngleX) * Quaternion (y Axis, AngleY) = Quaternion(Roll_AngleZ, Pitch_AngleX,Yaw_AngleY)

(3)欧拉角到四元数和矩阵的转换并不一定可逆,前提是AngleZ、AngleY的范围在[−π,π],AngleX的范围在[−π/2,π/2]。至于为什么是这样,这里不做过多解释,读者可以根据公式自己推导。

本文截选自:《游戏引擎原理与实践 卷1 基础框架》

游戏编程引擎(游戏引擎编程需要哪些基本数学知识)(16)

本书着重讲解游戏引擎的基础知识和工作原理,并结合配套的游戏引擎示例和详尽的代码,介绍游戏 引擎开发的技术细节。 本书是第1 卷,主要涉及游戏引擎基础架构。全书共13 章,分别介绍游戏引擎原理、引擎和引擎编 辑器、底层基础架构、数据结构、数学库、引擎初始化、应用程序架构、对象系统、资源管理、引擎设计 的哲学理念、场景管理、静态模型导入和LOD 技术。本书未涵盖的游戏引擎话题将在卷2 中讲解。 本书适合有一定的游戏开发基础和经验并且想要系统学习游戏引擎原理和引擎开发技术的读者阅读。

,