两个轴对齐矩形重叠当且仅当x方向和y方向投影均重叠,即(ax < bx + w_b) && (bx < ax + w_a) && (ay < by + h_b) && (by < ay + h_a)。

在游戏开发中快速判断两个轴对齐矩形是否重叠,是实现碰撞检测的基础需求,直接关系到角色移动、攻击判定和物理响应的实时性与准确性。
核心逻辑:分离轴定理的二维简化应用
两个AABB矩形不重叠,当且仅当存在一条坐标轴(x或y),使得它们在该轴上的投影完全分离。因此,重叠的充要条件是:x方向投影重叠 且 y方向投影重叠。
设矩形A左上角为 (ax, ay),宽w_a、高h_a;矩形B左上角为 (bx, by),宽w_b、高h_b(注意:此处采用常见屏幕坐标系,y向下增长)。
则A的x区间为 [ax, ax + w_a],y区间为 [ay, ay + h_a];B的x区间为 [bx, bx + w_b],y区间为 [by, by + h_b]。
立即学习“C++免费学习笔记(深入)”;
两矩形重叠 ⇔ (ax
代码实现:C++ 函数封装
方法一:基础四条件判断(推荐用于调试或教学)
定义结构体 Rect { float x, y, w, h; };编写函数 bool IsOverlapping(const Rect& a, const Rect& b) { return (a.x
方法二:使用 std::max / std::min 简化逻辑(更易读,适合团队协作)
先计算x方向重叠长度:float overlapX = std::min(a.x + a.w, b.x + b.w) - std::max(a.x, b.x);同理求 overlapY;最终 return (overlapX > 0.0f) && (overlapY > 0.0f);
注意:浮点比较需谨慎,若涉及极小尺寸或高精度场景,应改用 epsilon 判断,例如 overlapX > 1e-5f。
游戏引擎中的典型集成路径
第一步:在实体组件系统中为可碰撞对象添加 AABB 组件(如 CollisionBoxComponent),存储本地包围盒及世界变换矩阵。
第二步:每帧更新时,将本地AABB通过世界矩阵变换为世界空间AABB(需处理旋转导致的非轴对齐问题——但本算法仅适用于轴对齐情形,故必须确保变换后仍为AABB,即对象无旋转或已做AABB保守膨胀)。
第三步:进入窄相位碰撞检测前,先用上述函数批量筛选出潜在碰撞对(Broad Phase常用空间哈希或四叉树加速,此处略)。
第四步:对筛选出的每一对,调用 IsOverlapping 函数;返回 true 即触发 OnCollisionEnter 事件,并传入双方引用。
这一步操作起来很简单,直接把函数塞进 FixedUpdate 或自定义物理更新循环里就行。



















