Day10. 人与人之间偶有摩擦,物体与物体之间叫做碰撞 - Collision(上)

我们先前已经有了碰撞,但是之前我们其实都是使用预设的物理现象与engine模组来制造碰撞,其实并没有太深入去了解 Matter.js 是怎麽处理与看待碰撞这件事,我们今天来聊聊,Matter.js中的碰撞大概的实作流程与相关模组。

在做碰撞检测前,我们先定义一下碰撞这个行为本身,什麽叫碰撞?

听起来很直觉的问题,要回答得清楚倒也没那麽容易,容笔者在这里下一个快速简短的小定义:当两个物体的面积上发生了接触,且此接触对两个物体带来了相互作用造成物体本身能的改变。

其实 Matter.js 的模组中跟碰撞相关的还挺多的,我们来一一条列稍微看看他们在做什麽。

  • Bounds - 创建与操作AABB盒
  • Contact - 用来创建与操作碰创相接内容
  • Detector - 用来监测碰撞发生的Pairs
  • Grid - 创建与操作Broadphase grid结构(Broadphase简单的说是一种叫粗略的碰撞检测方式)
  • Pair / Pairs - 创建与操作碰撞用的Pair
  • Query - 处理碰撞的查询
  • Resolver - 用来处理碰撞前後的资讯(位置/速度)
  • SAT - 倚赖Separating Axis Theorem来侦测是否有发生碰撞

以API文件为准,我们其实总共就29个大标,扣掉一个在笔者现行版本文件已注明会淘汰且由其他的模组处理的,28个模组中就有8个在处理碰撞资讯,毕竟碰撞侦测与实行就是物理引擎中相当重要的一环。

其实在 Matter.js 里面有单独一个碰撞的资料夹,要看原始码的话可以看看这个:

https://github.com/liabru/matter-js/tree/master/src/collision

在演算层面,碰撞有很多方式与计算理论, Matter.js 采用的是 SAT 理论 (SAT也可以看这个),笔者一样不会细提,不过提供一篇蛮详细的参考文章,如果对背後演算有兴趣的可以参考 这个

稍微提一下碰撞这个行为本身在 Matter.js 中相关模组怎麽发生作用的及顺序的。

原始码会是参考:

https://github.com/liabru/matter-js/blob/master/src/core/Engine.js

首先是 engine 在创建的时候,会创建一个 grid,grid 会去用现有所有的物体,来计算并储存一些关於物体相关的资讯(如物体所占区域),当物体位移或资讯改变的时候,也会移并改变这些储存的内容。

接着轮到检测碰撞的阶段,前面讲刚体的时候,我们有聊过 collision filter 这个属性的设置与运行方式,如果不记得的人,可以回去看这里。

当确认两物体有碰撞可能性的话,进一步会用上面提到的SAT方式来做碰撞检测、创建碰撞对(Pair)。

所以上面这麽多模组,其实都是彼此高度相依的,如果读者想尝试了解碰撞理论,可以跟着笔者上面写的流程与提供的原始码连结稍微尝试追追看,可能会对它的实作有更多的了解。

在我们的实作中,撇除高度自制的场景,我们其实相对不太会呼叫这几个模组,所以今天其实也没有范例代码(但其实笔者今天撰写这篇文花费了阅读参考资料跟追原始流程比平常写代码还多XD)。

今天主要是带大家了解一下文件中这些模组个别扮演的角色,还有一些物理学计算的名词,虽然没有太多的解释,有些是以提供参考内容的方式,如果有想藉这个机会深读一下碰撞及物理学一些概念的话,这些资料应该会是一个敲门砖。

明天的下集会着重於碰撞发生检测相关事件,也就是我们要怎麽知道碰撞、实作相关反应的部分,也会有代码带大家一起练习,那我们明天见!


<<:  [Day 10]怎麽每天都像在赶末班电车R(前端篇)

>>:  TypeScript 能手养成之旅 Day 8 物件型别-扩充型别-元组(Tuple)

使用模拟器

在Android Studio 启始画面的右下角,可以呼叫出AVD,这就是Android Virtu...

第 59 天 - 学会除了 --help 跟 -h 外,使用 man 查询指令使用方式

操作画面 : 主要 man 可以完全滑鼠,像读书一样分章节阅读 另外今天发现 forloop 1 到...

19.MYSQL NOT指令

NOT与!的意思相同,它代表的意思是,运算结果为0时回传1,其他都回传1 WHERE NOT (AG...

写Web不能不知道的常见网路攻击:CSRF

CSRF全名是 Cross Site Request Forgery,翻成中文就是跨站请求伪造。 攻...

ASP.NET Core MVC

什麽是 MVC 分别是 Model, View, Controller, 是一种软件架构, View...