如何在box2d中检测碰撞但不实际发生碰撞?

14

如何检测身体是否与其他身体发生了碰撞但不对此碰撞做出反应。

默认情况下,我可以检测到碰撞并且身体会发生碰撞。

如果我设置fixtureDef过滤器,则身体不会发生碰撞,但我无法检测到碰撞。

请帮忙解决!

2个回答

22

如果装置从未需要与任何东西碰撞,则可以将其设置为传感器。如果您需要它与某些东西发生碰撞,但不是其他东西,则可以在碰撞侦听器的PreSolve中根据其所碰撞的内容使用contact->SetEnabled(false)。


附注:您可以使用碰撞掩码和/或碰撞组来控制夹具应该与什么碰撞以及不应该碰撞,而不是使用PreSolve。 - Thomas
他仍然想要检测碰撞发生的时候,只是不想有任何碰撞响应。改变碰撞掩码将完全防止碰撞检测。 - iforce2d
真的。这需要与传感器夹具结合使用。 - Thomas

9
你需要的是身体上的传感器装置。从box2d手册中可以看到:
有时游戏逻辑需要知道两个fixture何时重叠,但不应产生碰撞响应。这通过使用传感器来实现。传感器是一种检测碰撞但不产生响应的fixture。
您可以将任何fixture标记为传感器。传感器可以是静态或动态的。请记住,每个body可能有多个fixture,并且可以具有任何混合的传感器和实体fixture。
传感器不会生成接触点。有两种方法可以获取传感器的状态:
1. b2Contact :: IsTouching 2. b2ContactListener :: BeginContact和EndContact
您可以将fixture设置为传感器,然后将其写入contact listener中。如果fixture的sensor标志设置为true,则它将提供碰撞数据而不会在物理模拟碰撞(即允许您测试它与任何其他碰撞fixture之间的重叠)。
这是一个关于如何开始使用传感器的有用教程 Ray Wenderlich传感器教程

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