使用向量进行简单的 2D 碰撞检测
Posted
技术标签:
【中文标题】使用向量进行简单的 2D 碰撞检测【英文标题】:Simple 2D collision detection with vectors 【发布时间】:2012-04-13 16:16:44 【问题描述】:我正在尝试创建碰撞算法并在我的 Win32 2D GUI 应用程序中实现他。 任务是我得到一个向量来确定 .bmp 图像的中底,以及另外四个位于菱形位置的向量。我想让它工作,以便算法知道图像是来自左、右、上还是下。互联网上有很多关于矩形、圆形和距离计算的碰撞检测的教程,但我在将它们应用于菱形时遇到了困难。还有一种叫做axis-aligned bounding 的东西,但我认为它适用于 3d 矢量。当谈到这个话题时,我很弱,所以如果有任何熟练的 C++ 程序员可以指导我阅读一些提到这个话题的好电子书,或者如果代码很小,可以打出来。我尝试在 ABCD 整个菱形上进行 X、Y 坐标的迭代,结果惨遭失败。
感谢所有提供帮助的人。
【问题讨论】:
2 个问题:1) 这是作业吗? (如果是,那很好,但应该标记为homework)和2)到目前为止你尝试了什么? 轴对齐边界框(简称 AABB)对于 2d 和 3d 都很有用。这个想法是用一个简单的形状包围一个复杂的对象,以便于检查碰撞。然后,如果边界框不发生碰撞,则无需检查内部复杂对象的所有细节。你仍然需要编写代码来碰撞真实对象——但它不需要每帧运行数千次...... 是的。抱歉没有标记为作业,这个网站对我来说是新的。我知道如何为矩形和圆形做碰撞,那是以前的作业。除此之外,我尝试进行像素完美碰撞,但后来我意识到在我当前的代码中实现它会更加困难。 【参考方案1】:我不是计算机图形方面的专家,但通常你的问题归结为确定一个点是否在凸多边形内。
为此,我将使用以下简单技术。有一个称为向量积的函数,它有助于确定从一个向量到另一个向量的旋转方向是正还是负。因此,您检查点 X 是否在由多边形 A_1、A_2、...、A_n 形成的菱形内只是检查所有向量积 (A_iA_i+1, A_iX) 是否具有相同的符号。
向量 (x1, y1) 和 (x2, y2) 的向量积定义为 x1 * y2 - x2 * y1。
现在,您的检测过程如下:如果之前的位置在多边形外部,而当前位置在多边形内部,那么点已经击中多边形。为了确定哪一侧被交叉,您只需检查向量积 (A_iA_i+1, A_iX) 的哪些符号自上次位置更新以来发生了变化。
【讨论】:
对不起。我不太确定我是否理解 (A_iA_i+1, A_iX) 循环中的内容。 @Marko:A_iA_i+1
是从A_i
开始到A_i+1
结束的向量,A_iX
同样是:从A_i
到X
的向量。接下来,您需要计算这些向量的向量积。您正在为所有可能的i
执行此操作。然后检查产品的所有标志是否相同。以上是关于使用向量进行简单的 2D 碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章