两个AABB重叠当且仅当在x轴和y轴(2D)或x/y/z轴(3D)上投影均重叠;任一轴无交集即分离,核心逻辑仅需比较min/max边界,避免中心+半宽等易错方式,性能高且鲁棒。

两个轴对齐包围盒(AABB)是否重叠,只取决于它们在每个坐标轴上的投影是否同时重叠;只要有一个轴不重叠,整体就不相交。
为什么用“分离轴”思想而不是求交点
直接计算矩形交点或面积交集既慢又易出错,而 AABB 的轴对齐特性意味着只需检查 x 和 y 两个方向——这是最轻量、最可靠的方式。核心逻辑是:若两矩形在 x 轴上不重叠,或在 y 轴上不重叠,则它们完全分离。
- 常见错误是写成
if (a.min.x b.min.x)却漏掉 y 轴判断,导致误判为相交 - 更隐蔽的坑是坐标系理解偏差:比如 y 向下为正(如屏幕坐标)时,
min.y实际对应顶部,max.y对应底部,但比较逻辑不变 - 浮点数比较时若涉及动态生成的 AABB(如带旋转后近似为 AABB),需考虑
epsilon容差,但纯整数像素坐标可直接用==或
C++ 中标准 AABB 重叠函数写法
假设每个 AABB 用两个 vec2 表示:min 和 max(左下和右上顶点),则判断函数极简:
bool intersects(const AABB& a, const AABB& b) {
return a.min.x <= b.max.x &&
a.max.x >= b.min.x &&
a.min.y <= b.max.y &&
a.max.y >= b.min.y;
}
- 注意用
和 <code>>=:边界接触(如一个矩形右边缘紧贴另一个左边缘)算作重叠,这符合多数物理/渲染需求 - 若业务要求“严格内部重叠”,则全部换成
和 <code>> - 该函数无分支预测失败风险,现代 CPU 下几乎零开销;比调用
std::max/std::min构造交集再判空快得多
在游戏循环或空间分区中怎么安全用
单次调用没问题,但高频调用(如每帧检测上千个物体)时,容易因缓存不友好或重复计算拖慢性能。
立即学习“C++免费学习笔记(深入)”;
- 避免每次临时构造 AABB:把
min/max存为结构体成员,而非每次从中心+半宽高实时计算 - 做粗筛时,可先用对象 ID 或指针地址哈希做桶分组,跳过明显远距离的配对
- 若结合四叉树或网格分区,确保插入/移动物体时及时更新其所在格子,否则会漏检——这是比算法本身更常出问题的地方
- 多线程遍历时,禁止让多个线程同时修改同一 AABB 的
min/max;可改为双缓冲:一帧读旧数据做检测,下一帧再原子更新新位置
真正难的不是写对这个函数,而是保证所有参与碰撞的 AABB 始终处于一致、及时更新的状态;坐标变换、缩放、镜像翻转都可能悄悄让 min 和 max 意义颠倒,这种 bug 往往只在特定缩放比例下暴露。


















