【物理】AABB物理碰撞检测

什么是AABB?

AABB,指轴对齐包围盒(Axis-aligned bounding boxes)。在3D空间中,AABB是一个长方体,在2D空间中是一个长方形。特征是面法线皆平行于坐标轴,即当物体旋转时,AABB不会随物体旋转,也因此特性,AABB可以最快判断两物体是否重叠。

AABB表达

《实时碰撞检测算法技术》一书中提到3种AABB的表达方式,这里仅举其中最高效,要求存储空间最少的一种——即存储包围盒的中心位置和包围盒的半径(即包围盒边缘到包围盒中心距离的长度):

struct AABB {
    Vector3 pos;
    Vector3 r;
}

AABB间的碰撞检测

AABB是否相交可作图如下:

其中r为半径,d为两包围盒中心的距离。

int AABBIntersection(AABB A, AABB B) {
    for(int i=0, i<3, i++){
        if(abs(A.pos-B.pos)>A.r+B.r)   return 0;
    }
    return 1;
}

AABB和ray之间的碰撞检测

在游戏中,经常会出现需要检测从某一点发出的射线是否与物体相交。
具体逻辑与AABB间的的碰撞检测相似,只是将其中一个AABB换成了射线。射线的结构如下:

struct Ray {
    Vector3 pos;
    Vector3 direction;
}

检测射线与AABB碰撞方程:

int RayAABBIntersection(Ray R, AABB A) {
    

}

posted @ 2019-12-01 03:54  Liez  阅读(2253)  评论(0编辑  收藏  举报