游戏开发中的基本数学与物理
游戏开发中的基本数学与物理
在游戏开发中,数学和物理知识是不可或缺的基础。本文将介绍游戏开发中涉及的基本数学和物理知识,包括角度与弧度的转换、勾股定理、三角函数、矢量运算以及物理中的距离、速度、加速度和力的概念。通过具体的数学公式和游戏开发中的实际应用场景,帮助读者理解这些基础知识在游戏开发中的应用。
一、数学
1.1 角度与弧度的变换
日常生活中,我们形容一个角,常常使用的是角度、而在数学中需要使用弧度的概念,这在游戏开发中也经常需要转换。弧度是以原点为中心的单位半径圆为基准的一种度量单位。
由于圆的周长为2π,所以每个圆都有2π弧度(Radians)。π为圆周率,3.1415926。
360角度=2π弧度 (1-1)
如果角度换弧度的公式为:
1角度=(2π/360)弧度
1弧度=(360/2π)角度 (1-2)
1.2 勾股定理
由于勾股定理只能用于直角三角形,这里只讨论直角三角形。
直角三角形:有一个角为π/2弧度(90角度),即直角的三角形。
勾股定理:一个直角三角形直角所对应的斜边的平方等于其他两个边的平方和。
c²=a²+b²(1-3)
这意味着知道一个直角三角形的任意两个边的任意两个边的长度,就能找到第三边。
通过勾股定理,我们可以计算两个物体之间的距离。不过需要记得少用开方,因为开方计算很慢,可以直接使用平方即可。比如 a²+b²<距离²。
来个实例:
比如有一个枪手(10,4)的射击范围是10米,目标敌人的位置为(2,3),请问枪手可以在不移动的情况下 射杀目标敌人吗?
红点为射手,蓝点为目标敌人。
距离²=(10-2)²+(4-3)²=65<100(10²)
1.3 三角函数
sin(θ)=对边/斜边
cos(θ)=邻边/斜边
tan(θ)=对边/邻边(1-4)
三角函数在游戏开发中的应用就是计算角度。可以使用反三角函数来计算两个矢量之间的夹角。
1.4 矢量
1.4.1 矢量加减
如果我们的位置在坐标系的(0,0)处,有一张藏宝图告诉我们,需要通过矢量A(-2,1)和 B(3,0)去找到宝藏,但是我们懒得按照它规定的路线去,就想直接去目的地。这个时候就需要用到矢量的加法了。
A+B=(-2,1)+(3,0)=(1,1)
待我们计算出来之后,就可以直接通过目标向量去往目标点了。
1.4.2 计算矢量的大小
矢量的大小(模)是它的长度。
一个矢量的大小,我们可以通过勾股定理来计算。
模=(x²+y²)1/2(1-5)
这个公式可以帮我们计算两个角色之间的距离,示例的话,就是1.2中的例子。
1.4.3 矢量归一化
归一化就是用矢量的每一个分量去除以矢量的模。
N=(v/|v|)
举例,归一化矢量(4,5),其模为6.403,所以归一化后的向量为(4/6.403,5/6.403)=(0.62,0.78)。
1.4.4 矢量点乘
有两个二维矢量 u,v,两者点乘的两个公式如下:
(1)u·v=uxvx+uyvy=x分量相乘加上 y分量相乘
(2)u·v=|u||v|cos(θ)=两个向量的模相乘,再乘以余弦角度
如此,我们便能得到
cos(θ)=u·v/(|u||v|)(1-6)
所以如果我们将两个向量归一化后,他们的模,如|u|为1时,
cos(θ)=uxvx+uyvy(1-7)
如此再通过一个反余弦函数 acos(uxvx+uyvy) 就能得到角度θ了。
矢量点乘不仅能帮我们得到两个向量间的夹角,还能帮我知道一个怪物是否在主角的背后。
即主角的向前矢量与怪物到主角的矢量点乘之后,如果为正值,则怪物在主角的正面,如果为负值,则在背后。
还是用前面那个问题来举例:
比如有一个枪手在(10,4),朝向为Y轴,目标敌人的位置为(2,3),请问枪手需要转向多少度才能面向目标?
红点为枪手,蓝点为目标。枪手的初始向前矢量为(0,1),枪手朝向目标的矢量为(8,1)。
枪手朝向目标的归一化 矢量为(0.99,0.12)。
cos(θ)=(0x0.99)+(1x0.12)=0.12
θ=acos(0.12)=1.45弧度=83.10角度
1.4.5 求旋转向量
如果已知一个向量与其要旋转的角度,如何计算旋转后的向量呢?
如此:便设已知向量为A,旋转角度为θ,未知向量为B
B=(Xa* cos(θ)-Yasin(θ),Xa sin(-θ)+Yacos(-θ))(1-8)
具体推导过程请查看二维向量的旋转
二、物理
2.1 距离计算公式
∆x=(v*∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-1)
可以用于计算游戏当中单位时间内物体的移动距离,比如:x的位置+=前进向量*刷新帧时间。
2.2、速度的计算公式
v=(∆x/∆t) ,其中v为速度,∆x为单位时间内行驶的距离,∆t为单位时间 (2-2)
2.3、加速度的计算公式
a=(∆v/∆t),其中a为加速度,∆v为单位时间内的速度,∆t为单位时间。(2-3)
如果加速度恒定的话,
v=at+u,其中a为加速度,v为速度,t为时间,u为初始速度。(2-4)
举例:一辆车的起始速度为1m/s,之后以2m/s加速,请问3秒后小车的速度?
v=2*3+1=7m/s
速度与时间图(y轴为速度,x轴为时间)如下:
速度与时间图,有一个有趣的特点就是:在两个时间点之间的图的下方面积等于物体在这段时间中行进的距离。
因此:
A的面积 = ∆t * u
B的面积 = ∆t * (v-u) /2
距离:
∆x=∆t * u+∆t * (v-u) /2 (2-5)
将v-u=∆v=a∆t带入上述距离公式(2-5),可得一个距离与时间与加速度的关系式
∆x=∆t * u+a ∆ t²(1/2) (2-6)
如果在将∆t=(v-u)/a带入公式(2-6),可得一个距离与速度、加速度的公式。
v²=u²+2a * ∆x (2-7)
2.4 力
如果一个物体是静态的或者是保持匀速直线运动,所有作用在它身上的力的和一定为零。如果这些力的和不为零,那么物体将会沿着合力的方向加速而去。
力的计算公式
F=am,其中F为力的大小,a为加速度,m为物体的质量。(2-8)
记住:这个公式可以用于计算,多个力施加到一个物体时,物体的移动。比如:游戏人工智能编程案例精粹 第三章中的Flocking算法。