【物理】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) {
}