理解AABB包围盒算法

这两天在弄引擎的碰撞检测模块,弄的纠结死,资料出奇的少,大牛们的代码又不加注释,唉。

1.aabb包围盒由一个max坐标和一个min坐标组成。可以看成一个点集。
 下面这段代码是关于两个包围盒碰撞的检测,看成点集的话很好理解

     bool  cheTouch( const  AABB &  aabb1,  const  AABB &  aabb2)
    {
        
if  (aabb1.m_min.x  <=  aabb2.m_max.x  &&  aabb1.m_min.y  <=  aabb2.m_max.y  &&  aabb1.m_min.z  <=  aabb2.m_max.z  &&   //
            aabb1.m_max.x  >=  aabb2.m_min.x  &&  aabb1.m_max.y  >=  aabb2.m_min.y  &&  aabb1.m_max.z  >=  aabb2.m_min.z)
        {
            
return   true ;
        }
        
else
        {
            
return   false ;
        }
    }

 

2.关于aabb的生成
 圆形很好弄,三角形和长方形比较类似,这里列出我代码中box类的aabb生成函数
 一点注释:m_world是box类的四行三列的矩阵,前三行是旋转的,后一行trans表示box中心的坐标
 

     void  Box::updateAABB()
    {
        Vec half_diag( 
//
            Math::abs(m_world.x_axis.x)  *  m_half_size.x  +  Math::abs(m_world.y_axis.x)  *  m_half_size.y  +  Math::abs(m_world.z_axis.x)  *  m_half_size.z,  //
            Math::abs(m_world.x_axis.y)  *  m_half_size.x  +  Math::abs(m_world.y_axis.y)  *  m_half_size.y  +  Math::abs(m_world.z_axis.y)  *  m_half_size.z,  //
            Math::abs(m_world.x_axis.z)  *  m_half_size.x  +  Math::abs(m_world.y_axis.z)  *  m_half_size.y  +  Math::abs(m_world.z_axis.z)  *  m_half_size.z);

        m_aabb.setBound(m_world.trans 
-  half_diag, m_world.trans  +  half_diag);
    }


 咋一看可能有些理解难度,可是如果把Math::abs这个去掉,你会惊奇的发现这个就是一个向量的旋转变换
 这样,加上了Math::abs,其实也很简单,画画图就知道了,这样能确保其没有方向性
 
 附上两张图,图上的数字表示的是蓝线的顶点据顶面的距离,剩下的你懂的。

分类:  图形学算法

<think>好的,用户想了解包围盒算法。首先,我需要确定用户的基础知识水平,可能对计算机图形学或碰撞检测有一定了解。包围盒算法主要用于优化几何计算,比如碰撞检测,所以得从应用场景入手解释。 用户可能想知道包围盒是什么,为什么需要它,以及常见的类型有哪些。我需要分步骤介绍,先讲概念,再讲目的,然后具体算法类型,比如AABB、包围球、OBB等,每种的特点和适用情况。 要注意使用中文,并且数学公式用正确格式。比如提到AABB时,可能需要用行内公式表达其坐标范围,用$...$包裹。同时,结构要清晰,分点说明,可能还需要比较不同算法的优缺点。 另外,用户可能想知道实际应用例子,比如在游戏开发或物理引擎中的使用,这样能帮助他们理解算法的实用性。需要确保解释准确,避免技术错误,比如混淆不同包围盒类型之间的区别。 最后,总结包围盒算法的好处,比如提高效率,减少计算量,让用户明白其重要性。检查是否有遗漏的关键点,确保覆盖所有常见类型和应用场景,同时保持语言简洁易懂。</think>好的!包围盒算法是计算机图形学和碰撞检测中的基础技术,用于快速判断物体间的相交性。以下为逐步介绍: --- ### **1. 什么是包围盒?** 包围盒(Bounding Box)是一种用简单几何体(如长方体、球体)**包裹复杂物体**的简化模型。 - **核心思想**:用简单几何体的快速计算代替复杂物体的精确计算,提升效率。 - **典型应用**:游戏引擎、物理仿真、光线追踪等。 --- ### **2. 为什么需要包围盒?** 直接计算复杂物体间的碰撞或相交需要大量计算(例如多边形相交检测)。 包围盒通过两步优化: 1. **粗略筛选**:若两包围盒不相交,则内部物体一定不相交,无需进一步计算。 2. **精确检测**:仅对包围盒相交的物体进行详细计算。 --- ### **3. 常见包围盒类型** #### **(1) 轴对齐包围盒AABB, Axis-Aligned Bounding Box)** - **定义**:长方体的边与坐标轴平行,只需存储最小/最大顶点坐标。 $$ \text{AABB范围: } [x_{\min}, x_{\max}] \times [y_{\min}, y_{\max}] \times [z_{\min}, z_{\max}] $$ - **优点**:计算速度快(只需比较坐标范围)。 - **缺点**:物体旋转后需重新计算包围盒。 #### **(2) 包围球(Bounding Sphere)** - **定义**:用球体包裹物体,存储球心和半径。 $$ \text{球方程: } (x - c_x)^2 + (y - c_y)^2 + (z - c_z)^2 \leq r^2 $$ - **优点**:旋转不变性,相交检测简单(比较球心距离与半径和)。 - **缺点**:包裹紧密性较差,尤其对细长物体。 #### **(3) 方向包围盒(OBB, Oriented Bounding Box)** - **定义**:长方体可任意旋转,存储中心点、半长轴和旋转矩阵。 - **优点**:包裹更紧密,适合旋转后的物体。 - **缺点**:相交检测需分离轴定理(SAT),计算量较大。 #### **(4) 其他类型** - **凸包(Convex Hull)**:用最小凸多面体包裹物体,包裹最紧密但计算复杂。 - **k-DOP(Discrete Orientation Polytope)**:用多个平行平面定义的凸多面体,平衡精度与效率。 --- ### **4. 包围盒的相交检测算法** 以AABB为例,判断两个AABB是否相交: $$ \text{相交条件: } \begin{cases} x_{\min}^1 \leq x_{\max}^2 \\ x_{\min}^2 \leq x_{\max}^1 \\ y_{\min}^1 \leq y_{\max}^2 \\ y_{\min}^2 \leq y_{\max}^1 \\ z_{\min}^1 \leq z_{\max}^2 \\ z_{\min}^2 \leq z_{\max}^1 \end{cases} $$ 所有条件同时满足时,两AABB相交。 --- ### **5. 算法优化与扩展** - **层次包围盒(BVH, Bounding Volume Hierarchy)**:对场景构建树状结构,逐层筛选减少计算量。 - **动态更新**:物体移动或变形时,快速更新包围盒参数(如AABB只需更新极值点)。 --- ### **6. 实际应用场景** - **游戏开发**:Unity/Unreal引擎使用AABB或OBB进行碰撞检测。 - **物理引擎**:Bullet Physics通过BVH加速刚体碰撞计算。 - **三维建模**:CAD软件用包围盒加速渲染和拾取操作。 --- ### **总结** 包围盒算法通过**空间换时间**,大幅提升几何计算的效率。选择哪种包围盒需权衡**包裹紧密性**、**计算复杂度**和**应用场景**。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值