4

我已经设法以两种方式计算了边界球半径,但没有一个能准确地给我我想要的。我不需要一个“像素”完美的边界球,但我想要比我目前拥有的更好的东西。

我正在使用 Wavefront .obj 模型并计算这些模型的边界球半径,我提取了当前模型尺寸(我使用的是 Nate Robbins 的 GLM 库),这将为我提供每个轴上的尺寸。

第一种方法: 将每个轴除以 2,这将给我每个轴上的半径。最大的是我将用于我的边界球的那个。这适用于我的项目特定的大多数对象。它对某些人不起作用,例如立方体形状的。基本上,如果我有一个立方体并用这种方法计算半径,球体会将立方体角留在外面。

第二种方法: 将每个轴除以 2,这将给我每个轴上的半径。然后我这样做是为了取出边界球的半径:

r = SQRT(x*x + y*y + z*z)

但这给了我一个相当大的半径。对象将完全封闭在球体中,但球体非常大,超出了应有的范围。

我不明白我在上面的公式中做错了什么,据我所知,它应该可以工作。但我显然错了...

4

3 回答 3

6

您的第二种方法应该为您的边界框提供边界球,但正如您所发现的,对于除框之外的任何东西来说,它都比必要的大。

可以通过平移模型点找到更好的边界球体,使它们使用您已经拥有的边界框尺寸以原点为中心,然后使用公式为每个单独的顶点计算该点从原点开始的半径sqrt(x*x + y*y + z*z)。其中最大的是边界球的半径。

请注意,这不是最佳边界球。为此,您必须找到模型的凸包并使用旋转卡尺之类的东西来选择球体的最佳中心点。

以 2D 显示,红色轮廓是形状的边界框,蓝色圆圈是框的边界圆。使用多边形顶点并以框为中心的改进圆是绿色的。请注意,黑色多边形的所有点都没有接触到蓝色圆圈。

多边形(黑色),边界框(红色),多边形的边界圆(绿色),框的边界圆(蓝色)

于 2011-05-21T17:33:37.497 回答
1

一种简单的方法是使用Miniball来计算模型的精确边界球。将它集成到您​​的项目中很容易,因为它只包含一个标题。然而,它是根据 GPL 许可的,这可能是一个问题。例子:

#include "Miniball.h"

// ...

Miniball<3> boundingSphere;

// Iterate over all vertices in the model
for (int vertexId = 0; vertexId < model.getNumVertices(); ++vertexId) {
  // Convert vertex position to Miniball point type
  Point<3> point;
  for (int dim = 0; dim < 3; ++dim) {
    point[dim] = model.getVertex(vertexId)[dim];
  }
  // Add point to bounding sphere
  boundingSphere.check_in(point);
}
// Actually calculate the sphere
boundingSphere.build();

// Get back the results
Point<3> center = boundingSphere.center();
double radiusSq = boundingSphere.squared_radius();
于 2011-05-21T18:35:43.607 回答
0

如果它是一个球体,那么你不是只需要基于一个轴来计算它吗?我可能离这里很远——但根据定义,球体不会有相同的宽度、高度和深度吗?那么一个轴上的半径=另一个轴上的半径=另一个轴上的半径?

于 2011-05-21T17:26:10.047 回答