扫描和修剪:时间连贯在哪里?

时间:2012-05-03 05:17:36

标签: collision-detection

我正在研究各种碰撞检测算法,其中之一是扫描和修剪。我想我对它是如何工作有很好的理解;您存储每个轴的已排序的端点列表,并且在每次更新期间,我必须对列表进行排序。下面是我发现的其中一个帮助我理解这个算法的网页的链接:

http://jitter-physics.com/wordpress/?tag=sweep-and-prune

但是,我不太清楚如何在代码中实现时间一致性。据我所知,它利用了物体在连续时间范围内移动很少的事实,但我不太明白它是如何实现的。

有人可以了解这种情况吗?

2 个答案:

答案 0 :(得分:3)

+1问题,但你的回答可能是错误的;在排序(扫描)阶段,在一个模拟步骤与下一个模拟步骤之间利用时间相干性。以下是维基百科Sweep and Prune的摘录:

  

扫描和修剪利用时间相干性,因为在两个模拟步骤之间固体可能不会显着移动。因此,在每个步骤中,可以使用相对较少的计算操作来更新边界体积开始和结束的排序列表。快速排序几乎排序的列表(例如插入排序)的排序算法特别适用于此目的。

假设我们 n 对象,在时间步1, t = 1 ,对于扫描阶段,我们已经对所有对象的start.x进行了排序和end.x并且基于结果,我们也执行了窄阶段以找到实际的碰撞对象。现在,对于 t = 2 ,除非您的模拟具有可传送的对象(消失并重新出现在其他地方),否则对象将从 t = 1 位置稍微移动,位于< em> t = 2 。在 t = 1 2 之间,如果X中的变化不大(时间一致性),那么我们为 t创建的排序列表= 1 通常会为到达 t = 2 的排序列表提供良好的开端,因为对于 t = 2 ,旧的列表非常接近完美分配状态。现在,通过使用类似insertion sort的某种类型,对于一般情况可能代价很高,但在这种几乎排序的情况下运行良好,可以快速找到 t = 2的完美排序列表

答案 1 :(得分:2)

我想我可能已经找到了自己问题的答案。时间一致性仅减少了窄相位碰撞检测的工作量。我正在检查以下链接中的代码。

http://www.koders.com/java/fidB3D3D9D154CE69A671A799D52E7C44C104DF9537.aspx?s=w.a

我认为这是时间一致性发挥作用的地方:当一个对象被认为是碰撞并且它进入窄相位碰撞时,端点数组将被排序。在需要再次对端点进行排序之前,不需要查找要考虑用于窄相位冲突的对象对,因为第76行的if语句永远不会为真。如果是这种情况,则代码遵循时间一致性原则:在小时间步骤中,对象配置将变化很小,以至于不能保证数组排序;什么都不会在数组中重新排列。因此,窄相位碰撞量将减少。