aabb是坐标轴对齐的矩形,用于高效碰撞检测;因其仅需比较x、y轴投影是否重叠,无三角运算和矩阵变换,适合高频调用,但需注意坐标系、浮点精度及数据一致性。

什么是AABB,为什么用它做碰撞检测
AABB(Axis-Aligned Bounding Box)就是坐标轴对齐的矩形,四边分别平行于x轴和y轴。它不旋转,只靠左、右、上、下四个值(或中心+宽高)定义,所以判断两个AABB是否相交,只需检查它们在x轴和y轴上的投影是否同时重叠。
这种检测快、无浮点三角函数、无矩阵变换,适合游戏主循环中高频调用。但注意:它只是粗略包围盒,实际物体形状复杂时得配合更精细的检测(比如SAT或多边形检测)。
核心逻辑:分离轴定理的二维简化版
两个AABB不相交 ⇔ 至少有一个轴(x或y)上它们的投影完全分离。反过来,相交 ⇔ x方向重叠 且 y方向重叠。
假设矩形用 left、right、top、bottom 表示(y轴向下为正,常见于屏幕坐标系),则:
- x方向重叠条件:
rect1.right > rect2.left && rect1.left - y方向重叠条件:
rect1.bottom > rect2.top && rect1.top
两者同时为真,才返回 true。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
常见错误:
- 混淆坐标系:y轴向上为正时,
top应小于bottom,此时y方向判断要改成rect1.top rect2.top(本质一样,但顺序易错) - 用
==判断边界接触:严格来说,只要不分离就算碰撞,所以用>和即可,无需额外处理“刚好贴边”——这本身就是碰撞
C++实现示例与关键参数设计
推荐用结构体封装,避免裸露4个float变量导致传参混乱:
struct AABB {
float left, right, top, bottom;
<pre class="brush:php;toolbar:false;">bool intersects(const AABB& other) const {
return right > other.left && left other.top && top <p>};</p>使用场景建议:
- 若已有中心点
center和半宽高halfExtents,可转成:left = center.x - halfExtents.x,其余类推 - 若用OpenCV的
cv::Rect,注意其构造是(x, y, width, height),对应left=x,top=y,right=x+width,bottom=y+height;直接套用上述逻辑即可 - 不要为了“节省一次比较”把逻辑写成单行三目嵌套——可读性和调试成本远高于微小性能差异
容易被忽略的边界与性能细节
- 浮点精度问题:如果矩形由计算动态生成(如缩放、动画插值),
left >= right 或 top >= bottom 可能出现。应在 intersects 前加断言或预处理,否则会导致逻辑反转。
- 内存布局:把
left/right/top/bottom 连续存放(而非分两个vec2),有利于CPU缓存命中,尤其批量检测时。
- 无符号整数陷阱:若用
uint32_t 存坐标(比如像素坐标),left 在 <code>other.right == 0 时可能因溢出误判——一律用有符号类型更安全。
left >= right 或 top >= bottom 可能出现。应在 intersects 前加断言或预处理,否则会导致逻辑反转。left/right/top/bottom 连续存放(而非分两个vec2),有利于CPU缓存命中,尤其批量检测时。uint32_t 存坐标(比如像素坐标),left 在 <code>other.right == 0 时可能因溢出误判——一律用有符号类型更安全。
真正难的不是写对这个函数,而是确保所有矩形数据源都按同一约定填充字段,并在坐标系切换(比如OpenGL y向上 vs SDL y向下)时统一转换逻辑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










