从点创建OOBB

时间:2011-05-31 14:36:19

标签: c++ graphics geometry 3d 3d-reconstruction

如何为给定的点创建最小的OOBB?创建AABB或球体非常简单,但是我在创建最小OOBB时遇到了问题。

[编辑]

第一个答案没有给我带来好结果。我没有巨大的积分。我得分很少。我正在做碰撞几何生成。例如,立方体有36个点(6个边,每个2个三角形,每个三角形有3个点)。第一篇文章的算法给立方体带来了不好的结果。多维数据集的示例点:http://nopaste.dk/download/3382(应返回标识轴)

3 个答案:

答案 0 :(得分:15)

PCA /协方差/特征向量方法基本上找到近似于对象顶点的椭球的轴。它应该适用于随机对象,但会给像立方体这样的对称对象带来不好的结果。那是因为立方体的近似椭球是一个球体,而球体没有明确定义的轴。所以你没有得到你期望的标准轴。

也许如果您事先知道某个对象是一个多维数据集,您可以使用专门的方法,并将PCA用于其他所有方法。

另一方面,如果你想计算真正的OBB,你可以使用现有的实现,例如http://www.geometrictools.com/LibMathematics/Containment/Containment.html (具体是http://www.geometrictools.com/LibMathematics/Containment/Wm5ContMinBox3.cpp)。我相信这可以实现你的问题评论中提到的算法。

从该页面引用:

  

ContMinBox3文件实现了   计算算法   包含最小音量的盒子   点。这种方法计算   凸壳的凸点,凸起   多面体。最小音量框   要么脸都与a重合   凸多面体的面或具有   轴方向由三个给出   相互垂直的边缘   凸多面体。每个面孔   凸多面体由   将多面体投射到平面上   面子,计算   最小区域矩形包含   预测和计算   最小长度间隔包含   投影到垂直线上   面子。最小面积矩形   和最小长度间隔相结合   形成一个候选框。然后所有三倍   凸多面体的边缘是   处理。如果任何三重相互   垂直边缘,最小的盒子   轴的方向   计算边缘。在所有这些盒子里,   体积最小的那个是   最小容量框包含   原点集。

如果如您所说,您的对象没有大量顶点,则运行时间应该是可接受的。

http://www.gamedev.net/topic/320675-how-to-create-oriented-bounding-box/的讨论中,上述图书馆的作者对该主题进行了更多阐述:

  

Gottschalk的OBB构造方法是计算点集的协方差矩阵。该矩阵的特征向量是OBB轴。平均点是OBB中心。 OBB不保证具有所有包含盒子的最小体积。通过递归地分割其顶点是点集的三角形网格来构建OBB树。分裂提到了一些启发式方法。

     

包含点集的最小音量框(MVB)是包含点的凸包的最小音量框。船体是凸多面体。基于Joe O'Rourke的结果,MVB由多面体的面或多面体的三个垂直边支撑。 “由脸部支持”意味着MVB的脸部与多面体脸部重合。 “由三个垂直边缘支撑”意味着MVB的三个垂直边缘与多面体的边缘重合。

     

正如jyk所指出的,任何这些算法的实现都不是微不足道的。但是,永远不要让你不鼓励尝试:) AABB可能是一个很好的选择,但它也可能是一个非常糟糕的选择。考虑一个端点为(0,0,0)和(1,1,1)的“薄”圆柱体[想象圆柱体是连接点的线段]。 AABB为0 <= x <= 1,0 <= y <= 1,0 <= z <= 1,体积为1.MVB具有中心(1,1,1) )/ 2,轴(1,1,1)/ sqrt(3),以及该轴sqrt(3)/ 2的范围。它还有两个垂直于第一轴的附加轴,但是范围是0.该框的体积为0.如果给线段稍微厚一点,MVB会变得略大,但仍然比一个小得多的体积。 AABB的那个。

     

您选择的哪种类型的框应该取决于您自己的应用程序的数据。

     

所有这些的实现都在我的www.geometrictools.com网站上。我对边界体积树使用中值分裂启发式算法。 MVB结构需要2D中的凸面船体探测器,3D中的凸面船体探测器,以及计算包含一组平面点的最小区域框的方法 - 我使用旋转卡尺方法。

答案 1 :(得分:10)

首先,您必须以伪码

计算点的质心
mu = sum(0..N, x[i]) / N

然后你必须计算协方差矩阵

C = sum(0..N, mult(x[i]-mu, transpose(x[i]-mu)));

注意,mult通过(1x3)矩阵乘法执行(3x1)矩阵乘法,结果是3x3矩阵。

C矩阵的特征向量定义了OBB的三个轴。

答案 2 :(得分:4)

C ++ online中有一个新的库 ApproxMVBB ,用于计算最小音量边界框的近似值。它是根据MPL 2.0许可证发布的,由我撰写。

如果你有时间看看:http://gabyx.github.io/ApproxMVBB/

该库与C ++ 11兼容,只需要Eigen http://eigen.tuxfamily.org。 测试显示,在合理的时间内(大约5-7秒)可以计算出3D中140万点的近似值,具体取决于您的近似设置。