【问题标题】:2D bounding box collisions with rotation带有旋转的 2D 边界框碰撞
【发布时间】:2013-07-15 22:46:39
【问题描述】:

我目前正在为安卓开发一款简单的太空游戏。我的碰撞检测将使用矩形和圆形边界框完成。这些边界框需要能够旋转,所以我的问题是:检测旋转的矩形和圆形之间的碰撞最好的方法是什么?谢谢你的帮助:)

【问题讨论】:

  • 您使用的是引擎还是什么?当您使用现有的游戏引擎而不是自己构建所有内容时,解决方案可能会有所不同。
  • 天真的方法?在矩形的每一边采样 N 个点,检查是否有任何点在圆内。我很好奇数学上更有效的方法是什么。
  • 对不起,我没有使用引擎,只使用本机代码。我绝对对最有效的方法感兴趣,因为它会带来更好的碰撞检测

标签: java android collision-detection


【解决方案1】:

好的,我已经解决了我自己的问题!圆与矩形相交只有两种情况: 1.圆心在矩形内 2. 圆与矩形的其中一条边相交 所以为了检查碰撞,我首先检查圆心是否在矩形内,然后根据矩形的旋转来旋转圆心,以简化我的计算。如果圆心在矩形内,我知道有一个交点,并返回 true。 如果第一次检查返回 false,那么我检查矩形的每一边与圆之间的交点。如果有交叉点,我返回 true。如果有人想要代码,请随时发表评论,感谢您的帮助! :)

【讨论】:

    【解决方案2】:

    通常,边界框只定义对象的边界,(由对象的最大和最小 X 和 Y 的顶点生成的形状) - 这使得计算边界框变得更加简单不需要轮换,因为正如我所解释的那样,它们的目的已经得到满足。如果您想将它们用于碰撞检测,只需检查圆心加上其半径是否与两个轴上的矩形相交,例如:

    public boolean boxintersectscircle(BoundingBox box, BoundingCircle circle) {
        if (box.x > circle.centerx+circle.radius) return false;
        if (box.y > circle.centery+circle.radius) return false;
        if (box.x+box.width < circle.centerx-circle.radius) return false;
        if (box.y+box.height < circle.centery-circle.radius) return false;
        return true;
    }
    

    但是边界框并不准确 - 它们可能会留下大量未占用的空间,因此如果您的游戏担心(玩家感到沮丧),我个人会实施分离轴定理或线/圆检测。

    【讨论】:

    • 这会很好,如果边界框没有旋转的话。该问题涉及旋转边界框
    • 那么我会更好地使用不涉及边界框的解决方案吗?我的印象是,如果边界框旋转,它仍然是边界框......
    • 我不能无限期地说哪种解决方案最适合您,因为我不了解您的游戏(我正在考虑街机游戏“小行星”的思路),但如果您想要完美无瑕碰撞检测,我推荐分离轴定理。
    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2013-04-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多