不懂物理的前端不是好的游戏开发者(一)—— 物理引擎基础 (2)

然后是某个时刻的速度的计算,其实就是在平均速度的基础上,将时间差缩小到无穷小:
$$ v = \lim_{\Delta t \to 0} \frac {\Delta s}{\Delta t} = \frac{ds}{dt} \tag{速度}$$

不懂物理的前端不是好的游戏开发者(一)—— 物理引擎基础

微分的原理

这就是微分的应用。那么积分的应用呢?

再来看看最基本的速度和路程的公式,在匀速运动中的公式如下,其中 t 为运动时间:
$$ s_{1} = s_{0} + v_{0}t \tag{匀速运动}$$

其实这个公式的本质应该是:
$$ s_{1} = s_{0} + \int_{t_{0}}^{t_{1}}v_{0}dt \tag{匀速运动}$$

以上只是微积分的简单应用,说明了在游戏中微积分的使用也十分重要,那么我们在代码中也应该加入对应的方法。

物理基础

在一个虚拟的世界里面,我们要是想要获得和现实一样的体验,也必然要遵循现实中的物理法则,不可能出现苹果朝天上飞的状况。由此我们先来构建一个模拟真实环境的对象。

在物理引擎中,一个物体应该具有什么样子的属性呢?最重要的就是上文提到的位置信息,那么对应的,是改变位置的信息,也就是速度。随之又引出了一个值,那就是改变速度的信息,也就是加速度了。在这样的基础上,我们可以得到一个最基本的物体所应该拥有的属性:

class GameObj { pos: Vector velocity: Vector acceleration: Vector constructor(pos?: Vector, velocity?: Vector, acceleration?: Vector) { this.pos = pos || new Vector(0, 0, 0) this.velocity = velocity || new Vector(0, 0, 0) this.acceleration = acceleration || new Vector(0, 0, 0) } setPos (pos: Vector) { this.pos = pos } setVelocity (velocity: Vector) { this.velocity = velocity } setAcceleration (acceleration: Vector) { this.acceleration = acceleration } }

我们现在拥有了最基本的一个物体,想要使这个物体融入物理体系由我们任意操作,就需要将物体与力结合在一起。而结合两者的,正是牛顿三大定律。

首先是牛顿第二定律,作用力可以改变物体的运动状态。用一个简单的公式表达就是:

$$ \vec F = m\vec a \tag{牛顿第二定律}$$

那也就是说,我们要结合加速度和力的话,需要给物体一个变量,那就是质量 m。那我们给上述对象再添加上质量属性:

class GameObj { mess: number // 质量不得为 0 constructor(mess?: number) { if (mess > 0) { this.mess = mess } } setMess (mess: number) { if (mess > 0) { this.mess = mess } } }

但是这个时候我们会有两个问题:第一,物体的质量不能为0,如果设置了0,就会导致质量设置出错;第二,某些物体,我们需要它有着无穷大的质量,比如地面,墙体,我们是需要它在游戏场景中保持固定的。那么一方面是不允许出现的0,另一方面是难以设置的无穷大,应该怎么办呢?

在游戏物理学中提出了一个概念,叫做逆质量,巧妙的解决了这个问题。逆质量其实就是质量的倒数,也就是 $\frac{1}{m}$,这样的话,我们只需要将需要固定的物体的逆质量设置为0就可以使其的质量无穷大了,并且也避免了质量设置为0的情况。

class GameObj { inverseMess: number // 质量不得为 0 constructor(inverseMess?: number) { if (inverseMess >= 0) { this.inverseMess = inverseMess } } setInverseMess (inverseMess: number) { if (inverseMess >= 0) { this.inverseMess = inverseMess } } } 结语

到这里为止,我们所需要的最基础的数学和物理知识已经成功的被注入了物理引擎中,但是这仅仅是一个物理引擎的基石,在此基础上,我们还要添加各种各样的东西,比如重力、阻力、动量、角动量、碰撞等等一系列的内容。在这后面还有很长的路要走,我将会在这个系列中一一展示。

欢迎关注凹凸实验室博客:aotu.io

或者关注凹凸实验室公众号(AOTULabs),不定时推送文章:

欢迎关注凹凸实验室公众号

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwyypz.html