如何使用SAT解决复合形状的碰撞?


16

SAT是确定任意凸多边形之间的碰撞的一种不错的方法。您甚至可以获得解决冲突所需的向量。

为了解决复杂(非凸)形状之间的碰撞,我正在考虑某种由多个凸多边形组成的复合形状。如果在宽相中发生碰撞(例如,圆与圆或AABB与AABB),则可以通过检查复合形状中的每个多边形与其他复合形状中的每个多边形来解决冲突。

我想知道实际上分离对象的最佳方法是什么?幼稚的方法是仅取最大幅度的向量并将其用于分离。在下图中,这将是V 2

SAT示例1

但是,如果分离向量指向不同的方向,则无法立即解决碰撞,可能需要多次迭代。因此,在下一张图片中,我们将使用V 1进行分离,并在另一个迭代中使用V 2(或接近V 2的形状,因为形状将移动V 1的量)。

SAT示例2

这种方法将无法分离指向彼此相反方向的向量,或者在如下图所示的情况下:

SAT范例3

在这里,我们将在左侧的状态和右侧的状态之间无休止地进行迭代。

因此,在这里提出一个实际的问题:解决这个问题的合理方法是什么?我想将复合多边形用于复杂形状是一个合理的想法,但我真的很想知道在这种情况下应如何解决碰撞?如第三张图片所示,如何检测死角?


您能否弄清楚该向量的用途?
威尔

@Will应该使用矢量来解决碰撞,以便形状不再重叠。因此,我可以将黄色对象移动到生成的矢量上,而这两个对象将不再碰撞。
bummzack 2011年

Answers:


7

我认为您可能正在按照此处的方式通过应用SAT尝试将方形键插入圆孔中。显然,它不是为凹凹碰撞而设计的,尽管我赞扬您为此目的做出的努力,但仍有一些考虑因素使它不太可能起作用。

现实主义

角冲动及其连锁效应是这里的游戏名称。

接触点的顺序对于现实的碰撞解决很重要。在现实世界中,这些观点中的一个总是总是要先提出来。而且只有在模拟联系顺序和由其表示的每个“子碰撞”的结果时,您才能期望在仿真中获得真实的结果。首先,这就是为什么将凹面分解为凸面的原因之一-它可以分段检测哪个部分首先被撞击。当然,这也可以根据我在“较少现实主义”标题下的评论进行模仿。

凸形夹具结合在一起可以为对象提供轮廓和质心(当然,在更复杂的模拟中,每个夹具也会对密度产生不同的影响)。我之所以这样说,是因为在实际解决碰撞时,不仅要计算线性,还要计算接触点每次“子碰撞”之后的角冲量。它不像您在SAT中应用的基本“推开”那样简单。

然后,这完全改变了问题的性质,因为如您所见,获取并尝试使用 2个或更多的联系点毫无意义,因为实际上这只是第一个重要的联系点。一旦解决了线性和角度脉冲方面的第一个问题,您将需要重新计算以进一步碰撞,因为每个对象的方向都将发生变化。除此之外,在同一步骤中可能需要不需要在该步骤中检测每个单独的接触-取决于对象的第一个接触点接触时接触之间的时间,然后施加第二个线性和角度脉冲接触点触摸等等。

不太现实

当然,假设您根本不希望解决角冲动,那么使用Graham's Scan之类的方法将这些多边形包裹成凸面时,用SAT可以做的最好的事情基本上就是您要做的事情:向量。换句话说,正如您所展示的,试图串联解析三个向量毫无意义。这是最重要的一堆。

编辑以回答您的问题

如果要使用简单方法,需要执行以下操作:

  • 确定正确的位移方向。这是最容易做到的,方法是将每个凸包脱壳并确定分离轴的法线。

  • 现在您需要确定位移大小。为什么我们不能仅使用SAT给出的幅度?因为如果您考虑一下,凸包的互穿深度可能会比匹配的凹包的互穿深度大-想想两个E彼此之间有齿的情况!如上所述,找到给定步骤的所有接触点,但应使其轴法线平行,因为这是正确的位移方向。现在确定这些平行重叠向量中的哪一个最长。以此取代,丢弃其余部分,然后进行下一步物理步骤。


我想我明白你的意思。因此,在“现实主义程度较低”的情况下,我不仅会评估SAT为各个多边形给出的(最短)矢量,而且还必须考虑其他(更大)重叠,并且在最坏的情况下使用凸包吗?
bummzack 2011年

参见(最新)编辑。
工程师
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.