二维碰撞检测码

时间:2010-08-15 19:36:38

标签: c++ math collision-detection

有没有人知道一个非常简单的物理引擎,或者只是一组可以完成这些任务的基本功能:简单的点,线和矩形碰撞检测?我看了Box2D,但它对于我正在制作的东西来说太先进了。我只需要一些简单的代码。提前谢谢!

2 个答案:

答案 0 :(得分:5)

这是我在点/线碰撞检测中的镜头。重要的是避免触发功能,分割和其他昂贵的操作,以免减慢过多的速度。

正如GMan的评论所指出的那样,你需要记住这一点将会发生变化。因此,您将拥有该点的当前位置(让我们称之为A)以及该点(B)的可能新位置。您需要了解当点从A移动到B时,它是否会与一条线发生碰撞。

让我们调用行CD的起点和终点。仅当行ABCD相交时才会发生碰撞。

让我们使用标准等式AB描述行Ux + Vy + W = 0。在一些代数之后,等式出现为:

(ay - by) x + (bx - ax) y + ax by - bx ay = 0

我们可以根据参数CD和常量t描述行X Y U V

x = X + Ut
y = Y + Vt

如果我们在点t=0设置C,在点t=1设置D会很有帮助。通过考虑t=0,我们可以制定XY。通过考虑t=1,我们可以确定UV。这给了

x = cx + (dx - cx) t
y = cy + (dy - cy) t

要找到两条线的交点,请将它们替换为我们为AB找到的等式,它给出了

(ay - by) (cx + (dx - cx) t) + (bx - ax) (cy + (dy - cy) t) + ax by - bx ay = 0

这减少到

t = (ax by - bx ay + bx cy - cx by + cx ay - ax cy) / q

其中q = (ay - by)(cx - dx) - (ax - bx)(cy - dy)

  • 如果q为零,则线条是平行的,不符合。
  • 如果0 < t < 1,则从AB推断的行与CD相交。

但我们仍然不知道这个交叉点实际上在点AB之间。因此,我们需要重复之前的所有步骤,交换ABCD,并根据参数AB编写行s。这给出了:

s = (cx dy - dx cy + dx ay - ax dy + ax cy - cx ay) / q
  • 如果0 < s < 1,则从CD推断的行与AB相交。

就是这样。因此,在您的代码中,您首先要计算q。如果q为零,那么这些线是平行的。否则,请继续计算ts。如果0 < t < 10 < s < 1则即将发生碰撞。要查找碰撞的位置,请将ts替换为CD的原始等式。

对于额外的速度,您可以通过q删除除法 - 可以只检查每个分数的上半部分是否在正确的范围内,然后每个检查只需要10次乘法运算。

答案 1 :(得分:0)

是否有理由不能使用基本几何图形?

当坐标相同时,两个点会发生碰撞。

当一个点的位置是该线的等式的解时,该点与一条线相交。

当点由矩形界定时,点与矩形相交。

通过组合这些案例,可以构建更复杂的复合案例。你出于某种原因特意寻找图书馆吗?