找到两个移动的旋转边界框的交叉点的时间和位置

时间:2013-04-10 18:20:25

标签: algorithm math optimization geometry collision-detection

强调寻找时间(交叉路口开始时),虽然位置也很重要。边界框(不是轴对齐)具有位置,旋转,速度和角速度(旋转速率)。没有加速度,这应该真正简化事情......如果有必要,我可以删除角速度分量。连续或迭代函数都可以工作,但除非迭代函数主动收敛于解(或缺乏解),否则它可能会太慢。

我查看the SAT,但似乎并不是为了找到移动物体的实际碰撞时间。它似乎只适用于非移动快照,并且设计用于处理比矩形更复杂的对象,因此它实际上似乎不适合这个问题。

我考虑过可能从8个点中的每个点绘制轨迹然后以某种方式具有函数,如果一个点进入或离开另一个形状并且获得该时间范围发生,但我很丢失如何去做。一个很好的功能是它完全随着时间运行而忽略了离散“步骤”的想法,但它也让我觉得这是一种效率低下的方法。

不担心广泛的阶段(确定是否值得看看这两个边界框是否重叠),我已经解决了这个问题。

2 个答案:

答案 0 :(得分:2)

找到精确的碰撞时间本质上是一个非线性的根发现问题。这意味着您最终需要一种迭代方法来确定最终的碰撞时间 - 但设计碰撞求解器时的聪明一点是在实际不需要时避免求解根...

SAT是一个定理,而不是算法:它可以用来指导碰撞求解器的设计,但它本身并不是一个。简而言之,它表示,如果您可以演示存在分离轴,则对象不会发生碰撞。相反,如果您可以显示没有这样的轴,则当前的对象重叠。正如您所指出的,您可以或多或少直接使用此原则来设计二进制“是/否”查询,以确定给定位置中的两个对象是否重叠。

与碰撞求解器的区别在于问题是动画的,或动能的:对象位置是时间的函数。解决此问题的一种方法是从有效的“是/否”碰撞测试开始,将所有不等式视为时间函数,并使用根查找方法在此基础上查找实际的碰撞时间。

已发表的学术文献中有各种现有方法。我推荐一些图书馆研究:最好的选择可能取决于你的申请细节。

答案 1 :(得分:0)

首先,不要考虑分别以速度(x1, y1)(x2, y2)移动的两个矩形,而是可以修复其中一个(将其速度设置为(0, 0))并考虑另一个一个以速度(x2 - x1, y2 - y1)移动。

这样,情况看起来像一个矩形是不可移动的,另一个矩形经过,可能会撞到第一个。

  • 假设你没有任何角速度

enter image description here

不难看出,然后你可以将第一个矩形的4个边的第4个轨迹(它们是从(x2 - x1, y2 - y1)方向的边界框的不同角落开始的光线)相交,静止不动。然后你必须做同样的反过来 - 找到第一个反方向移动的矩形 - (-(x2 - x1), -(y2 - y1))与第二个矩形的4边相交。选择您找到的所有交叉点之间的最小距离(可能有0-8个)并且您已完成。

不要忘记考虑许多特殊情况 - 当两个矩形的边平行时,根本没有交叉点等。

请注意,这一切都是在O(1)时间内完成的,尽管计算非常复杂 - 光线和片段的32个交点。

  • 如果你真的希望你的矩形以一定的速度旋转,我会建议考虑@comingstorm所说的:这是一个找到非线性方程根的问题,但是,即使在这种情况下,如果你有一个矩形的角速度有限,您可以将任务分成一系列ternary search子任务,但我认为这只是解决非线性问题的可能方法之一。