如何通过坐标判定识别AABB轴对齐矩形碰撞情况?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1134个文字,预计阅读时间需要5分钟。
两个AABB不相交,当且仅当它们在x轴或y轴上完全分离。这是最直接、最高效的确定方法,无需开方、三角函数或向量运算。
核心逻辑就是:只要有一个方向(x或y)上两矩形的投影不重叠,就一定没碰撞;只有x和y两个方向都重叠,才算发生碰撞。
常见错误是写成 if (overlapX && overlapY) return true; 却把重叠条件写反,比如用 min1 > max2 判分离却漏掉等于号——AABB边界接触也算碰撞,所以必须用严格不等号判断“分离”。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 统一用左下角
min和右上角max表示AABB(即min.x , <code>min.y ),避免中心+半宽高带来的符号混淆 - 分离条件写为:
rect1.max.x = rect2.max.x || rect1.max.y = rect2.max.y - 反过来,碰撞条件就是上述表达式的逻辑非,可直接返回
!separated,更易读且不易出错
注意坐标系与Y轴方向的影响
很多图形API(如OpenGL、SDL)的Y轴向上,而窗口坐标系(Win32、DirectX默认)Y轴向下。如果混用不同来源的AABB数据,min.y 和 max.y 可能被颠倒,导致碰撞永远不触发或永远触发。
本文共计1134个文字,预计阅读时间需要5分钟。
两个AABB不相交,当且仅当它们在x轴或y轴上完全分离。这是最直接、最高效的确定方法,无需开方、三角函数或向量运算。
核心逻辑就是:只要有一个方向(x或y)上两矩形的投影不重叠,就一定没碰撞;只有x和y两个方向都重叠,才算发生碰撞。
常见错误是写成 if (overlapX && overlapY) return true; 却把重叠条件写反,比如用 min1 > max2 判分离却漏掉等于号——AABB边界接触也算碰撞,所以必须用严格不等号判断“分离”。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 统一用左下角
min和右上角max表示AABB(即min.x , <code>min.y ),避免中心+半宽高带来的符号混淆 - 分离条件写为:
rect1.max.x = rect2.max.x || rect1.max.y = rect2.max.y - 反过来,碰撞条件就是上述表达式的逻辑非,可直接返回
!separated,更易读且不易出错
注意坐标系与Y轴方向的影响
很多图形API(如OpenGL、SDL)的Y轴向上,而窗口坐标系(Win32、DirectX默认)Y轴向下。如果混用不同来源的AABB数据,min.y 和 max.y 可能被颠倒,导致碰撞永远不触发或永远触发。

