【问题标题】:How to restrict DynamicBody not to bounce from each other (but still collide)?如何限制 DynamicBody 不相互反弹(但仍然碰撞)?
【发布时间】:2012-08-01 02:13:32
【问题描述】:

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

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

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

澄清:

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

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

【问题讨论】:

标签: java box2d libgdx


【解决方案1】:

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

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

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

祝你好运!

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • Sven,感谢您的反馈,但这实际上并不是我问题的答案(但是我可能一开始就不够精确 - 我开始使用 Box2D 是为了不重新发明轮子:一直在挣扎已经有了自己的,极其简单的物理,但很快就开始讨厌添加功能[而且性能也很糟糕])。
    【解决方案3】:

    感谢 iforce2d 的评论,我可以在以下线程中找到正确的答案:How to detect collision but do not collide in box2d?

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

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2013-11-16
      • 2013-04-24
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多