首页 > 解决方案 > 两个可旋转矩形的碰撞检测

问题描述

我正在使用 c#(单游戏引擎)制作 2d 游戏。而且我需要一个函数,该函数将根据旋转的矩形是否与其他也可以旋转的矩形发生碰撞而返回真或假。

现在,我有一个函数,它根据两个矩形是否碰撞返回真或假。但没有旋转。

像这样的东西

public bool Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    if (x1 < x2 + w2 &&
        x1 + w1 > x2 &&
        y1 < y2 + h2 &&
        h1 + y1 > y2)
        return true;
    return false;
}

但相反,所有这些参数我有两个对象。

谢谢。

标签: c#collision-detectionmonogame

解决方案


对旋转的矩形进行碰撞检测比对轴对齐的矩形进行碰撞检测更具挑战性,但这并不是特别难:

基本思想是两个矩形相交当且仅当你不能在它们之间画一条直线。这听起来很明显,实际上对于任何凸面形状都是如此。

但是,我们可以让事情变得更简单,因为我们正在处理矩形:这些潜在的分割线之一将平行于矩形的边之一。这留下了 4 个可能的轴(每个矩形两个)。我们只知道这条线是平行的,不完全是在哪里,但是有一个技巧:

对于每个线方向,让我们创建另一条垂直于该方向的线。然后,我们将两个矩形都投影到那条线上。现在我们可以检查矩形是否重叠。

如果他们知道,我们什么都不知道,但如果他们不知道,我们知道矩形肯定不会相交。

一旦我们尝试了所有四个可能的方向并且没有找到分离轴,我们就知道矩形相交。

唯一具有挑战性的部分是将矩形投影到线上。这是使用点积完成的,但您可能会在其他地方找到更好的解释。基本思想是将矩形的每个角变成一个数字,表示它在直线上的距离。然后取每个矩形的最小和最大数量,并检查这些区域是否重叠。

很抱歉我没有提供任何代码,但应该可以按照这些步骤来获得有效的实现。

我的回答基于此(您还可以在其中找到图片):

https://www.gamedev.net/articles/programming/general-and-gameplay-programming/2d-rotated-rectangle-collision-r2604


推荐阅读