AABB相交的核心逻辑是:在x、y、z三轴上投影必须全部重叠才相交;任一轴分离即不相交,本质是分离轴定理的直接应用,通过min/max边界比较高效判定,面贴面(闭区间)视为相交。

判断AABB相交的核心逻辑是什么
AABB(Axis-Aligned Bounding Box)在三维空间中由两个点定义:min 和 max,分别表示沿x、y、z轴的最小和最大坐标。两个AABB不相交,当且仅当它们在任意一个轴上完全分离。因此,相交的充要条件是:
在x轴上重叠 且 在y轴上重叠 且 在z轴上重叠。
判断单个轴(比如x)是否重叠,用的是:box1.min.x <= box2.max.x && box2.min.x <= box1.max.x
这个不等式比“计算中心距离”或“检查顶点是否在另一盒内”更高效、无分支、数值稳定。
C++实现时最容易写错的边界条件
AABB相交是闭区间比较,即面贴面也算相交(这是物理引擎、碰撞检测的标准行为)。常见错误是误用严格不等号:
- 错误写法:
box1.max.x < box2.min.x→ 会漏掉刚好接触的情况 - 正确写法:
box1.max.x < box2.min.x是分离条件,取反才是相交;但更推荐直接写重叠判断:
推荐统一用以下模式(每个轴独立判断):
overlap_x = (box1.min.xoverlap_y = (box1.min.yoverlap_z = (box1.min.z- 最终结果:
return overlap_x && overlap_y && overlap_z
注意:min 和 max 必须满足 min.x <= max.x 等前提,否则盒子非法——函数本身不校验这点,调用方需保证输入有效。
用glm或自定义结构体时的参数传递陷阱
如果使用 glm::vec3 表示顶点,别直接传引用或值传错方向:
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
典型结构体定义:
struct AABB {
glm::vec3 min;
glm::vec3 max;
};函数签名建议写成:
bool intersects(const AABB& a, const AABB& b)
而非 const AABB a, const AABB b —— 避免拷贝 glm::vec3(虽小但冗余);也别写成 AABB& a, AABB& b(语义上不应修改输入)。
若用纯C风格数组(如 float aabb[6],前3个是min,后3个是max),务必文档注明顺序,否则极易和 [xmin, xmax, ymin, ymax, zmin, zmax] 混淆——后者破坏轴对齐的连续性,增加索引错误风险。
性能敏感场景下的优化提示
这个判断本身已是O(1)、无分支(现代CPU下可向量化)、无浮点除法或sqrt,基本没有优化空间。但实际工程中容易被忽略的是:
- 不要在每帧对所有物体两两调用——用空间划分(如BVH、网格哈希)先剪枝
- 如果已知某轴(如y)恒定(例如2D平台游戏投影到xy平面),可提前跳过z轴判断
- 编译器通常能自动把三个轴的判断合并为紧凑指令,但显式写成
return (a.min.x 更利于内联和常量传播 - 避免在循环内重复访问
a.min.x多次——现代编译器一般能优化,但若结构体非平凡(如带getter),手动缓存到局部变量更稳妥
真正耗时的从来不是这个判断函数本身,而是你把它放在了不该放的地方。

















