分离轴定理 解决 多边形碰撞 问题

这两天有个任务,写个MAYA插件,里面有个功能是检测UV set里面有没有重合的, 找了半天发现MAYA API没有提供这个接口, 所以只好把UV set里面多边形的坐标取出来自己算。 翻了几本书没找到算法,于是去问lead,告诉我这个,Separating Axis Theorem(SAT)算法。这里记一下。

(此算法只能解决凸多边形碰撞,在我写的应用里刚好可以通过triangulate解决这个问题。)

 

SAT是一种检测凸多边形相交的算法,他的内容是,如果能找到一条轴,使得两个无题在该轴上的投影互不重叠,那么着两个物体就是不相交的。

Photo

Photo

原理很容易理解,这个算法的关键在于,如何找到这条轴。 在2D的情况下,两个多边形每条边的法向量包含了这条轴的所有可能性。

Photo

所以我们只需要枚举两个多边形的每条边的法向量即可。

Photo

2D向量的法向量非常好求 向量(X,Y)的法向量为(Y,-X)或(-Y,X),这个算法不需要考虑方向,所以任选一种即可

然后分别计算这两个多边形的所有点在此向量上的投影,并求出最大最小区域,如果没有重合,那么直接确定这两个多边形不重合,如果有重叠,那么继续判断下一条边的法向量。

Photo

很棒的算法,高效,简洁,易于实现。

3D情况也可以解决,但我没有研究。

Matanet Software有一个很棒的互动式SAT教学

David Eberly有一篇偏重SAT理论的文章:

Intersection of Convex Objects: The Method of Separating Axes

posted on 2012-03-21 20:43  鱼雷  阅读(3234)  评论(0)    收藏  举报

导航