实现Marching Cube算法?

时间:2009-04-23 15:42:33

标签: c++ opengl rendering 3d

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

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

  1. 如何创建虚构的立方体/体素以检查顶点是否位于等值面下方?
  2. 我怎么知道哪个顶点在等值面下面?
  3. 每个立方体/体素如何确定使用哪个立方体索引/表面?
  4. 如何使用triTable中的数据绘制曲面?
  5. 假设我有一个苹果的点云数据 我该怎么办?

    任何熟悉Marching Cube的人都可以帮助我吗? 我只知道C ++和opengl。(c有点不在我的手中)

3 个答案:

答案 0 :(得分:2)

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

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

这将计算标量字段中每个点与点和原点的距离。如果isovalue是半径,你只想找到一种表示球体的方法。 这是因为| v | &lt; = R对于球体内的所有点或其内部的所有点都为真。只要弄清楚哪些顶点在球体内部,哪些顶点在外面。您希望使用less或greater-than运算符,因为卷将空间分成两部分。当您知道立方体中的哪些点被分类为内部和外部时,您还知道等值面与哪些边相交。你可以得到从没有三角形到五个三角形的所有东西。可以通过在相交的边上插值来计算网格顶点的位置,以找到实际的交叉点。


如果你想表示用标量字段表示苹果,你需要将源数据集插入到应用程序中,或者使用非常复杂的隐式函数。我建议首先使用像球体和圆环这样的简单几何图元,然后从那里扩展。

答案 1 :(得分:1)

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

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

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

4)从triTable制作三角形后,可以使用OpenGL渲染它们。

  

假设我有一个苹果的点云数据。我该怎么办?

这不适用于行进多维数据集。行进立方体需要体素数据,因此您需要使用一些算法将点云数据放入立方体积中。 Gaussian Splatting是一个选择。

通常情况下,如果您正在使用点云工作,并希望查看曲面,则应该查看曲面重建算法而不是行进立方体。

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

您可能需要查看VTK。它的C ++实现为Marching Cubes,并且是完全开源的。

答案 2 :(得分:1)

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

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

有关理论的更多详情,请查看

上的文章

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

相关问题