2

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

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

我已经考虑过可能从 8 个点中的每一个中绘制出轨迹,然后以某种方式具有一个函数来判断一个点是否处于另一个形状中并获得发生的时间范围,但我对如何去吧。一个不错的功能是它完全随时间运行并且忽略了离散“步骤”的想法,但它也让我觉得这是一种低效的方法。

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

4

2 回答 2

2

找到一个精确的碰撞时间本质上是一个非线性的求根问题。这意味着您最终将需要一种迭代方法来确定最终的碰撞时间——但设计碰撞求解器的巧妙之处在于避免在实际不需要时进行根求解......

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

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

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

于 2013-04-10T20:38:30.580 回答
0

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

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

  • 假设你没有任何角速度

在此处输入图像描述

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

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

请注意,这一切都是O(1)及时完成的​​,尽管计算非常复杂——一条射线和一条线段有 32 个交点。

  • 如果您真的希望您的矩形以某种速度旋转,我建议您考虑@comingstorm 所说的:这是一个寻找非线性方程根的问题,但是,即使在这种情况下,如果您的角速度有限在您的矩形中,您可以将任务拆分为一系列三元搜索子任务,尽管我认为这只是解决非线性问题的可能方法之一。
于 2013-04-10T20:53:21.683 回答