C++如何判断两个AABB矩形是否碰撞 _ 游戏开发基础碰撞检测逻辑【干货】

阿瑶姑娘_8030

阿瑶姑娘_8030

2026-04-29

831人浏览

原创

aabb碰撞只需检查x、y轴投影是否同时重叠:rect1.min.x ≤ rect2.max.x 且 rect2.min.x ≤ rect1.max.x,y轴同理;两条件均满足才相交,否则不相交。

c++如何判断两个aabb矩形是否碰撞 _ 游戏开发基础碰撞检测逻辑【干货】

用分离轴定理(SAT)的简化版直接判断AABB碰撞

AABB(Axis-Aligned Bounding Box)之间是否相交,根本不需要真正跑SAT——因为所有边都平行于坐标轴,只需检查两个矩形在x轴和y轴上的投影是否重叠。只要任一轴不重叠,就无碰撞;只有两个轴都重叠,才算碰撞。

关键点:不是“计算交点”,而是“排除不相交”。这比求交更高效、更稳定。

  • 假设矩形用 min 和 max 表示(即 Vec2 min, max),则x轴重叠条件是:rect1.min.x = rect2.min.x
  • y轴同理:rect1.min.y = rect2.min.y
  • 两式同时为真,才返回 true;任一为假,立即返回 false(短路求值可省一半比较)

别用中心+半宽高结构写错边界条件

有人习惯用 center 和 halfExtents 表达AABB,这本身没问题,但容易在碰撞判断时写出错误的不等式。比如误写成 abs(center1.x - center2.x) —— 这个形式只在两矩形完全静止、无缩放/旋转时数学等价,但一旦涉及浮点误差或后续扩展(如加入z轴),极易出错。

更稳妥的做法是统一转为 min/max 形式再判断,哪怕多一次转换,也避免逻辑歧义。

  • 从中心转 min/max: min = center - halfExtents; max = center + halfExtents
  • 不要在碰撞函数里混合两种表示,尤其不要把 center 和另一个矩形的 min 直接混算
  • 如果性能敏感且确定只用中心表示,至少确保使用 而非 <code>(防止浮点下刚好贴边却被判为不碰)

注意浮点精度导致的“贴边失效”问题

当两个AABB在某个轴上刚好“挨着”(比如 rect1.max.x == rect2.min.x),严格数学意义下它们不相交,但游戏逻辑中往往希望这种接触也算碰撞(比如角色站在地板上不能掉下去)。这时候需要引入一个极小的容差值 epsilon。

小游戏开发专家
小游戏开发专家

专业游戏架构师,将用户抽象需求转化为完整可玩的2D/3D小游戏;支持游戏闭环设计、状态管理、碰撞检测、粒子特效;当你需要做游戏、开发网页游戏、学习游戏编程或需要代码调试修复时使用

下载
  • 推荐容差值设为 1e-5f 或 std::numeric_limits<float>::epsilon()</float>(后者太小,通常不够用)
  • 修改x轴判断为:rect1.min.x = rect2.min.x - epsilon
  • 容差必须加在不等式右侧,而不是对坐标做四舍五入——否则会破坏AABB语义(比如把本该在外部的点拉进内部)
  • 切记:容差不能过大,否则会导致远距离“幽灵碰撞”,尤其在高速移动物体上会明显穿模

2D和3D版本只需扩展维度,别重复造轮子

2D AABB碰撞函数和3D的唯一区别就是多一个z轴判断。硬写两个函数不仅冗余,还容易维护不同步。C++模板能干净解决这个问题。

例如定义通用模板函数:

template<size_t n>
bool intersect(const std::array<float n>& min1, const std::array<float n>& max1,
               const std::array<float n>& min2, const std::array<float n>& max2) {
    for (size_t i = 0; i  max2[i] + 1e-5f || max1[i] <p>调用时传 <code></code> 或 <code></code> 即可,逻辑一致、无分支、易测。</p>
<p>实际项目里最容易被忽略的,是没把容差和坐标系方向(Y轴朝上还是朝下)统一考虑——比如UI系统用Y朝下,而物理系统用Y朝上,同一个 <code>min.y/max.y</code> 含义可能翻转,这时光靠函数名无法暴露问题。</p></float></float></float></float></size_t>

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

999

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习