粗浅理解,不一定完全正确,但是最直观,欢迎指正。
参考链接:
https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169
要判断平面上两个凸多边形是否相交,非常简单,只要找到一个投影方向,如果两个多边形在这个方向上的投影不重叠了,那么这两个多边形就坑定不相交。相反,如果找不到这样一个投影方向,那么就是相交的。
上面这个图,投影方向是P,box1的投影就是box1.min和box1.max,box2的同理。那么只需要判断x坐标上,box2的投影的两个点在不在box1投影的两个点之间。投影和判断的代码很容易实现,向量相乘以及判断大小而已。
那么问题来了,要证明两个多边形不相交,一定要找到一个投影方向让两个多边形的投影不重叠。然而不可能所有的方向都去试,因为是方向是连续的,试不完。很头疼。先说结论,只需要尝试两个多边形的每个边的法向量即可。
因为如果如果两个多边形不相交,那么沿着某一个多边形的某一条边的方向,能够讲两个多边形分隔开,这个也就是这个separating axis。为什么呢,因为对于凸多边形,内角小于180,所有的点都位于边的一侧。两个距离最近的点(就是第一张图中间圈起来的那两个点),所属的边当中,总有一个能够把两个多边形分开的边。
最后只要把每个边都试一遍就ok了。