从点创建OOBB

问题描述 投票:18回答:3

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

[编辑]

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

c++ graphics geometry 3d 3d-reconstruction
3个回答
16
投票

PCA /协方差/特征向量方法本质上是找到近似于对象顶点的椭球轴。它应该适用于随机对象,但对于像立方体这样的对称对象却会产生不好的结果。这是因为立方体的近似椭圆体是一个球体,并且球体没有明确定义的轴。因此,您没有获得期望的标准轴。

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

另一方面,如果您要计算真实的OBB,则可以使用现有的实现,例如http://www.geometrictools.com/LibMathematics/Containment/Containment.html(存档在https://web.archive.org/web/20110817024344/geometrictools.com/LibMathematics/Containment/Containment.htmlhttps://github.com/timprepscius/GeometricTools/blob/master/WildMagic5/LibMathematics/Containment/Wm5ContMinBox3.cpp)。我相信这可以实现您的问题注释中提到的算法。

从该页面引用:

ContMinBox3文件实现了计算的算法包含点。此方法计算点的凸包,凸的多面体。最小体积的盒子要么脸都和凸多面体的面或具有轴方向由三个给定相互垂直的边缘凸多面体。每张脸凸多面体由将多面体投影到飞机上的脸,计算包含预测并计算最小长度间隔,包含垂直于脸最小面积矩形和最小长度间隔组合为形成一个候选框。然后所有三元组凸多面体的边缘是处理。如果有任何三元组相互垂直边缘,最小的盒子轴指向计算边缘。在所有这些盒子中,体积最小的是包含原始点集。

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

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的凸包壳查找器,以及用于计算包含一组平面点的最小面积框的方法-为此,我使用旋转卡尺方法。


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的三个轴。


6
投票

在线C ++中有一个新的库ApproxMVBB,该库计算最小体积边界框的近似值。它根据MPL 2.0许可证发布,由我撰写。

如果有时间的话,请看:http://gabyx.github.io/ApproxMVBB/

该库与C ++ 11兼容,只需要Eigen http://eigen.tuxfamily.org。测试表明,根据您的近似设置,可以在合理的时间(大约5-7秒)内计算出1.4亿个3D点的近似值。]

© www.soinside.com 2019 - 2024. All rights reserved.