连续物理引擎碰撞检测技术

时间:2011-11-26 22:03:34

标签: algorithm 2d collision-detection physics simulation

我正在研究一个纯粹连续的物理引擎,我需要选择算法来进行宽窄相位碰撞检测。 “纯粹连续”意味着我从不进行交叉测试,而是希望找到在碰撞发生之前捕获每个碰撞的方法,并将每个碰撞放入由TOI订购的“计划碰撞”堆栈中。

广泛阶段 我能想到的唯一连续的宽相法是将每个物体包围在一个圆圈中并测试每个圆圈是否会与另一个圆圈重叠。然而,这似乎非常低效,并且没有任何剔除。

我不知道今天的离散碰撞剔除方法(例如四叉树)可能存在哪些连续模拟。 我如何防止诸如离散引擎之类的不适当和毫无意义的广泛测试呢?

狭窄阶段
我已经成功地将狭窄的SAT调整为连续检查而不是离散,但我确信在你们可能遇到的论文或网站中还有其他更好的算法。
您建议我使用哪种快速或准确的算法以及每种算法的优点/不同之处?

最后注意事项:
我说技术而不是算法因为我还没有决定如何存储不同的多边形,这些多边形可能是凹的,凸的,圆的,甚至有孔。我计划根据算法的要求做出决定(例如,如果我选择将多边形分解成三角形或凸形的算法,我只会将多边形数据存储在这种形式中)。

2 个答案:

答案 0 :(得分:5)

你说圈子,所以我假设你有2D物体。您可以通过添加时间维度将2D对象(或其边界形状)扩展为3D,然后您可以使用常规技术检查一组3D对象之间的静态碰撞。

例如,如果(x,y)中的圆圈以恒定速度向右移动(+ x)​​,那么,当您使用时间维度扩展它时,在(x,y)中有一个对角圆柱体,t)。通过在这些3D对象之间进行交叉(只需将时间视为z),您可以看到两个对象是否会相交。如果P点是一个交点,那么只需看P.t。

即可知道该交点的时间

这也推广到了更高的维度,尽管数学变得很难(无论如何对我来说)。

如果对象具有复杂路径,则碰撞检测可能会很棘手。例如,如果您的圆受重力影响,则挤出的时空对象是抛物线球形扫描而不是简单的圆柱体。您可以稍微填充边界对象并在较短的时间段内使用线性近似并迭代,但我不确定这是否违反了连续的意思。

答案 1 :(得分:1)

我假设你在模拟中想要重力或其他保守力量之类的东西。如果是这种情况,你的物体的轨迹很可能不会是线条,在这种情况下,就像阿德里安指出的那样,数学会更难。我想不出一种方法可以避免检查所有可能的碰撞曲线组合,但是你可以很容易地计算两条曲线之间的最小距离,只要它们都是线性系统的解决方案(或者,一般来说,如果你有曲线的封闭形式解决方案)。如果您知道x1(t) = f(t)x2(t) = g(t)那么您会想要什么 do是计算距离||x1(t) - x2(t)||并将其导数设置为零。这应该是一个取决于f(t)g(t)及其衍生物的表达式,并会给你一个时间tmin(或者可能是几个可能的那个),然后你可以在那里评估距离并检查查看它是大于还是小于r1+r2 ---两个边界圆的半径之和。如果它更小,那么你当时就有潜在的碰撞,所以你运行窄相算法。

相关问题