【问题标题】:How to detect shape collision - Android如何检测形状碰撞 - Android
【发布时间】:2015-04-07 15:12:48
【问题描述】:

我想检测在 Android 游戏的画布 (SurfaceView) 上动态绘制的形状之间的碰撞。

我可以轻松地使用 Rect 或 RectF 对象的 intersect 方法,但结果不是很好(见下图,我有一个“错误”检测)。

我不想使用位图,所以不可能使用“像素完美”的方法。

你知道圆形、矩形、三角形和其他基本形状相交的方法吗?

感谢帮助;)

【问题讨论】:

  • 看看AABB、OBB等碰撞检测算法

标签: android collision-detection


【解决方案1】:

为了获得良好的碰撞检测,您必须在后面创建自己的模型。在这些模型中,您可以指定两个对象碰撞的条件。

例如,圆由圆心位置和半径来描述。正方形由左下角和边长描述。

您不必描述所有可能的 poligon,您可以使用所谓的边界框,这意味着,对于复杂的随机 poligon,您可以使用正方形或最适合它的任何形状(也可以使用多个形状单个对象)。

在您记住对象之后,您计算每个对象将与包括其自身在内的所有其他形状发生碰撞的条件。

在您的示例中,如果正方形的任何角之间的距离大于圆的半径,则球体和正方形会发生碰撞。

在这里你可以阅读更多http://devmag.org.za/2009/04/13/basic-collision-detection-in-2d-part-1/

这个问题可能会变得非常复杂,如果你想要一些简单的东西,请保持简单。

【讨论】:

  • 我认为您的解决方案是最好的,但似乎很难找到一种对所有形状都足够通用的算法...我可能应该改变主意并使用具有像素完美算法的位图。
【解决方案2】:

这是我在自己的游戏中使用的一种直接适用的方法来检测圆形和矩形的交点。它将球(在这种情况下是一个视图)和矩形(也是一个视图)作为参数来检查与球的碰撞。您可以将方法放在Timer 中,并设置您希望圆形和矩形检查碰撞的间隔。

方法如下:

public boolean intersects(BallView ball, Rectangle rect) {
        boolean intersects = false;
        if (ball.getX() + ball.getR() >= rect.getTheLeft() &&
            ball.getX() - ball.getR() <= rect.getTheRight() &&
            ball.getY() + ball.getR() <= rect.getTheBottom() &&
            ball.getY() - ball.getR() >= rect.getTheTop())
        {
            intersects = true;
        }

        return intersects;

    }

getR() 获取圆的半径

getX()获取圆心的X位置值

getTheLeft() 获取矩形的左 X 值

getTheRight() 获取矩形的右 X 值

getTheTop() 获取矩形的顶部 Y 值

getTheBottom() 获取矩形底部的 Y 值

如果您不能在代码中直接使用此方法,您仍然可以推测在适合您的地方实现它所需的逻辑。它检测所有碰撞,而不使用像圆的碰撞框这样的伪碰撞检测。

祝你好运!如果您有任何问题,请随时提出,我随时为您提供帮助!

【讨论】:

    【解决方案3】:

    要知道 2d 中的多边形是否与圆相撞,您可以针对它的每条线测试直线上最靠近圆心的点在哪里 (this might help)。

    然后,检查您找到的点是否在构成直线的两个角之间 - 也就是说,该点实际上在直线上,而不仅仅是在其延续上 - 以及该点到中心的距离是否圆的半径小于或等于圆的半径。如果对于多边形的任何一条线两者都为真,则您有勾结。您还必须检查多边形角可能位于或接触圆的边缘情况。

    对于两个圆圈,这更容易。检查中心之间的距离,并将其与它们的半径之和进行比较。如果距离小于或等于总和,则为合谋。

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 2012-07-07
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多