aabb碰撞判定只需检查x、y(2d)或x、y、z(3d)轴投影是否同时重叠;任一轴无重叠即分离,边界接触视为相交,核心逻辑仅需两行if语句。

用分离轴定理快速判断AABB碰撞
两个AABB(Axis-Aligned Bounding Box)是否相交,本质是看它们在x轴和y轴(2D)或x/y/z轴(3D)上投影是否同时重叠。只要任一轴上不重叠,就一定没碰撞——这是分离轴定理最直接的应用,不用算交点、不涉及浮点除法,性能极高。
AABB结构定义与坐标约定要统一
常见错误是x_min/x_max和center+half_size混用,或y轴朝向不一致(比如屏幕坐标y向下)。务必确认你的AABB用的是min/max对,且所有矩形遵循同一坐标系。例如:
struct AABB {
float x_min, y_min;
float x_max, y_max;
};
若用中心点+半宽高表示,先转成min/max再比较更安全,避免符号错乱。
核心判定逻辑:两行if就够了
2D下只需检查x方向和y方向是否都重叠。重叠的充要条件是:a.x_max >= b.x_min && a.x_min (x轴),同理y轴。注意不是<code>>而是>=——边界接触也算碰撞(除非业务明确要求严格内含)。
典型实现:
bool intersect(const AABB& a, const AABB& b) {
if (a.x_max
- 用
做分离判断比<code>>更符合直觉:只要a完全在b左边(a.x_max ),就分离 - 两个方向必须都“不分离”才返回
true,短路求值天然高效 - 若需3D,加一行z轴判断即可,逻辑完全一致
浮点精度与边界情况处理
当坐标含浮点数时,a.x_max == b.x_min可能因精度误差判定失败。如果业务允许“贴边即碰撞”,建议用带epsilon的比较:
const float EPS = 1e-6f; if (a.x_max + EPS <p>但多数游戏/物理引擎直接用<code>和<code>>=</code>,因为AABB本身是粗略包围体,微小误差不影响整体逻辑。真正要注意的是:别在同一个项目里一部分用<code>min/max</code>、另一部分用<code>center/extent</code>混算,坐标系统一比精度补偿重要得多。</code></p>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











