我正在尝试用 Java 编写一个使用分离轴定理进行碰撞检测的 2D 游戏。为了解决两个多边形之间的碰撞,我需要知道碰撞的最小平移向量,并且我需要知道它相对于多边形指向哪个方向(这样我就可以给一个多边形沿着那个方向的惩罚力和其他方向相反的惩罚力)。作为参考,我正在尝试在这里实现算法。
我想保证,如果我调用我的碰撞检测函数collide(Polygon polygon1, Polygon polygon2)
并且它检测到碰撞,返回的 MTV 将始终指向远离多边形1的多边形 2。为了做到这一点,我需要保证我生成的分离轴,即多边形边缘的法线,总是指向远离生成它们的多边形。(这样,我知道在将它用作 MTV 之前,要否定来自 polygon2 的任何轴)。
不幸的是,似乎我为多边形边缘生成的法线是指向多边形内部还是外部,取决于多边形的点是按顺时针还是逆时针顺序声明的。我正在使用此处描述的算法生成法线,并假设我选择(x, y) => (y, -x)
“垂直”方法,如果我以顺时针顺序遍历顶点,则生成的法线只会指向远离多边形。
鉴于我不能强制客户端以顺时针顺序声明多边形的点(我正在使用 java.awt.Polygon,它只为 x 和 y 坐标公开两个数组),是否有一种数学方法可以保证我生成的法线向量的方向是朝向多边形的外部吗?我不太擅长矢量数学,所以我可能缺少一个明显的解决方案。大多数关于 SAT 的 Internet 资源只是假设您始终可以按顺时针顺序遍历多边形的顶点。