AABB 与胶囊(扫掠球体)之间的交点

Len*_*ite 5 geometry intersection computational-geometry

A我在 R3 空间中有一个由最小向量和 最大向量定义的轴对齐边界框,以及由具有端点和和半径的B线段定义的胶囊。我想检查这两个形状是否相交。abr

我知道如果胶囊的定义线段与 AABB 相交,这两个形状实际上会相交。然而,我该如何处理剩余的情况,其中线段不与 AABB 相交,但胶囊仍然与 AABB 相交。

Len*_*ite 0

Bullet 等流行的物理引擎使用 GJK 算法来计算凸形状之间的相交(简单形状除外)。由于这个交叉点似乎没有简单的解决方案,而且我需要为圆柱体、圆锥体、胶囊、盒子等形状实现更多的交叉点,所以我决定采用 GJK 方法。您必须实现一次,然后只需定义该形状的支持函数即可检查任意两个凸形状之间的交集。

这里描述了一些常见形状的支持函数。以下是胶囊支持功能的摘录:

struct Capsule : Collider {
    float r, y_base, y_cap;

    vec3 support(vec3 dir){
        dir = matRS_inverse*dir; //find support in model space

        vec3 result = normalise(dir)*r;
        result.y += (dir.y>0) ? y_cap : y_base;

        return matRS*result + pos; //convert support to world space
    }
};
Run Code Online (Sandbox Code Playgroud)