AABB是各边平行于坐标轴的矩形或长方体包围盒,其碰撞检测快是因为仅需6次(3D)或4次(2D)浮点比较,无需旋转、叉乘或点积;任一轴无重叠即返回false。

什么是 AABB,为什么它比其他包围盒快 AABB(Axis-Aligned Bounding Box)就是各边平行于坐标轴的矩形(2D)或长方体(3D)包围盒。它的碰撞检测快,根本原因就一条:**不需要旋转、不涉及向量叉乘或点积,只做 6 次(3D)或 4 次(2D)浮点比较**。只要两个 AABB 在每个轴上投影都有重叠,它们就相交;任一轴无重叠,立即返回 false。
实际中别用 std::array 或六个独立成员手动管理上下界——容易写错顺序、难复用。推荐封装成结构体,显式暴露 min 和 max 成员(都是 glm::vec3 或自定义 Vec3),这样语义清晰,也方便后续扩展(比如加入 center()、extents() 等辅助函数)。
怎么写一个零开销的 AABB::intersects() 函数
核心逻辑是逐轴判断区间是否重叠:对每个轴 i,检查 a.min[i] 。注意不是“中心距小于半宽和”,那是球体思路;AABB 必须用区间重叠判据,否则会漏检(尤其当盒子尺寸差异大时)。
实操建议:
- 用
constexpr 实现,让编译器内联并常量折叠(如果输入是字面量)
- 避免临时对象:直接传
const AABB&,别传值;成员变量用 float 而非 double,除非你真需要双精度
- 3D 下优先按 x→y→z 顺序判断——现代 CPU 分支预测对首轴失败情况优化更好,多数场景下物体在 x 轴分离概率更高
- 若用
glm,可借助 glm::all() + glm::lessThanEqual(),但要注意它生成的是向量化指令,调试时可能难断点;手写展开更可控
min > max
实操建议:
- 用
constexpr实现,让编译器内联并常量折叠(如果输入是字面量) - 避免临时对象:直接传
const AABB&,别传值;成员变量用float而非double,除非你真需要双精度 - 3D 下优先按 x→y→z 顺序判断——现代 CPU 分支预测对首轴失败情况优化更好,多数场景下物体在 x 轴分离概率更高
- 若用
glm,可借助glm::all()+glm::lessThanEqual(),但要注意它生成的是向量化指令,调试时可能难断点;手写展开更可控
min > max
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











