3

所以我有这个身体是一个圆形对撞机

有时速度很大

问题是边界的平铺地图是由小瓷砖组成的

身体高速穿过它

这是我所有机构的配置:

const config = {
  inertia: Infinity, // do not spin
  friction: 0, // X*100% stop on hit
  frictionAir: 0, // X*100% slow on move
  restitution: 0.5, // bounce X*100% on hit
  collisionFilter: this.level.getCollisionFilter(), // default collision filter
  isStatic
}

...

getCollisionFilter (key = null) {
  switch (key) {
    case 'fly':
    return {
      category: 0x0008,
      mask: 0xFFFFFFF1,
      group: -1
    }
    case 'items':
    return {
      category: 0x0004,
      mask: 0xFFFFFFF1,
      group: -1
    }
    case 'woda':
    return {
      category: 0x0002,
      mask: 0xFFFFFFFF,
      group: -1
    }
    default:
    return {
      category: 0x0001,
      mask: 0xFFFFFFFF,
      group: 0
    }
  }
}

```

woda意味着water如果它有任何相关性

这是在默认值和woda

4

1 回答 1

3

问题是您使用的 matter.js 没有连续的碰撞检测。几年来,它一直是一个功能请求。现在,这并不意味着您无能为力。问题描述本身中有一些代码,这可能是解决通过矩形边界问题的最便宜的方法:

它检测身体是否在世界范围之外,然后反转速度并将身体平移回来

或者,这篇文章提供了一些想法。

如果你想自己实现一些东西,我会尝试解释连续碰撞检测算法。

基本上,对于场景中的每个移动对象,您必须在帧的一部分内计算下一次碰撞的时刻0<t0<1,然后将位置推进到t0帧内的这一时刻,更新由于碰撞而产生的速度并进一步进行下一次碰撞t0<t1<1,直到你到达(帧结束)的时间tn=1,确保您不会因为计算的舍入或“角落”对象而卡在帧的中间。对于球形对撞机,这通常通过使用胶囊与胶囊(对于对象对)相交和胶囊与盒子作为边界来完成。

您还可以通过以较慢的速度拥有多个隐藏帧来作弊:

  • 取最高物体速度
  • 取最小的对象对撞机半径
  • 将最高速度除以对撞机的最小半径,然后将“减速比例”四舍五入为整数
  • 以整数“减速比例”减慢场景中的所有对象并更新场景“减速比例”时间,而不重绘屏幕
  • 只重绘一次屏幕,结果是“减速比例”更新,你应该得到与没有减速相同的位置,但尊重碰撞

碰碰运气好!

于 2018-07-24T05:42:48.520 回答