0

所以,我有一些我想从地图边缘反弹的圆圈(即矩形),但它们不应该相互反弹。

问题是,我仍然需要捕获圆-圆碰撞并对此类事件执行一些任务。

谁能指出我应该去的方向?

为了澄清:

我正在使用 libGDX 和 Box2D,圆圈是 DynamicBodies。在地图的中间可能有一些静态物体,圆圈通常也应该与之碰撞(从它们反弹)。

我尝试的是在联系开始时将两个圆圈的恢复原状设置为 0,并在联系结束时恢复原状(在我的 ContactListener 子类中)。还尝试将临时设置的圆圈作为传感器。不过,我不确定为什么它不起作用。

4

3 回答 3

3

您可以为您的圈子设置过滤器,这样它们会与地图边缘发生碰撞,但不会与自己发生碰撞。如何做到这一点,您可以阅读 box2d 手册http://www.box2d.org/manual.html的“过滤”部分。

要捕获圆-圆碰撞,您可以执行以下操作:

  1. 在每个世界步骤中,您的圈子一个接一个。
  2. 在查看某个圆圈时,通过它的 AABB 进行 AABB 查询。什么是 AABB 查询以及如何使其查看 box2d 手册的“AABB 查询”部分。要获得圆的 AABB,请调用 b2Fixture::GetAABB。
  3. AABB 查询后,您将获得灯具数量,可能与您的圈子发生碰撞。要进行某些测试,请使用 b2TestOverlap 函数,或简单计算中心之间的距离。

祝你好运!

于 2012-07-29T10:18:05.137 回答
0

感谢 iforce2d 的评论,我可以在以下线程中找到正确的答案:如何检测碰撞但在 box2d 中不发生碰撞?

如问题所示:我想对碰撞事件做出反应,但让圆圈不会同时相互碰撞。所以,传感器不是答案,也不是改变身体的物理属性。正确的答案是在CollisionListener ( contact.setEnabled(false) ) 的preSolve方法中禁用联系。就那么简单。

于 2012-07-31T18:13:32.630 回答
0

从高级的角度来看,您可以在应用程序逻辑中编写类似的程序:

从地图反弹是使用一些 if 条件完成的:例如检查圆心的 x 值减去其半径是否小于地图的 x 分量;如果是这种情况,请反转圆周运动矢量的 x 方向。

两个圆的碰撞检测只是将两个圆心之间的连接向量的长度与两个半径之和进行比较;如果它更小或相等,则它们彼此相交。

编辑:哦,对不起,我没有看到您使用某种物理库。我没有使用过 libgdx,但是在其他框架中,您可以定义碰撞组来指定哪些对象可以相互碰撞,然后相应地处理这些组中对象的碰撞。也许 libgdx 也提供了类似的概念?

于 2012-07-24T22:25:35.650 回答