讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现简单的碰撞检测(AABB)

云婷同学_4810

云婷同学_4810

发布时间:2026-07-19 16:54:25

|

708人浏览过

|

来源于php中文网

原创

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

c++如何实现简单的碰撞检测(aabb)

什么是AABB,为什么它适合初学者

AABB(Axis-Aligned Bounding Box)就是“坐标轴对齐的包围盒”,说白了就是矩形(2D)或长方体(3D),边永远平行于x/y/z轴。它不旋转、不倾斜,计算快、逻辑直白,是游戏和物理模拟里最常用来做**粗略碰撞预检**的方案。

关键点在于:它不处理复杂形状,但能快速排除90%以上不可能相交的情况。真正需要精确判定时(比如三角面碰撞),再上更重的算法。

怎么写一个2D AABB碰撞判断函数

核心思想就一句话:两个矩形在x轴上重叠 且 在y轴上也重叠,才算相交。反过来想更清晰——只要有一个轴不重叠,就一定没撞上。

假设每个物体用struct Rect { float x, y, width, height; };表示左下角位置和尺寸:

立即学习“C++免费学习笔记(深入)”;

bool intersects(const Rect& a, const Rect& b) {
    if (a.x + a.width <= b.x || b.x + b.width <= a.x) return false;
    if (a.y + a.height <= b.y || b.y + b.height <= a.y) return false;
    return true;
}

注意几个易错点:

  • a.x + a.width <= b.x 用的是 <= 而不是 <,避免边刚好贴住时被误判为无碰撞(边界接触通常算碰撞)
  • 如果用中心点+半宽高表示(如struct { float cx, cy, hw, hh; }),条件要改成 abs(cx1 - cx2) <= hw1 + hw2,x/y同理——这种写法数值更稳定,尤其当坐标很大时
  • 别直接拿SDL_Rect或sf::FloatRect的intersects()方法就完事;自己写一遍才能理解重叠逻辑,调试时也更容易插日志

3D AABB怎么扩展,要注意什么

2D加一维就是3D,但多一个轴意味着更多条件分支和浮点误差风险。

C++ Code Review Master
C++ Code Review Master

组合式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 <= b.min_x || b.max_x <= a.min_x) return false;
    if (a.max_y <= b.min_y || b.max_y <= a.min_y) return false;
    if (a.max_z <= b.min_z || b.max_z <= a.min_z) return false;
    return true;
}

这里的关键差异:

  • 用min/max字段后,比较更直观,也方便后续做BVH或八叉树
  • 浮点数比较必须考虑精度:实际项目中建议用std::abs(a.max_x - b.min_x) < EPS代替a.max_x <= b.min_x,否则移动极慢的物体可能因累积误差“穿模”
  • 如果物体有旋转,AABB必须每帧重新计算包围盒(取旋转后8个顶点的min/max),不能直接旋转变量——这是新手最常跳进去的坑

性能瓶颈在哪,什么时候该换算法

AABB本身很快,单次判断是O(1),但问题出在“怎么找哪两个要判”。暴力双重循环检查所有物体对是O(n²),100个物体就要近5000次调用——这时候瓶颈根本不在intersects()函数,而在检测策略。

真正在意性能时,得配合空间划分结构:

  • 场景静态居多?用std::vector<AABB> + 简单网格(grid)分块,只查同一格及相邻8格内的物体
  • 动态频繁增删?考虑boost::geometry::index::rtree或手写简易四叉树(2D)/八叉树(3D)
  • 千万别在每帧对全部物体两两调用intersects()还觉得是AABB不够快——那是架构问题,不是算法问题

另外提醒一句:AABB永远只是第一步。球体用球形检测(distance_squared <= r1*r2)往往更自然;角色脚部需要射线检测;平台边缘得做“是否站在上面”这种方向性判断——AABB给不了这些语义。

热门AI工具

更多
火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

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

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

2208

2024.03.14

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

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

979

2024.03.14

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

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

407

2024.03.14

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

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

307

2024.03.14

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

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

386

2024.03.14

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

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

580

2024.03.14

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

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

1389

2024.03.21

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

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

1197

2024.03.22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn