何为物理引擎,能做什么?

物理引擎是一个计算机程序,使用质量、速度、摩擦力和空气阻力等变量,模拟了一个近似真实的物理系统,为刚性物体赋予真实的物理效果,比如重力、旋转和碰撞等效果,让物体的行为表现的更加趋向真实,例如,守望先锋的英雄在跳起时,系统所设置的重力参数就决定了他能跳多高,下落时的速度有多快,子弹的飞行轨迹等等。

四个例子不同的效果,模拟物体落入斜坡的表现

  • 无物理效果
  • 重力,没有碰撞效果
  • 重力和碰撞,没有旋转效果
  • 重力、碰撞以及旋转效果

物理引擎通常有两种常见类型:实时物理引擎和高精度物理引擎。高精度物理引擎需要更多的处理能力来计算非常精确的物理,通常使用在科学研究(计算物理学)和动画电影制作。实时物理引擎常用于电子游戏并且简化了算法,降低精确度以减少处理时间,使得在游戏中有更好的处理速度。

物理引擎在游戏中的应用

CS1.5 应用的是真实度比较差的物理引擎,人物死亡后倒地动作是固定的,即使有障碍物也会执行这个动作,所以人物穿过了门。

CS 1.5

而 CS:GO 因为采用了 Source Engine 开发,模拟较为精细,所以人物死亡之后的姿势可以根据物理学自动计算,所以可以躺在杆上,使游戏更加真实。

CS GO

Matter.js 介绍

Matter.js 是一个用于 Web 的 JavaScript 2D 物理引擎库,该项目诞生于 2014 年 2 月 28 号(0.5.0-alpha 版本),目前已更新迭代了 11 个版本(最新为 0.12.0 版本),它相较于老牌的 Box2D 引擎库,Matter.js 更为轻量级(压缩版仅有 84 KB),并且在性能和功能方面也不逊色。

在没有 Matter.js 前,你想去制作一个物理游戏不仅需要扎实数学知识和物理知识,并且需要通过编程语言表示出来让机器读懂。而有 Matter.js 就不一样了,它为开发者提供了许多的功能模块,通过简单易用的 API 就可以实现例如弹跳、碰撞、重力、滚动等物理效果。

Matter.js 介绍

Matter.js 下载

首先,需要下载开发版本或者稳定版定,并将脚本加入到页面中,即可开启旅程。

1
<script src="matter.js" type="text/javascript"></script>

你也可以使用包管理工具 Bower 或 NPM

1
$ bower install matter-js
1
$ npm install matter-js

Matter.js 支持的特性

刚体 复合体 复合材料
凹面和凸面 物理特性(质量、面积、密度等) 弹性(弹性和非弹性碰撞)
碰撞(粗略阶段、中间阶段、精细阶段) 稳定的堆叠和静止 动量守恒
摩擦力和阻力 事件监听 约束
重力 睡眠和静态物体 圆角(倒角)
视图(平移、缩放) 碰撞查询(射线追踪、区域测试) 时间缩放(减速、加速)
Canvas 渲染器(支持向量和纹理) MatterTools 工具(创建、测试和调试) 世界状态序列化,需要 resurrect.js
跨浏览器(Chrome、Firefox、Safari、IE8+) 兼容移动端(触摸、响应) 原生 JS 实现

Matter.js 中基础的概念

大多数的物理引擎对于物理模拟的要素都有着相近的概念,不同的引擎差别在于使用的方式,功能的全面性,模拟的精细度等层面,下面就先从物理世界的基础概念讲起。

Engine(引擎)和 World(世界)

Matter.Engine 模块包含了创建和处理引擎的方法,引擎是负责管理和更新模拟世界的控制器,引擎可以控制时间的缩放,可以检测所有的碰撞事件,并且拿到所有碰撞的物体对(pairs)。

在 Matter.js 中任何的物体都需要一个容身处,而存放这些物体的地方,我们称之为世界,物体必须添加到世界里,然后由引擎运行这个世界。而创建世界需要使用到 Matter.World 模块,该模块包含了用于创建和操作世界的方法,一个 Matter.World 相当于一个复合物体,物体、约束、复合物体的聚合体,其次世界还有额外的一些属性,比如重力、边界。

MatterJS_EngineAndWorld

Render(渲染)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Matter.Render 用法

var engine = Engine.create();

// ... 将物体加入到世界中

var render = Render.create({
element: document.body,
engine: engine,
options: options
});

Engine.run