【问题标题】:How to build a circular wall in Box2D?如何在 Box2D 中构建圆形墙?
【发布时间】:2017-04-09 10:54:51
【问题描述】:

我知道要在 Box2D 中为四个边构建墙/栅栏,我们只需要为每边绘制一个边或一个矩形框。但是如果我想让我的精灵在一个圆形盒子里移动呢?并且还检测到圆形墙内侧的碰撞?如果我尝试制作一个圆形物体,是否允许任何可移动的物体进入这个圆形物体?实现这一目标的正确方法是什么?

编辑:

我只需要 AABB 碰撞检测,不关心恢复和摩擦。但是如果我必须在 Box2D 中使用b2ChainShape,也许我正在寻找结合 Box2D 和简单几何碰撞的东西。这样我就可以使用 Box2D 来检测圆圈内精灵的 AABB 碰撞,但是当我检查精灵和大圆形墙之间的碰撞时,我想使用简单的几何检查。我只是不知道这是否可行。我的情况是我将碰撞检测放在服务器上,所以通过使用 Box2D,一切都在 Box2D 的世界中进行测量,也就是“MKS”世界。现在,如果我使用简单的图形绘制圆形墙,并且我想检查精灵和墙之间的简单几何碰撞,我将不得不使用像素。

【问题讨论】:

    标签: collision-detection box2d


    【解决方案1】:

    您可以通过使用b2ChainShape 创建一个循环并传递足够多的顶点来构建圆形墙,以使物理看起来像您必须拥有的那样圆。请注意,这并不完全是圆形墙。只有一个近似值,它实际上是具有 N 个边的多边形内部(其中 N 是您提供的顶点数)。

    以这种方式创建一堵墙将允许物体在其中,与它碰撞(就像物体与任何其他静态物体一样),并被它限制。只要那些物体(实际上是那些物体的形状)基本上至少小于这堵墙的边界。是的,任何可移动的物体都可以进入这堵墙。

    可以用其他方式建造圆形墙,但如果是我,我至少会从这种机制开始(b2ChainShape)。在库附带的标准形状中,这是最节省内存的方法。或者,可以继承b2Shape 并开发所有其他必要的代码。或者编写任何自定义代码来模拟所需的物理。然而,可以这么说,那将是“重新发明轮子”(当然,除非所需的物理特性尚未在 Box2D 中完成)。

    希望这能回答您的问题。

    【讨论】:

    • 谢谢。我曾经在没有 Box2D 的情况下这样做,我只需要使用简单的几何计算在身体移动通过圆的边缘时检测碰撞。但是对于这个b2ChainShape,如果“圆”的半径非常大,则形状将由过多的顶点组成。这会对性能产生负面影响吗?
    • 是的。如果没有 Box2D,当然可以做到这一点。这也可能更有效。但目前更重要的是:代码的效率/性能,还是诸如上市时间(开发时间等)之类的东西?我相信b2ChainShape 的算法性能主要取决于在任何给定时间任何其他身体的 AABB 将与之交互的这种形状边缘的 AABB 数量。但这提供了碰撞物理,如恢复和摩擦,如果你不需要,可能会浪费循环。
    • 我明白了。我已经编辑了我的问题,请检查一下。如果使用b2ChainShape可能会对性能产生负面影响,我也想知道同时做Box2D AABB碰撞检测和简单几何碰撞检测是否可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    相关资源
    最近更新 更多