正如标题中已经提到的,我正在寻找一种方法来禁用Matter.js中身体的每次碰撞。它仍然可以与Constraints链接,并且应该有可能在一段时间后再次启用碰撞。有没有办法做到这一点?关于它的难点在于,对象不应该与任何其他对象发生碰撞,但所有其他对象应该相互碰撞。
答案 0 :(得分:6)
您可以使用collision filters执行此操作。您可以在collision filtering demo和source code中看到它们的示例。
他们的工作方式类似于他们在Box2d中所做的工作,因为有一个很好的article可以用来了解它们的工作原理。
答案 1 :(得分:2)
您可以使用碰撞过滤器,如下所示:
Function SelectedShapesToArray(ShRange As ShapeRange) As Variant
Dim aTemparray() As Shape
ReDim aTemparray(1 To ShRange.Count)
Dim x As Long
For x = 1 To ShRange.Count
Set aTemparray(x) = ShRange(x)
Next
SelectedShapesToArray = aTemparray
End Function
Sub Test()
Dim x As Long
Dim ShArray() As Shape
ShArray = SelectedShapesToArray(ActiveWindow.Selection.ShapeRange)
' Test: do we have all the shapes we expected?
For x = LBound(ShArray) To UBound(ShArray)
Debug.Print ShArray(x).Name
Next
' Here you could sort ShArray on ShArray(x).top
End Sub
从文档中
“如果两个实体的冲突过滤器.group的值相同且非零,则它们将始终碰撞,如果该值为正,则它们将始终发生碰撞,如果该值为负,则它们将永远不会发生碰撞。”
“使用类别/掩码规则,如果两个实体A和B各自在其掩码中包含对方的类别,则它们会发生冲突,即(categoryA&maskB)!== 0和(categoryB&maskA)!== 0都为真。”
答案 2 :(得分:1)
见
Matter.IBodyDefinition.isSensor
为了禁用Body的物理碰撞。 Body仍然可以用作碰撞传感器。