理解AABB包围盒算法
2014-03-11 10:52
609 查看
这两天在弄引擎的碰撞检测模块,弄的纠结死,资料出奇的少,大牛们的代码又不加注释,唉。
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,其实也很简单,画画图就知道了,这样能确保其没有方向性
附上两张图,图上的数字表示的是蓝线的顶点据顶面的距离,剩下的你懂的。
转载自:http://tech.byreach.com/node/2442
AABB的全称是axis aligned bounding box,
大致概念首先是一个box,
也就是一个框框,
这个框框的4边与坐标轴平行,
也就是一个正方形或者长方形区域。
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/2442AABB的全称是axis aligned bounding box,
大致概念首先是一个box,
也就是一个框框,
这个框框的4边与坐标轴平行,
也就是一个正方形或者长方形区域。
相关文章推荐
- 理解AABB包围盒算法
- 理解AABB包围盒算法
- [算法][包围盒]AABB简单类
- 光线与包围盒(AABB)的相交检测算法
- 3D空间中射线与轴向包围盒AABB的交叉检测算法【转】
- 3D空间中射线与轴向包围盒AABB的交叉检测算法
- 光线与包围盒(AABB)的相交检测算法
- 光线与包围盒(AABB)的相交检测算法
- 射线和轴对齐包围盒相交检测-简洁算法(ray-aabb overlap test alogrithm)
- 3D空间中射线与轴向包围盒AABB的交叉检测算法
- [算法][包围盒]球,AABB,OBB
- AABB包围盒算法
- 3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】
- [算法][包围盒]球,AABB,OBB
- 深入理解Java虚拟机 读书笔记 之 垃圾回收算法的演变
- 【算法】 排列hash 变进制数 的理解 《Hash函数的设计优化》 李羽修
- 对于KMP算法的理解(Sunday)算法的理解
- 机器学习实战_初识朴素贝叶斯算法_理解其python代码(二)
- 对普利姆算法的理解(大话数据结构)。
- 神经网络NN简单理解以及算法