找回密码
 立即注册
查看: 351|回复: 0

游戏开发要掌握的数学物理知识

[复制链接]
发表于 2022-4-13 07:58 | 显示全部楼层 |阅读模式
游戏开发其实对数学和物理知识的要求比普通的开发来说还是比较高的,很多地方都需要用到数学和物理知识。如果想要进入到一线游戏开发大厂,那么就必须对数学知识和算法有足够的了解。甚至我们在做游戏的核心业务逻辑开发时,比如人物角色的移动、敌机与子弹的碰撞等,也需要用到相关的数学和物理知识。如果这些基础知识不过关或者不熟练,那么在开发过程中就会很吃力。我们来列举一些游戏开发中经常用到的数学和物理知识吧。

一、向量与三角函数

日常游戏开发中经常用到的数学知识就包括三角函数、反三角函数、向量、向量分解等。比如玩家控制角色沿着某个方向行走,就需要计算如何给角色施加正确的速度大小与方向,这些就需要上面的数学基础知识。

现在已知方向向量,然后根据方向向量进行向量分解,把大小分解到对应的方向上。

dx = cos(a) dy = sin(a)

根据向量,利用反三角函数算出角度,获得角色移动的朝向。

atan2(y, x)

二、常用的几何函数与求解

例1:圆周运动

编写代码来实现一个物体绕某个点做圆周运动,这个其实就是一个典型的数学问题。现在已知圆心位置和半径,如何实现物体的圆周运动呢?

圆的方程:

(x-x0)^2 + (y-y0)^2 = R^2

其中x0和y0为圆心坐标, R为半径。

圆的参数方程:

x = x0 + R * cos(a); y = y0 + R * sin(a)

其中a为角度。如下图所示:

掌握这两个公式以后,写代码自然就没有什么问题了。在物体的update函数中,不断的改变a的角度,带入公式算出物体的x和y坐标,然后设置为物体的新坐标就可以啦。

update(dt) {

  this.angle += this.angleSpeed * dt; // angleSpeed为角速度,angle为角度

  this.x = this.x0 + cos(this.angle) * this.radius; // x0为圆心x坐标,x为物体的x坐标

  this.y = this.y0 + sin(this.angle) * this.radius; // y0为圆心y坐标,y为物体的y坐标

}

例2:绘制抛物线的辅助轨迹

有时我们在编写设计类游戏的时候,需要绘制辅助轨迹,例如愤怒的小鸟的弹射轨迹、炮弹的发射轨迹、篮球的运动轨迹等都是插线,这时就需要我们有抛物线的相关数学知识。看如下公式:

y = ax^2 + bx + c

抛物线公式还有另一个形式:

y = a(x - x0)^2 + h

上面的公式能够看出轨迹的最高点或者最低点的坐标

看如下图:

例3:扇形

以玩家为中心在身后的指定扇形范围内, 随机位置生成对应的物体。如图:

现已知圆心位置、扇形左边边界的角度、扇形右边边界的角度以及最大的半径R,要在扇形范围内随机生成一个物体。按如下步骤实现:

第1步: 在[lhs, rhs]范围内随机生成一个角度, 例如上图中红色的线。

a = lhs + (rhs - lhs) * random()

第2步: 在[0, R]内随机生成一个半径r。

r = R * random()

第3步: 带入例1的圆的参数方程,可以求得生成的位置。

x = x0 + r * cos(a); y = y0 + r * sin(a)

例4:直线方程与反射

台球游戏的时候,需要绘制辅助线。先看如下图:

在理想情况下,当白球击中目标球之后,目标球会沿着两个球的中心的连线方向运动。而白球与目标球运行方向之间的夹角理应为90度,此为分离角。知道这两点之后,就可以绘制出辅助线。另外,当球体碰撞到边界后,应该以镜面反射的方式运行,也可以由此绘制出辅助线。当然,实际中的台球运动可没这么简单,此处不过多讨论。

三、贝塞尔曲线编辑路径

贝塞尔曲线(Bezier curve),是应用于二维图形应用程序的数学曲线。常用的三次贝塞尔曲线包括起点、终点和两个控制点。

使用多段贝塞尔曲线可以勾画出任意形状的平滑曲线。所以在地图路径编辑的时候,贝塞尔曲线是非常好的路径编辑工具。使用路径编辑工具编辑好每段路径以后,再把路径点生成出来,这样就可以实现地图上的任意路径的曲线形状了。大部分曲线路径编辑都是通过贝塞尔曲线来实现的。在捕鱼游戏中,也能使用贝塞尔曲线来模拟鱼的平滑运动。

在Cocos Creator 3.x引擎中,就封装了贝塞尔曲线的使用。可以在引擎的motion-path-helper.ts中找到Bezier类,可以计算出一段曲线的长度,也可以计算出特定时间的曲线上的点。可以通过此Bezier类来实现自己的Curve类。

<b>四、模拟常见的物理运动/b>

常见的物理运动有匀速直线运动、匀变速直线运动以及这些运动的组合。这些常见的物理运动,在游戏开发中需要能够熟练的实现出来。例如一个物体,移动的时候,要慢慢的停下,就需要知道速度和加速度的相关知识。比如抽奖,数字滚动后最终要慢慢的停下来,也需要运用速度和加速度的知识。

update(dt) {

  this.position += this.speed * dt + 0.5 * this.accelSpeed * this.accelSpeed * dt;

  this.speed += dt * this.accelSpeed;

}

五、3D游戏开发中常用的高等数学

3D游戏开发中的向量、矩阵、四元数、法线、点乘、叉积,应该来说是最常用的数学工具了。

3D向量(Vec3)和2D向量(Vec2)差不多,只是多了一个维度,算法基本上都是一样的。

矩阵(Matrix)其实就是数学工具,用来处理坐标变换的。3D里面常用的矩阵有三种:平移、旋转、缩放。每个变换都可以是一个独立的矩阵,然后把这三种变换叠加在一起之后得到一个新的矩阵。例如,把模型A放大2倍后(缩放矩阵),然后放在世界的某个位置(平移矩阵),最后朝向东北方向(旋转矩阵),这样就把美术的模型变换到了世界中。这三种矩阵既可以分开,也可以合并成一个新矩阵,到时候每个模型点乘这个矩阵,就把坐标转换到了世界坐标。

Cocos Creator中的矩阵类为Mat4,使用也非常简单。

四元数(Quaternion)也是一个用来表示旋转的很好的数学工具,以及它的原理这些。

Cocos Creator中的四元数类为Quat。

欧拉角(Euler Angles)也可以用来表示旋转

Cocos Creator中的欧拉角也是用的Vec3。

总结

不管是使用Cocos Creator引擎开发,还是使用Unity3D引擎开发游戏,掌握基本的数学知识还是必要的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 14:30 , Processed in 0.088942 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表