aabb是坐标轴对齐的矩形或长方体,适合初学者因其计算快、逻辑直白,常用于粗略碰撞预检;2d判断需x、y轴均重叠,3d扩展为三轴判断,实际应用中需考虑浮点精度与空间划分优化。

什么是AABB,为什么它适合初学者
AABB(Axis-Aligned Bounding Box)就是“坐标轴对齐的包围盒”,说白了就是矩形(2D)或长方体(3D),边永远平行于x/y/z轴。它不旋转、不倾斜,计算快、逻辑直白,是游戏和物理模拟里最常用来做**粗略碰撞预检**的方案。
关键点在于:它不处理复杂形状,但能快速排除90%以上不可能相交的情况。真正需要精确判定时(比如三角面碰撞),再上更重的算法。
怎么写一个2D AABB碰撞判断函数
核心思想就一句话:两个矩形在x轴上重叠 且 在y轴上也重叠,才算相交。反过来想更清晰——只要有一个轴不重叠,就一定没撞上。
假设每个物体用struct Rect { float x, y, width, height; };表示左下角位置和尺寸:
bool intersects(const Rect& a, const Rect& b) {
if (a.x + a.width <p>注意几个易错点:</p>
a.x + a.width 用的是 <code> 而不是 <code>,避免边刚好贴住时被误判为无碰撞(边界接触通常算碰撞)- 如果用中心点+半宽高表示(如
struct { float cx, cy, hw, hh; }),条件要改成abs(cx1 - cx2) ,x/y同理——这种写法数值更稳定,尤其当坐标很大时 - 别直接拿
SDL_Rect或sf::FloatRect的intersects()方法就完事;自己写一遍才能理解重叠逻辑,调试时也更容易插日志
3D AABB怎么扩展,要注意什么
2D加一维就是3D,但多一个轴意味着更多条件分支和浮点误差风险。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
结构体一般变成:struct AABB { float min_x, min_y, min_z, max_x, max_y, max_z; };(用min/max比center+extents更利于后续做空间划分)
判断逻辑只是多一行:
bool intersects(const AABB& a, const AABB& b) {
if (a.max_x <p>这里的关键差异:</p>
- 用
min/max字段后,比较更直观,也方便后续做BVH或八叉树 - 浮点数比较必须考虑精度:实际项目中建议用
std::abs(a.max_x - b.min_x) 代替<code>a.max_x ,否则移动极慢的物体可能因累积误差“穿模” - 如果物体有旋转,AABB必须每帧重新计算包围盒(取旋转后8个顶点的min/max),不能直接旋转变量——这是新手最常跳进去的坑
性能瓶颈在哪,什么时候该换算法
AABB本身很快,单次判断是O(1),但问题出在“怎么找哪两个要判”。暴力双重循环检查所有物体对是O(n²),100个物体就要近5000次调用——这时候瓶颈根本不在intersects()函数,而在检测策略。
真正在意性能时,得配合空间划分结构:
- 场景静态居多?用
std::vector<aabb></aabb>+ 简单网格(grid)分块,只查同一格及相邻8格内的物体 - 动态频繁增删?考虑
boost::geometry::index::rtree或手写简易四叉树(2D)/八叉树(3D) - 千万别在每帧对全部物体两两调用
intersects()还觉得是AABB不够快——那是架构问题,不是算法问题
另外提醒一句:AABB永远只是第一步。球体用球形检测(distance_squared )往往更自然;角色脚部需要射线检测;平台边缘得做“是否站在上面”这种方向性判断——AABB给不了这些语义。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










