碰撞检测一重奏——长方体碰撞检测

    简单的说长方体碰撞检测就是讲长方体投影成多边形,转化为多边形碰撞检测,多边形投影成线,转化为线的碰撞检测。核心思想就是投影降维,将三维检测转换成二维检测,二维转换成一维,一维的检测就是小学初中就接触的判断同一直线上两条线段是否重合了。怎么降维?我用的是分离轴理论。


分离轴定理(SAT)

    分离轴定理(简称SAT):若你能找到一条直线,使得两个多边形分离,那么这两个多边形之间就没有发生碰撞。

碰撞检测一重奏——长方体碰撞检测_第1张图片

    如上图的分离轴,为了检测两个长方形是否分开,我们只需将两个长方形投影到分离轴的垂线上,若两条投影线没有任何重叠,就说明两个长方形也没有任何重叠,即未碰撞。

    很显然,两个未碰撞的多边形可以有无数条分离轴,而我们只需找到一条分离轴,就能证明两者为碰撞。一般情况是检测多边形各边的平行线是否可作为分离轴,即将两个多边形投影到各边的垂线上,只要存在一条边的垂线,使两个多边形投影线不重叠,则两个多边形未发生碰撞。这样我们就建二维的碰撞检测转换为一维的检测了。

  同理,检测两个长方体是否碰撞,就是寻找两个长方体之间是否存在一个分离平面,使两个长方体投影到这个平面的投影面(多边形)不碰撞。


长方体碰撞检测算法步骤

(1)寻找长方体A、B之间是否至少存在一个分离平面

    ①长方体A投影到长方体B的三个相互垂直面a1、a2、a3时,长方体A的3个投影面分别与平面a1、a2、a3进行检测;

    ②长方体B投影到长方体A的三个相互垂直面b1、b2、b3时,长方体A的3个投影面分别与平面b1、b2、b3进行检测;

    因为长方体结构特殊,有3对平面是平行的,所以只需要各自分别投影3次,得到6对多边形,若存在一对多边形未发生碰撞,则两个长方体为碰撞。

现在1对长方体的碰撞检测就转换成6对多边形的碰撞检测;


(2)长方体有6个面,投影后得到的形状是无法预测的,为了方便检测,我用长方体6个面分别投影(易知,矩形的投影至少是;平行四边形),并分别进行碰撞检测。

  现在6次多边形碰撞检测变成6*6=36次平行四边形碰撞检测。同样只要一次未碰撞,两个长方体就未碰撞。


(3)平行四边形碰撞检测

    2个平行四边形共8条边,因为平行四边形有2组边是平行的,即去掉4条是重复的,做4次投影,检测4条边的平行线是否可作为平行四边形的分离轴,只要存在一条分离轴,2个长方体就未碰撞。

算法遇到的最坏的情况需要进行1*6*6*4=144次检测。

(代码就不附了,有兴趣的朋友自己写一下......)


友情提示:灵活使用向量的点积和叉积,可以很容易得到投影

你可能感兴趣的:(碰撞检测)