腹黑三无少女日记数学可以说是引擎的根基,它的作用是不言而喻的。不但开发引擎需要数学知识,而且开发游戏逻辑也需要,所需知识基本覆盖了大学里与数学相关的所有课程——《高等数学》《线性代数》《概率与数理统计》。很多人可以把这些课程学得很好,但能创造性地应用在游戏引擎中的人寥寥无几,能把论文中高深的技术在游戏中真正实现出来的人更是凤毛麟角。加入游戏引擎里的数学算法,大多是已经非常成熟的技术,并且已经被标准程序库化,会有效地使用它们其实已经足够。
另外,本书提及的数学知识,大部分是一些基础的数学知识,也是引擎中最常用到的。那种复杂的多重微积分的应用,本书并不涉及。下面列出的都是我们需要掌握的基本内容。强烈推荐《3D数学基础:图形与游戏开发》这本书。
向量(也称几何向量、矢量)是指具有大小(magnitude)和方向的量。这是图形学和物理学中经常用到的概念,希望读者能了解2D、3D、4D向量的含义,标量和点的含义。在游戏中,3D向量既可以表示一个方向,也可以表示一个点。
读者还要了解向量之间的运算以及对应的含义,包括向量与标量的加减乘除、向量长度、向量点积、向量叉乘、向量单位化、向量加法、向量减法等。
矩阵也是图形学中最常用的概念,它的一个作用就是空间变换。对于没有学过线性代数的人来说,矩阵可能有些难以理解,不过也没关系,引擎中最常用的就是3×3矩阵和4×4矩阵。本书后面在空间变换中会详细讲述它们的功能。
不过这里还要了解关于矩阵的一些特性,包括矩阵的维度、矩阵的逆、矩阵的转置、单位矩阵、方阵、标量和矩阵相乘、矩阵和矩阵相乘、矩阵和向量相乘、向量和矩阵相乘(不同顺序得到的结果也不一样)、正交矩阵、向量与基向量的关系等。
关于四元数,需要了解的包括四元数的定义以及四元数的模、单位四元数、四元数的逆、四元数的共轭、四元数的点乘和叉乘等,相关的知识在网上非常容易查到。
引擎中的几何体基本是用来做碰撞检测和相交检测以及求相互距离的。所有的几何体都以参数化方式表示。
我们需要弄清楚的是直线、射线、线段、圆、三角形、矩形、平面、球体、立方体、胶囊体等。我们需要用到的是它们之间的相交检测以及点到它们的距离。
欧拉角和坐标轴的指向没什么关系,它是按照方位来定义的,是以前向量(Roll)、右向量(Pitch)、上向量(Yaw)作为作为旋转轴得到的角度。按不同顺序旋转得到的结果是不一样的,一般有两种旋转顺序,分别为Roll→Pitch→Yaw和Yaw→Pitch→Roll。本书配套的引擎中采用的是第一种旋转顺序。
读者要深刻了解欧拉角、矩阵、四元数之间的相互转换关系。本书配套引擎中的转换关系如下。
(1)分别绕z、x、y轴旋转AngleZ、AngleX、AngleY角度的矩阵和构建欧拉角的矩阵一样。
(2)分别绕z、x、y轴旋转AngleZ、AngleX、AngleY角度的四元数和构建欧拉角的四元数一样。
(3)欧拉角到四元数和矩阵的转换并不一定可逆,前提是AngleZ、AngleY的范围在[−π,π],AngleX的范围在[−π/2,π/2]。至于为什么是这样,这里不做过多解释,读者可以根据公式自己推导。
本书着重讲解游戏引擎的基础知识和工作原理,并结合配套的游戏引擎示例和详尽的代码,介绍游戏引擎开发的技术细节。本书是第1 卷,主要涉及游戏引擎基础架构。全书共13 章,分别介绍游戏引擎原理、引擎和引擎编辑器、底层基础架构、数据结构、数学库、引擎初始化、应用程序架构、对象系统、资源管理、引擎设计 的哲学理念、场景管理、静态模型导入和LOD 技术。本书未涵盖的游戏引擎线 中讲解。本书适合有一定的游戏开发基础和经验并且想要系统学习游戏引擎原理和引擎开发技术的读者阅读。
如果你有兴趣游戏开发,下面这张图应该可以帮助你更好的了解数学在游戏开发中都会用到哪些地方。
游戏开发中很多地方都需要用到数学物理知识,特别是一线游戏开发大厂对数学知识算法要求非常高。
日常游戏开发中经常用到的数学知识就是三角函数、反三角函数、向量、向量分解等。比如玩家控制角色沿着某个方向行走;如何给角色正确的速度大小与方向,就需要上面的数学知识。先用得到方向向量,根据方向向量利用向量分解,把大小分解到对应的方向上。根据向量,利用反三角函数算出角度,获得角色移动的朝向。
例1:编写代码实现控制一个角色绕某个点做圆周运动,就是一个典型的数学问题:已知圆心,半径,要实现物体的圆周运动。
了解完这个,写代码自然就有思路了:update不断的改变a的角度,带入公式算出x, y, 设置到新的节点即可。
例2:绘制一个抛物线的辅助轨迹出来,我们在编写设计类游戏的时候,经常需要绘制辅助轨迹,抛物线就是炮弹,篮球等最常用的轨迹,这就需要我们有抛物线的知识。
第1步:在[lhs, rhs]范围内随机生成一个角度,如上图红色的划线, Rmax]内随机生成一个半径r;
匀速直线运动、匀变速直线运动、运动的合成,这些常见的物理运动在游戏开发中经常需要徒手就写出来。比如,一个物体移动的时候要慢慢地停下;抽奖时数字滚动后最终要慢慢地停下来,这些都涉及到物理运动的模拟与计算。
是最常用的数学工具。向量和2D差不多,只是多了一个维度,分解这些都是一样的。矩阵其实就是数学工具,用来变化坐标的。3D里面矩阵有三种:平移、旋转、缩放,每个都可以是一个独立的矩阵,然后把这三个变化叠加在一起又是一个新的矩阵。比如,把模型A放大2倍后(缩放),放在世界的某个位置(平移),并朝向东北方向(旋转), 这样就把美术的模型变换到了世界中。这三个矩阵既可以分开又可以合并成一个矩阵,到时候每个模型点*这个矩阵,就把坐标变化到世界了。四元数也是一个用来表示旋转很好的数学工具,以及它的原理这些。
游戏开发对数学物理知识的要求相比较普通的开发来说还是比较高的。 很多地方都需要用到数学物理知识,特别是进入一线游戏开发大厂对数学知识算法要求非常的高。 我们来列举一些游戏开发中常用的数学物理知识。
日常游戏开发中经常用到的数学知识就是三角函数,反三角函数, 向量,向量分解等,比如玩家控制角色沿着某个方向行走,如何给角色正确的速度大小与方向,这些就需要上面这些数学知识,先用得到方向向量, 根据方向向量利用向量分解,把大小分解到对应的方向上。根据向量,利用反三角函数算出角度,获得角色移动的朝向。
例1: 编写代码实现控制一个角色饶某个点做圆周运动,这个就是一个典型的数学问题,已知圆心,半径,要实现物体的圆周运动。
圆的方程 (x-x0)^2 + (y-y0)^2 = R^2, 其中x0, y0为圆心坐标, R为半径
了解了这个以后,自然写代码就有思路了,update不断的改变a的角度,带入公式算出x, y, 设置到新的节点即可。
例2: 绘制一个抛物线的辅助轨迹出来,经常我们在编写设计类游戏的时候,需要绘制辅助轨迹,抛物线就是炮弹,篮球等最常用的轨迹,这个就需要我们有抛物线的知识。
例子3:扇形,以玩家为中心在身后某个扇形范围内, 随机生成对应的物体。如图:
第1步: 在[lhs, rhs]范围内随机生成一个角度, 如上图红色的划线, Rmax]内随机生成一个半径r;
多段贝塞尔曲线可以勾画出任意形状的曲线,所以在地图路径编辑的时候,贝塞尔曲线是非常好的路径编辑工具,使用贝塞尔曲线编辑好每段路径以后再把路径点生成出来,这样就可以编辑地图上的任意路径曲线形状了, 大部分路径编辑都是通过贝塞尔曲线: 常见模拟的物理运动:
3D游戏开发中向量,矩阵, 四元数, 法线, 点乘,叉积, 应该来说是最常用的数学工具了。向量和2D差不多,只是多了一个维度,分解这些都是一样的,矩阵其实就是数学工具,用来变化坐标的,3D里面矩阵有三种,平移,旋转,缩放, 每个都可以是一个独立的矩阵,然后把这三个变化叠加在一起又是一个新的矩阵。比如,把模型A放大2倍后(缩放),放在世界的某个位置(平移), 并朝向东北方向(旋转), 这样就把美术的模型变换到了世界中。这三个矩阵既可以分开有可以合并成一个矩阵,到时候每个模型点*这个矩阵,就把坐标变化到世界了。其中四元数也是一个用来表示旋转,很好的数学工具,以及它的原理这些。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀~
:小游戏开发,cocos,数学,相似三角形,单位向量,弧度角度转换,向量转换为夹度,产生不重复的随机序列,切水果游戏,抛物线
在摇杆控制物体运动的游戏中,摇杆的手柄(下图黄色圆饼),不能移出摇杆所在的套(下图灰色圆环),也就是说摇杆偏离中心点的最大距离为max_R。一旦触摸移动过程中移动的点超出此最大距离,我们需要将摇杆手柄拖回到最大距离处。
如何将摇杆拖回到灰色圆环处,无非是要求出在C点的坐标。根据△ODC和△OBA为相似三角形,有OD:OB = OC:OA,也就是?:pos.x = max_R:len。
在摇杆控制物体的运动时,如果摇杆只控制物体的方向,也就是说不管摇杆偏离原点多远,都不会影响物体运动的速度,而只影响物体运动的方向,也就是实质上我们要获取一个方向的值(比如向量与x轴正方向的夹角),这时候,我们就需要使用单位向量。
是指向量的模为1的向量,也就是以一个单位长度为半径画一个圆,从圆心指向圆周上任意一点的向量都是单位向量。
假设单位向量OA与x轴正向的夹角为α,则向量OA可以用(cosα,sinα)表示,也就是A点的坐标。如下图所示:
所以不管任何向量,我们要转换为单位向量,只需要计算出这个向量的余弦和正弦值就可以了。例如向量OC我们将其转换为单位向量就是OC’,因为OC’的长度为1,所以向量OC’的坐标就是(cos(c),sin(c)),c为OC和x轴正方向的夹角。而OC’和OC的方向是重合的,他们与x轴正向夹角相等,也就是我们只需要计算向量OC的cos(c)、sin(c)即可。
假设得到的C点坐标为pos(x,y),则在Cocos游戏开发中,会有下列代码:
角度指从原点发出的射线与X轴正向的角度。而x轴正向绕原点在水平平面内旋转一周为360°。而弧度是指圆弧长度与半径的比值。假设有个半径r为1的圆,则其一周为360°。圆周对应的弧度长为2πr=2π。也就是说在角度转换为弧度是360°等价于2π,180°等价于π。
在游戏中,有时候我们需要计算物体旋转了多少度,比如我们要模拟一个KTV里面的游戏转盘,手指触摸的时候,要获取触摸的点的位置,触摸点的位置与转盘中心点之间构成一个向量,我们要获取转动了多少度,就需要有一个参考向量。
如下图所示,假如蓝色的圆就是转盘的边缘,我们最开始触摸A点,然后转动到B点,这时候转动的角度就是∠AOB,这个角度在Cocos中如何求呢?
代码pos就表示B点的坐标,pos和原点(0,0)相减,得到向量OB,也即代码中的dirVec,弧AB为radian,转换为角度degree。
具体在Cocos中如何实现,限于篇幅,在此不做赘述,可以参考我们的公开课《切水果》核心技术:抛物线物理仿真。
应用场景:例如洗牌,发牌,例如扫雷游戏中从100个格子中随机抽取10个埋雷。
凡是需要打乱顺序,或者从某个数组中抽取一定数量的不重复的元素,都用得着。
您现在既然已经入门了数学,不如再把架构入门了,到时候进一步该学什么就一目了然了。
不是数学科班出身,没有长期的数学学习规划的话;不结合应用场景谈数学就显得意义不大。建议您从Jason Gregory的Game Engine Architecture开始看起,从问题出发,往数学原理上回靠。
搭建引擎涉及数学的部分主要有渲染引擎、物理引擎和游戏AI设计等等,每一个部分展开的话又都各自需要特定的数学姿势。比如渲染引擎需要矩阵计算相关的姿势,物理引擎需要刚体/流体动力学相关的姿势,AI设计则(可能)需要数理统计方面的姿势。每种姿势都与数学书上写的有交集,但是各自又有各自的延伸。
先从这些领域的导论开始读起吧。导论都是有所需数学知识的介绍的,再不济会给你一个Mathematical Requirements以供参考。根据这些导论在各种应用场景下所给定的Mathematical Requirements来复习/学习相关的数学姿势;应该比单纯看数学书靠谱很多吧。。
我虽然学过高数,最近在学习图形处理的时候仍然被里面的卷积、傅里叶变换弄得一愣一愣的,只好又买一本《数字图像处理》从头看。。
|