用多个多边形分隔轴定理?


9

我正在尝试在C#中实现分离轴定理。我有一个可以计算两个多边形之间的最小平移矢量的函数。但是,我似乎无法创建一个函数来计算一个多边形与多个其他多边形之间的最小平移矢量。老实说,我已经为此工作了几个月,距离解决方案还很近,也无法在线找到解决方案。总是有一些边缘情况无法返回正确的结果,从而导致游戏中出现高优先级的错误。

以下是无法正常工作的常见边缘情况:

边缘情况

是否有针对此问题的知名解决方案?我只能发现有人说“只对每个多边形执行SAT”,但这很少产生最小的平移向量。

任何帮助将不胜感激。


我从未真正进行过测试的一个想法是,某些分离轴(会将您横向移入相邻多边形的分离轴)可能被标记为从不视为最小值。然后,某种重复测试将产生良好的结果(可能具有某种FIFO和/或迭代限制,以防止陷入循环)。
Andrew Russell

一个更难解决的版本是形状的边缘仅被另一部分覆盖。例如,在右上角的图像中,如果中间的正方形向右延伸,则是一个较大的矩形。这类似于我使用的某些代码的输出,该代码占用了成千上万个已占用/未占用的单元,并将其减少到了一百个较大的碰撞形状
Richard Tingle 2014年

Answers:


2

理想情况下,您不要使用多边形构建环境。您从边缘构建(可能是从一组多边形计算出的)。例如,在第一个示例中,有一个对角线边;在最后一个示例中,盒子位于单个水平边缘上。

您的编辑器或工具使用较小的单个形状来构建关卡的事实不应影响运行时间。

稍微简单一些的方法将简单地删除基本形状的“内部”边缘。对于最后一个示例,“ floor”框之间有两个边;在碰撞检测期间忽略这些。

通过阅读Box2D文档中的第4.5节(边缘和边缘链),可以找到一些更好的图片和一些实现想法。


2
使用边缘(尤其是边缘,使用边缘链会更好),它的主要缺点是,物理对象在关卡几何图形内部变得非常容易毛刺。
Andrew Russell

1
@AndrewRussell:使用常规的隧道修复程序可以避免这些问题。确保移动物体的体积/面积相当大,将每帧的最大速度保持在足够低的水平,以使它们移动的距离不能超过其最短尺寸的一半(如果需要移动得更快,可以多次移动),避免真正尖锐的裂缝,并在等你的水平几何,迭代分辨率多次,直到你在一个“安全”的最终位置等收敛
肖恩Middleditch
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.