快捷搜索:

用JavaScript玩转游戏物理(一)运动学模拟与粒子系

系列简介

大概,三百年前的艾萨克·牛顿爵士(Sir Issac Newton, 1643-1727)并没幻想过,物理学广泛地利用在本日许多游戏、动画中。为什么在这些利用中要应用物理学?笔者觉得,自我们诞生以来,不停感想熏染着物理天下的规律,意识到物体在是日下是若何"正常移动",例如射球时球为抛物线(自旋的球可能会做成弧线球) 、石子系在一根线的末尾会以固定频率摆动等等。要让游戏或动画中的物体有真实感,其移动要领就要相符我们对"正常移动"的预期。

本日的游戏动画利用了多种物理模拟技巧,例如运动学模拟(kinematics simulation)、刚体动力学模拟(rigid body dynamics simulation)、绳子/布料模拟(string/cloth simulation)、柔体动力学模拟(soft body dynamics simulation)、流体动力学模拟(fluid dynamics simulation)等等。别的碰撞侦测(collision detection)是许多模拟系统里所需的。

本系列盼望能先容一些这方面最根基的常识,继承应用JavaScript做例子,以即时互动要领体验。

本文简介

作为系列第一篇,本文先容最简单的运动学模拟,只有两条异常简单的公式。运动学模拟可以用来模拟很多物体运动(例如马里奥的跳跃、炮弹等),本文将会共同粒子系统做出一些视觉殊效(粒子系统着实也可以用来做游戏的弄法,而不单是视觉殊效)。

运动学模拟

运动学(kinematics)钻研物体的移动,和动力学(dynamics)不合之处,在于运动学不斟酌物体的质量(mass)/迁移转变惯量(moment of inertia),以及不斟酌加之于物体的力(force )和力矩(torque)。

我们先回忆牛顿第一运动定律:

当物体不受外力感化,或所受协力为零时,本来静止者恒静止,本来运动者恒沿着直线作等速率运动。该定律又称为「惯性定律」。此定律指出,每个物体除了其位置(position)外,还有一个线性速率(linear velocity)的状态。然而,只模拟不受力影响的物体并不有趣。撇开力的观点,我们可以用线性加速率(linear acceleration)去影响物体的运动。例如,要谋略一个自由落体在随意率性光阴t的y轴座标,可以应用以下的阐发解(analytical solution):

傍边,和分手是t=0时的y轴肇端座标和速率,而g则是重力加速率(gravitational acceleration)。

这阐发解虽然简单,然则有一些毛病,例如g是常数,在模拟历程中不能改变;别的,当物体碰到障碍物,孕育发生碰撞时,这公式也很难处置惩罚这种不继续性(discontinuity) 。

在谋略机模拟中,平日必要谋略继续的物体状态。用游戏的用语,便是谋略第一帧的状态、第二帧的状态等等。设物体在随意率性光阴t的状态:位置矢量为、速率矢量为、加速率矢量为。我们盼望从光阴的状态,谋略下一个模拟光阴的状态。最简单的措施,是采纳欧拉措施(Euler method)作数值积分(numerical integration):

欧拉措施异常简单,但有准确度和稳定性问题,本文会先轻忽这些问题。本文的例子采纳二维空间,我们先实现一个JavaScript二维矢量类:

复制代码 代码如下:

您可能还会对下面的文章感兴趣: