JavaScript,Matter.js:为一个物体禁用碰撞

12

正如标题所提到的那样,我正在寻找一种方法来禁用Matter.js中物体的所有碰撞。它仍应该能够与约束相链接,并且在一段时间后还应该有重新启用碰撞的可能性。有没有办法做到这一点?难点在于该对象不应与任何其他对象发生碰撞,但所有其他对象应互相碰撞。

2个回答

9
你可以使用碰撞过滤器,像这样:

您可以使用碰撞过滤器,如下所示:

const body = Matter.Bodies.rectangle(100, 100, 50, 50);
// turns off collisions
body.collisionFilter = {
  'group': -1,
  'category': 2,
  'mask': 0,
};

从文档中得知:

如果两个物体具有相同的非零值collisionFilter.group,则如果该值为正,则它们将始终发生碰撞,如果该值为负,则它们永远不会发生碰撞。

使用类别/掩码规则,当每个体在其掩码中包括另一个体的类别时,即(categoryA & maskB) !== 0(categoryB & maskA) !== 0 都为true时,两个体AB就会碰撞。


只是一个快速的优化:在“'mask': 0”之后的那个逗号是不必要的。 - Yaume
8
@Yaume,我认为在对象定义中使用尾随逗号没有问题。甚至有些语言(如Go)要求这样做。这样可以轻松地添加新的键值对并更改键值对的顺序,而不会出现语法错误(或更糟的是,逻辑错误)。从性能(或可读性)的角度来看,这显然不是一种优化。 - ggorlen
1
@Yaume 这非常微小,归结为个人偏好。 - Adam Fratino

5

查看

Matter.IBodyDefinition.isSensor

为了禁用物理碰撞,可以针对Body进行设置。但是Body仍然可以作为碰撞器件使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接