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

标签 algorithm 2d collision-detection physics simulation

我正在开发一个纯连续物理引擎,我需要选择用于宽相和窄相碰撞检测的算法。 “纯连续”意味着我从不进行相交测试,而是想找到方法在每次碰撞发生之前捕获它,并将每个碰撞放入由 TOI 排序的“计划碰撞”堆栈中。

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

我也不知道今天的离散碰撞剔除方法(例如四叉树)可能存在哪些连续类比。 我该如何着手防止像离散引擎那样进行不适当和毫无意义的广泛测试?

窄相
我已经设法使窄 SAT 适应连续检查而不是离散检查,但我确信在你们可能遇到的论文或网站中还有其他更好的算法。
您建议我使用哪些快速或准确的算法,每种算法的优缺点是什么?

最后说明:
我说技术而不是算法,因为我还没有决定如何存储不同的多边形,这些多边形可能是凹的、凸的、圆的,甚至有孔。我计划根据算法的要求对此做出决定(例如,如果我选择将多边形分解为三角形或凸形的算法,我将简单地以这种形式存储多边形数据)。

最佳答案

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

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

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

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

关于algorithm - 连续物理引擎的碰撞检测技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281964/

相关文章:

Java 继承/OOP - 仅使用父级句柄调用子类型特定方法

JavaFX Shape.intersect() 性能问题

algorithm - 信息素规则在蚁群系统中是如何应用的?

c# - 在 UI 中对行进行分组并在 C# 中插入两个表

c# - 检查碰撞 2D 游戏,图像/控制?

3d - 将3D位置转换为2d屏幕位置[r69!]

c++ - 游戏结束条件简单的贪吃蛇 C++ 游戏

算法:从字符串创建颜色

c++ - 连续位的长度 1 流后跟 0

matlab - 在简单的 x-y 图中连接最终点和初始点(绘制闭合曲线/多边形)