物理AABB物理碰撞检测

Posted liez

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物理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) {
    

}


以上是关于物理AABB物理碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

篮球物理碰撞检测和反弹物理

如何在没有物理的情况下检测碰撞

游戏开发中的物理介绍

2022-04-20 Unity入门7——物理系统之碰撞检测

使两个物理对象不碰撞,但在 Unity 中检测碰撞

Sprite Kit 碰撞检测和物理