理解AABB包围盒算法

28 篇文章 2 订阅
17 篇文章 0 订阅

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

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,其实也很简单,画画图就知道了,这样能确保其没有方向性
 
 附上两张图,图上的数字表示的是蓝线的顶点据顶面的距离,剩下的你懂的。


Box2D里的AABB

转载自:http://tech.byreach.com/node/2442

AABB的全称是axis aligned bounding box,

大致概念首先是一个box,

也就是一个框框,

这个框框的4边与坐标轴平行,

也就是一个正方形或者长方形区域。


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值