与多个物体碰撞时的碰撞解决


15

我有静态对象和可移动对象。使用分离轴定理检测碰撞。

例如,在这种情况下,我有两个静态对象(红色):

在此处输入图片说明

以及介于两者之间的可移动对象:

在此处输入图片说明

我的算法能够计算出其中两个对象之间的碰撞,并且还为碰撞生成了一个完美的分辨率矢量(意味着最小位移矢量)。

因此,例如,当我检查绿色矩形和右红色矩形之间的碰撞时,该算法会吐出一个向量,该向量告诉我如何移动绿色矩形才能解决该碰撞:

在此处输入图片说明

请注意,我只是在MSPaint中快速绘制了此图像,因此在该图片中,实际上可能是最小平移矢量将绿色矩形推到顶部,但是在这里我将假定将其推到左侧/权利实际上更短。

解决此问题的一般方法是仅解决每帧一个冲突的冲突,而不是一次解决所有冲突。但就我而言,这将导致触发器:

首先,求解器检测到两个冲突,但仅解决右矩形和绿色矩形之间的冲突:

在此处输入图片说明

然后,在下一帧中,它仅检测到左红色矩形和绿色矩形之间的一个碰撞,并解决该碰撞:

在此处输入图片说明

如您所见,这实际上并不能解决冲突(例如,通过将绿色矩形推到顶部),而只是在两个状态之间无限地触发器。

我该如何解决?


您在示例中使用矩形。您的碰撞算法仅解决一个轴上的碰撞吗?如果是这样,则说明您正在描述的行为正在发生。
chaosTechnician 2011年

不会,它可以在所有可能的轴上以任何形状解析它们(不仅仅是矩形,它们只是最容易用MS paint:P绘制),并且它总是会找到存在的最短向量,从而将两个对象推开。
TravisG 2011年

+1好问题。我从标题中删除了(2D)“标签”,这是您应避免的事情(请参见meta)。
bummzack 2011年

Answers:


7

根据您要实现的目标(高物理精度或近乎实时的模拟),您可以尝试使用投机联系。

详细信息如下:http : //www.wildbunny.co.uk/blog/2011/03/25/speculative-contacts-an-continuous-collision-engine-approach-part-1/

他在那篇文章中描述了实现它需要了解的知识,并且与其他方法(例如球体投射,然后按碰撞时间对碰撞分辨率进行排序)相比,它非常简单。

如果您需要/想要更多,可以购买他的源代码(IIRC)$ 7。

这是我在3D模式下实现的视频:http : //www.youtube.com/watch?v=JvT2H1RmOas

注意仅一次迭代,仿真的稳定性如何。您可以轻松地每帧使用多个迭代来将多个冲突解析为稳定状态,这将更加准确。


2

您可以首先计算解决每个碰撞所需的所有向量,然后从中计算出结果。

就像您的示例一样,唯一可以使您字节化的情况是这些向量相互抵消。在这种情况下,碰撞无法解决。


在碰撞中添加一个大小约为ε * 10 的小的随机向量?浮点算术应该做其余的事情。
Martin Sojka

2
是的,我想这可以工作。但这也会造成抖动。
Mihai Maruseac 2011年

1
我希望我仍然可以得到答复:计算结果可以解决“无限循环”问题,但可以重新引入“裂缝”问题,即在由相同尺寸的瓷砖砌成的墙壁上滑动时移动可使身体卡在瓷砖的“裂缝”之间。有什么办法可以解决这两个问题?
Vittorio Romeo

同意...解决这样的不可能的刚体碰撞没有最佳的“正确答案”。要么抖动,要么在一个或多个对象中允许一些“混浊”。
david van brink 2015年

0

如果仔细查看,对象的状态是(或应该)无法实现的。

假设最左边的红色形状为形状R1,最右边的红色形状为形状R2。让绿色形状为G。

即给定所有三个对象的大小和几何形状,并且考虑到所有对象都不可穿透:

 (1) G could not have been just directly to the left of R2, since R1 has been there 
     already. Consequently, the translation of G from left to right, penetrating R2
     could not have occurred.
 (2) G could not have been just directly to the right of R1 since R2 has been there 
     already. Consquence of which is the same as that from (1).
 (3) Had G come from the top, the movement will be blocked by both R1 and R2, given
     that their geometry and Y coordinate is the same.

现在,归结为它,如果您的算法逐个查询您的对象,那么这是一个并发问题,即,在某种意义上,该算法应该同时检查所有对象,但是该算法限制了您执行此操作对象并一次处理一个对象...

如果在对R2进行检查之后对G进行了对R1的检查,则G似乎合法地位于R1的右侧(如果G表示以向量<-1,-1>的方向以任意幅度(或距离)接近R1 ),因为R1和G之间的检查允许这样做,而忘记了之前进行过的R2和G之间的检查。

您可能采取的解决方案是将所有最小位移矢量收集到数组或所需的任何数据结构中,然后选择对所有对象都合法的一个。

请注意,在给定的帧中,对象(例如G)只能具有一个方向。(哦,老兄,听起来像是男孩乐队...)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.