AABB碰撞判定需x、y轴同时重叠;推荐用min/max结构体(minX、maxX、minY、maxY),判断式为this.minX = other.minX && this.minY = other.minY。

只要两个AABB在x轴和y轴上同时重叠,就判定为碰撞;漏判一维、不等号方向反了、坐标系混用,是90%以上实际项目里出问题的根源。
用min/max结构写intersects函数最稳
推荐结构体定义为minX、maxX、minY、maxY四字段,不依赖中心点或宽高。这样逻辑直白,扩展到3D只需加minZ/maxZ,且浮点误差影响小。
- 判断式必须是
minX = other.minX(x轴)和同理y轴的&&组合 - 别写成
minX ——这会把边对边接触判为不相交,多数UI/物理场景需要包含边界 - 如果业务明确要求“贴边不算碰撞”,才考虑用
和<code>>,但需四边统一,不能x用、y用<code> - 函数体内避免调用
std::min/std::max:它们引入函数调用开销,而直接比较更高效,现代编译器也能更好优化分支
传入参数前务必确认坐标系一致
常见崩溃不是算法错,而是rect1用left/top/w/h表示,rect2却按left/top/right/bottom传入,导致maxX被算成left + w还是直接等于right完全不一致。
- 检查所有矩形构造路径:是否都走同一套初始化逻辑?比如
Rect(x, y, w, h)内部是否统一设maxX = x + w,且y方向始终按“top向下为正”(如SDL)或“bottom向上为正”(如OpenGL纹理坐标) - 如果混用
top/bottom和minY/maxY命名,变量名和实际数值含义一旦错位,minY > maxY就会让整个判断失效 - 调试时打印两矩形的
minX、maxX、minY、maxY值,肉眼确认是否符合预期范围(例如minX 必须恒真)
别在循环里临时拼装AABB对象
每帧从四个float重建AABB实例,看似干净,实则触发冗余构造+可能的内存对齐抖动,尤其在嵌入式或高频物理更新场景下容易成为瓶颈。
立即学习“C++免费学习笔记(深入)”;
- 把
AABB作为对象成员缓存,位置更新时只改minX等字段,而非每次new一个新结构 - 若必须动态生成,用
struct AABB { float data[4]; }扁平布局,比带命名字段的版本更容易被向量化 - 注意宽高为负的非法输入:
maxX 时,当前算法仍会返回<code>true(因不等式恒成立),应在构造时做断言或归一化
旋转矩形不能直接套用AABB检测
AABB全称是Axis-Aligned,关键词就是“轴对齐”——一旦矩形旋转,它的AABB只能是重新计算出的一个更大的、包住旋转后形状的轴对齐框,此时检测结果只是粗筛,必然存在误报。
- 若物体仅轻微旋转(±3°以内),用AABB包围盒+后续精确检测(如SAT)可接受;但别指望它替代OBB
- Unity中
BoxCollider2D开启usedByComposite后底层仍走AABB,真正要支持任意角度,得换PolygonCollider2D或手写OBB+SAT - 不要试图用“旋转后的中心+半宽高”结构去适配AABB函数——坐标变换没做完就进比较,结果不可预测
边界处理和坐标系一致性,比算法本身更常引发线上bug;宁可多打两行日志确认minX和maxX数值,也不要靠“应该没问题”跳过验证。


















