分离轴定理 解决 多边形碰撞 问题
这两天有个任务,写个MAYA插件,里面有个功能是检测UV set里面有没有重合的, 找了半天发现MAYA API没有提供这个接口, 所以只好把UV set里面多边形的坐标取出来自己算。 翻了几本书没找到算法,于是去问lead,告诉我这个,Separating Axis Theorem(SAT)算法。这里记一下。
(此算法只能解决凸多边形碰撞,在我写的应用里刚好可以通过triangulate解决这个问题。)
SAT是一种检测凸多边形相交的算法,他的内容是,如果能找到一条轴,使得两个无题在该轴上的投影互不重叠,那么着两个物体就是不相交的。
原理很容易理解,这个算法的关键在于,如何找到这条轴。 在2D的情况下,两个多边形每条边的法向量包含了这条轴的所有可能性。
所以我们只需要枚举两个多边形的每条边的法向量即可。
2D向量的法向量非常好求 向量(X,Y)的法向量为(Y,-X)或(-Y,X),这个算法不需要考虑方向,所以任选一种即可
然后分别计算这两个多边形的所有点在此向量上的投影,并求出最大最小区域,如果没有重合,那么直接确定这两个多边形不重合,如果有重叠,那么继续判断下一条边的法向量。
很棒的算法,高效,简洁,易于实现。
3D情况也可以解决,但我没有研究。
Matanet Software有一个很棒的互动式SAT教学
David Eberly有一篇偏重SAT理论的文章:
Intersection of Convex Objects: The Method of Separating Axes
浙公网安备 33010602011771号