如何防止圆形物体滑入静态物体之间的0px间隙

时间:2018-07-14 22:27:54

标签: physics collision matterjs

所以我的身体是对撞机

有时速度很大

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

身体以高速度穿过它

这是我所有机构的配置:

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

之间的值

1 个答案:

答案 0 :(得分:1)

问题在于您使用的something.js没有连续的冲突检测。几年来一直是feature request。现在,这并不意味着您无能为力。问题说明本身包含一些代码,这可能是通过矩形边界解决问题的最便宜的方法:

  

它会检测一个物体是否在世界范围之外,然后反转速度并向后平移该物体

或者,此post提供了一些想法。

如果您想自己实现某些功能,我将尝试解释连续碰撞检测算法。

基本上,对于场景中的每个运动物体,您都必须计算帧0<t0<1的一部分内的下一个碰撞时刻,然后将位置提前到帧t0的这一时刻,更新速度进行碰撞,然后继续进行下一次碰撞t0<t1<1,直到到达tn=1(帧结束)的时间为止,请确保您不会由于四舍五入而陷入帧中间计算或“转角”对象。对于球形对撞机,通常通过使用capsule vs capsule(对于对象对)相交,并使用capsule vs box作为边界来完成。

您也可以通过以较低的速度隐藏多个隐藏帧来作弊:

  • 获得最高物体速度
  • 获取最小的对象碰撞器半径
  • 将最高速度除以对撞机的最小半径,然后将“减速比例”四舍五入为整数
  • 以该整数“减速比例”减速场景中的所有对象,并更新场景“减速比例”时间,而无需重新绘制屏幕
  • 仅更新一次屏幕,并显示“减速比例”更新的结果,您应该获得与不减速时相同的位置,但要注意碰撞

好运相撞!