如何测试两个移动的2D定向边界框是否发生碰撞?

4 浏览
0 Comments

如何测试两个移动的2D定向边界框是否发生碰撞?

OBBs具有位置(x,y),速度(x,y)和方向(矩阵)。根据定期更新,OBBs必须相互碰撞,返回被视为成功的移动部分的比例。

我查看了GPWiki上的多边形碰撞测试- http://gpwiki.org/index.php/Polygon_Collision - 但它不考虑移动的对象或完全位于OBB内的对象。

书籍《实时碰撞检测》在第4章:包围体中介绍了3D OBBs,但在3维中进行测试的方法明显比2D更复杂。

0
0 Comments

如何测试两个移动的2D定向边界框之间的碰撞?

要测试两个定向边界框之间的碰撞检测,我会使用分离轴定理(SAT)。实际上,SAT可以用于任意两个凸形状之间的碰撞检测。这种技术并不过于复杂,而且性能合理。

该定理可以很容易地扩展到3D。

算法试图确定是否可以在两个对象之间放置一个平面。如果存在这样一个平面,那么对象是分离的,不会相交。

要确定对象是否分离,只需要将对象投影到平面的法线上,并比较区间,看是否重叠。

所以,显然可以在两个分离的对象之间放置无数个平面。但已经证明只需要测试少数几个平面。

可以证明,对于盒子而言,要测试的分离平面是具有与两个盒子的轴相等的法线的平面。因此,对于2个盒子,总共只需要测试4个分离平面。在这4个平面中,一旦找到一个分离平面将盒子分开,那么就知道盒子不会相交,并返回无碰撞标志。

如果这4个平面不能分离盒子,那么盒子必定相交,那就是有碰撞。

我认为解释得更详细一点会有帮助,不是吗?如果我正确理解了定理,他需要生成垂直于每个旋转边的轴,将OBB投影到该轴上,然后测试是否重叠。对吗?

听起来是一个有趣的算法。更多细节会很好。

Erich,你只需要检查盒子的所有顶点是否在分离轴的同一侧。我知道这里已经有一个问题更详细地解释了这个。stackoverflow.com/questions/115426/…

此外,如果你想完全准确,你应该在测试碰撞之前对非固定矩形进行扫描。然后将扫描的体积与固定矩形进行比较。否则,如果矩形在一个帧中可以互相跳过,你将会错过碰撞。

如果你想测试(快速)移动对象之间的碰撞检测,添加“扫描和修剪”是必要的,否则你可能会错过碰撞,特别是使用较长的时间步长。

0
0 Comments

如何测试两个移动的2D定向边界框的碰撞?

如果你有两个边界框(即矩形),它们具有任意的方向(我假设这意味着某种“旋转”),那么我会按照以下步骤进行测试:

1. 从初始位置开始(假设边界框不相交),根据其速度(以任何你应用的时间移动方式)将每个边界框向前移动。

2. 找到每个平移边界框的角点的坐标。这四个坐标定义了构成边界框边缘的四条线段的端点。

3. 对于边界框1,测试其每条线段与边界框2的4条线段之间是否相交。你可以使用标准方程计算两条线的交点,例如在这里讨论过的方法。

4. 如果有相交,根据交点的坐标和已知的平移量,计算出成功移动的比例。

5. 重复上述步骤进行每次更新。

编辑:一个简单的伪代码(合并了评论中讨论的内容)如下所示:

...检测OBB边缘之间的相交...

如果找到任何相交点{

...当OBB部分重叠时运行代码...

}else{

P = 线段,其端点是OBB中心;

...检测P与OBB边缘之间的相交...

如果P与两个OBB的边缘相交{

...当OBB不相交时运行代码...

}else{

...当一个OBB完全位于另一个OBB内部时运行代码...

}

}

我认为这不会涵盖一个OBB完全位于另一个OBB内部的情况,因为线段不会相交,但OBB确实相交。

是的,这是一种特殊情况,你需要进行额外的测试。但是,如果OBB以足够小的增量移动,相交很可能会在一个OBB进入另一个之前发生。

我知道这可能不适用于他的用例,但如果初始条件是一个已经在另一个内部,那该怎么办呢?我认为他可以从中心点到中心点画一条线。如果该线只与一个OBB的线相交,则一个OBB在另一个OBB内部。这必须在运行你的测试之后进行,以排除部分重叠的情况。有没有比这更简单的检查方法?

(顺便说一下,我忽略了一个OBB小于增量移动的情况,因为你已经提到了“足够小的增量”,这应该考虑到OBB的大小)。

我需要再仔细检查一下,但我相信一种测试OBB是否在另一个OBB内的方法是创建一个从中心点到中心点的向量,然后测试它是否满足以下条件之一:a)与一个OBB的边缘线相交或b)不与任何OBB的边缘线相交且总长度小于OBB对角线长度的一半。

0
0 Comments

这个问题的出现的原因是想要测试两个移动的2D定向边界框之间是否发生碰撞。目前已经有了一个解决方法,即检查一个边界框的四个顶点是否在另一个边界框内,然后再检查另一个边界框的四个顶点是否在第一个边界框内。具体的解决方法如下:

假设要检查的第一个边界框的顶点为v,第二个边界框的四个顶点为v1...v4。首先,通过第二个边界框的方向进行逆旋转,即将这五个顶点都进行逆旋转。逆旋转一个向量u需要将u乘以M的转置,即M^T*u,其中M为旋转矩阵。这样得到的第二个边界框,记为#2',就是与坐标轴对齐的。现在可以立即检查v'是否包含在#2'内部。如果发现任何一个第一个边界框的顶点在第二个边界框内部,那么就说明发生了碰撞。否则,继续检查。这个测试的成本应该足够低廉,除非需要对大量的边界框对进行测试。

关于运动,可以进一步进行深入研究,可以查阅“continuous collision”相关的内容,自己看看。我非常相信没有任何游戏会使用这些复杂的技术。如果确实移动得非常快,可以细分时间步长,并在每个位置/方向子迭代上执行碰撞检测。

还有一个相关的讨论可以参考:这里有一些很好的参考资料。

对于这个问题的编辑,我给予+1的支持。我之前本来想给你-1的,但是编辑后挽救了你。我觉得应该将这个问题标记为重复。

我仍然支持我的建议,为什么要-1?

只是为了明确,我没有给你点踩。你的回答非常难以理解(尽管我理解你的意思,读了几次后才明白),没有解释或链接说明如何进行顶点的逆旋转。另外,你是不是想说“如果任何一个顶点”,而不是“如果三个顶点”?

0