前言
最近在做一个2d打砖块游戏,一番百度谷歌后找到了这个算法,比较好的符和预期在此记录一下。
分离轴定理(SAT | Separating Axis Theorem)通常用于2D凸多边形之间和凸多边形与圆形做碰撞检测的算法。
基本原理
简单来说,有两个凸多边形在平面中如果存在一条直线将他俩分隔开,那么这两个凸多边形必不相交,如图:
, 向量的左法向量left = (-y,x),向量的右法向量right = (y,-x);
3.如何取到多边形各个点在分离轴上的投影?
如图,p就是向量a在向量b上的投影。
|p| = |a|cosθ;
根据向量点积的基本知识
a·b = |a||b|cosθ
所以 |p| = |a|cosθ = a·b / |b|,我们将b设为单位向量,已知单位向量的模|b|等于1,所以 |p| = |a|cosθ = a·b,至此我只需要求出a和b的点积便能得到a在b上投影的大小了。
4.如何判断求得的两个投影是否相交?
一图了然
完成以上步骤,我们就准备好了完成SAT算法的所有条件了,可以着手去实现代码了。
补充:圆形与多边形的碰撞检测需要补充一条圆心到多边形最近的点的向量作为分离轴。圆与圆之间的碰撞检测只需要判断两圆心的距离是否小于两圆半径之和。