6

来自我的最后一个问题:Marching Cube Question

但是,我仍然不清楚,如:

  1. 如何创建虚构的立方体/体素来检查顶点是否低于等值面?
  2. 我怎么知道哪个顶点在等值面下方?
  3. 每个立方体/体素如何确定使用哪个立方体索引/曲面?
  4. 如何使用 triTable 中的数据绘制表面?

假设我有一个苹果的点云数据。
我该如何进行?

熟悉Marching Cube的人可以帮助我吗?
我只知道 C++ 和 opengl。(c 有点失控)

4

3 回答 3

2

首先,等值面可以用两种方式表示。一种方法是将等值和每点标量作为来自外部源的数据集。这就是 MRI 扫描的工作原理。第二种方法是创建一个隐式函数 F(),它将一个点/顶点作为其参数并返回一个新的标量。考虑这个函数:

float computeScalar(const Vector3<float>& v)
{
    return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
}

这将计算标量场中每个点从该点到原点的距离。如果等值是半径,那么您只是想出了一种表示球体的方法。这是因为 |v| <= R 对于球体内的所有点或位于其内部的所有点都是正确的。只需弄清楚哪些顶点在球体内,哪些在球体外。您想使用小于或大于运算符,因为卷将空间一分为二。当您知道立方体中的哪些点被分类为内部和外部时,您也知道等值面与哪些边相交。你可以得到从没有三角形到五个三角形的所有东西。网格顶点的位置可以通过在相交的边上插值来找到实际的交点来计算。


如果你想用标量字段表示一个苹果,你要么需要获取源数据集以插入你的应用程序,要么使用一个非常复杂的隐式函数。我建议先让简单的几何图元(如球体和圆环)开始工作,然后再从那里扩展。

于 2009-04-23T17:36:35.210 回答
1

1)这取决于你的实施。您需要有一个数据结构,您可以在其中查找体素或立方体的每个角(顶点)的值。这可以是 3d 图像(即:OpenGL 中的 3D 纹理),也可以是自定义的数组数据结构,或您希望的任何其他格式。

2)您需要检查立方体的顶点。对此有不同的优化,但一般来说,从第一个角开始,只需检查立方体所有 8 个角的值。

3) 大多数(快速)算法会创建一个位掩码,用作查找表到静态选项数组中。对此只有这么多可能的选择。

4) 一旦你从 triTable 制作了三角形,你就可以使用 OpenGL 来渲染它们。

假设我有一个苹果的点云数据。我该如何进行?

这不适用于行进立方体。行进立方体需要体素数据,因此您需要使用一些算法将数据点云放入立方体积中。高斯溅射是这里的一个选项。

通常,如果您从点云工作,并且想要查看表面,则应该查看表面重建算法而不是行进立方体。

如果您想了解更多信息,我强烈建议您阅读一些有关可视化技术的书籍。一个不错的工具来自 Kitware 人员 - The Visualization Toolkit

您可能想看看VTK。它具有Marching Cubes的 C++ 实现,并且是完全开源的。

于 2009-04-23T17:04:51.603 回答
1

根据要求,这里是一些实现 Marching Cubes 算法的示例代码(使用 JavaScript/Three.js 作为图形):

http://stemkoski.github.com/Three.js/Marching-Cubes.html

有关该理论的更多详细信息,您应该查看文章

http://paulbourke.net/geometry/polygonise/

于 2012-08-27T20:44:26.683 回答