当前位置: 首页 > news >正文

轴对齐包围盒(AABB)和有向包围盒(OBB)介绍

基本概念

OBB(Oriented Bounding Box)AABB(Axis-Aligned Bounding Box) 是计算机图形学和几何处理中常用的两种包围盒,用于快速估算几何体的空间范围,帮助进行碰撞检测、加速渲染、空间分割等任务。两者有不同的特性和应用场景。下面详细介绍它们的概念、特点以及使用场景。

1. AABB(Axis-Aligned Bounding Box)

AABB 是轴对齐包围盒,其边缘与世界坐标系的轴对齐。

特点:

  • 对齐坐标轴:AABB 的各边与三维空间中的 x、y、z 轴对齐,因此它是一个长方体
  • 易于计算:AABB 的计算非常简单,只需要找出对象的最小和最大坐标,构造一个包围整个对象的长方体。
  • 效率高:由于与坐标轴对齐,AABB 在碰撞检测和交集测试中效率很高。计算两个 AABB 之间是否相交只需比较其在 x、y、z 轴方向上的最小和最大值。

适用场景:

  • 简单碰撞检测:AABB 常用于快速粗略检测,因为它的计算速度很快。例如,两个对象的 AABB 相交,则进一步进行更精确的碰撞检测。
  • 空间划分:AABB 经常被用于八叉树、**BVH(Bounding Volume Hierarchy)**等加速结构中,帮助划分场景空间。

计算方式:

  1. 对于一个三维对象,找到它在每个轴上的最小值和最大值。
  2. 用这些最小值和最大值来构造一个包围盒。

优点

  • 计算简单、快速。
  • 在坐标轴不变化的情况下保持不变。

缺点

  • 由于与轴对齐,它不能紧密包围对象,尤其是当对象旋转后,它的包围体积会变得很大,包含了很多不必要的空白区域。

示例:

假设你有一组三维点,计算 AABB 的伪代码如下:

Vector3 minPoint = findMinPoint(points);
Vector3 maxPoint = findMaxPoint(points);
AABB boundingBox(minPoint, maxPoint);

2. OBB(Oriented Bounding Box)

OBB 是有向包围盒,它与 AABB 不同的是,它可以任意旋转,与物体的局部坐标系对齐,而不是世界坐标轴。

特点:

  • 自由旋转:OBB 的边缘不一定与坐标轴对齐,而是根据物体的形状旋转,使它能够更紧密地包围物体。OBB 可以随着物体的旋转而旋转,因此更适合不规则形状的几何体。
  • 计算复杂:相比 AABB,OBB 的计算复杂得多。它需要计算物体的主方向(如使用主成分分析 PCA 或其他方法),然后在这些方向上构造包围盒。
  • 精度高:由于 OBB 能更好地贴合物体的形状,包围体积通常比 AABB 小很多,减少了不必要的空白区域。

适用场景:

  • 精确碰撞检测:OBB 常用于需要较高精度的碰撞检测或相交测试,特别是当物体处于任意方向或旋转时。
  • 几何体近似:当需要更精确地表示物体的边界时,OBB 是比 AABB 更好的选择。例如,使用 OBB 进行物体的物理模拟或几何分析,可以获得更高的精度。

计算方式:

  1. 计算物体的主方向(通常使用 PCA,找到对象的主成分方向)。
  2. 根据这些方向,在局部坐标系中构造最小包围盒。
  3. 将该盒子与物体的局部坐标系对齐。

优点

  • 能紧密包围旋转的对象,减少空白空间。
  • 精确度更高,特别是对复杂几何体。

缺点

  • 计算复杂,涉及矩阵变换和主方向计算。
  • 碰撞检测相对 AABB 较慢,因为必须计算旋转后的包围盒之间的相交情况。

示例:

使用 PCA 来计算物体的 OBB 的伪代码:

Matrix3 rotationMatrix = computePCA(points);  // 计算主方向
Vector3 obbMin = findMinInLocalFrame(points, rotationMatrix);
Vector3 obbMax = findMaxInLocalFrame(points, rotationMatrix);
OBB boundingBox(obbMin, obbMax, rotationMatrix);

3. AABB 与 OBB 的比较

特点AABB(Axis-Aligned Bounding Box)OBB(Oriented Bounding Box)
对齐方式与世界坐标系的 x、y、z 轴对齐可与物体局部坐标系对齐,任意旋转
计算复杂度计算简单,直接取最小值和最大值计算复杂,需要主方向的计算和旋转
包围体积相对较大,尤其是物体旋转时紧密包围物体,体积较小
碰撞检测效率高效,计算两个 AABB 相交只需比较轴向范围较慢,需要计算旋转后的包围盒是否相交
适用场景粗略碰撞检测,空间划分,简单物体的包围盒精确碰撞检测,几何体近似,物理模拟

4. 实际应用场景

  • AABB 由于计算简单,常用于初步检测快速拒绝测试。例如,在游戏中,AABB 可以用于判断物体是否需要进一步精确碰撞检测。
  • OBB物体旋转碰撞模拟等高精度场景中更有用。例如,在物理模拟和 CAD 系统中,当物体可以任意旋转时,OBB 更适合描述其边界。

5. AABB 和 OBB 的结合

在许多实际应用中,会结合使用 AABB 和 OBB。通常的策略是:

  1. 使用 AABB 进行快速的初步检测,排除明显不相交的对象。
  2. 如果 AABB 相交,再使用更精确的 OBB 进行进一步的精确检测。

这种结合使用的方式能在性能精度之间取得平衡。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • oracle停止当前运行的JOB或kill会话
  • synchronized和ReentrantLock区别?
  • 图论篇--代码随想录算法训练营第六十一天打卡| Floyd 算法,A*算法
  • css实现居中的方法
  • 悲观锁与乐观锁
  • 一个WebSocket的前端封装类
  • RocketMQ 消费方式
  • vue组件之间的数据共享
  • vite 使用飞行器仪表示例
  • IDEA 2024.3 EAP新特征早览!
  • C#基础(16)实践:学生成绩管理系统
  • 基于PHP+MySQL组合开发的在线客服源码系统 聊天记录实时保存 带完整的安装代码包以及搭建部署教程
  • 【JVM】垃圾回收机制|死亡对象的判断算法|垃圾回收算法
  • 学习笔记——RegNet:Designing Network Design Spaces
  • (k8s)kubernetes集群基于Containerd部署
  • express.js的介绍及使用
  • go append函数以及写入
  • Vue2.0 实现互斥
  • Vue全家桶实现一个Web App
  • Webpack 4x 之路 ( 四 )
  • 分享一份非常强势的Android面试题
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端学习笔记之观察者模式
  • 强力优化Rancher k8s中国区的使用体验
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 小程序button引导用户授权
  • 小程序开发之路(一)
  • 用element的upload组件实现多图片上传和压缩
  • 在weex里面使用chart图表
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​业务双活的数据切换思路设计(下)
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #Java第九次作业--输入输出流和文件操作
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #QT 笔记一
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第一天)包装对象、作用域、创建对象
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET CLR基本术语
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net framework4与其client profile版本的区别