实现Marching Cube算法?

6

从我的上一个问题中:Marching Cube Question

然而,我仍然不清楚:

  1. 如何创建虚拟的立方体/体素以检查顶点是否在等值面以下?
  2. 如何知道哪个顶点在等值面以下?
  3. 每个立方体/体素如何确定使用哪个cubeindex/表面?
  4. 如何使用triTable中的数据绘制表面?

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

有谁熟悉Marching Cube能帮助我吗?
我只会C++和OpenGL。(C有点超出我的能力范围)

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);
}

这段内容涉及到IT技术,讲解了如何使用标量场来计算点与原点之间的距离,并用此方法表示球体等几何图形。当你知道哪些点在立方体内部或外部时,也就知道等值面与哪些边相交。通过插值计算交点位置,可以确定网格顶点的位置。如果想用标量场表示苹果等物体,则需要获取源数据集或使用复杂的隐式函数。建议先从简单的几何图形如球体和环面开始,逐步拓展。

1

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

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

3)大多数(快速)算法创建掩码位来用作静态选项数组的查找表。对于此,只有那么多可能的选项。

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

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

这无法与Marching Cubes一起使用。Marching Cubes需要体素数据,因此您需要使用一些算法将数据的点云放入立方体体积中。高斯喷洒是一个选择。

通常,如果您正在使用点云进行工作,并且想要查看表面,则应查看表面重建算法,而不是Marching Cubes。

如果您想了解更多信息,我强烈建议阅读一些关于可视化技术的书籍。其中一本好书来自Kitware公司 - The Visualization Toolkit

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


6个glQuads可以等于一个体素吗?如果可以,那么相对于体素的构建是如何的?我的点是否在立方体的中心? - noob88
@noob88:不是的,你的“立方体”需要由8个点组成的对象。 6个glQuads可以成为立方体/体素的面,而你正在使用的顶点可以成为8个点。 不过,我会制作一个不同的数据结构来容纳它。 尽管如此,一些简单的多维数组也可以胜任。 - Reed Copsey
我明白了,我想我需要时间先测试一下,可以给我你的联系方式吗?如果我有进一步的问题,希望能得到你的帮助。 - noob88
2
最简单的方法就是在这里问一下 ;) 我在 Stack Overflow 上非常活跃... 如果你添加了评论,它会显示在我的个人资料中,我会回答的。不过,我强烈推荐你去了解一下 VTK - 它非常稳定、非常成熟,并且能很好地完成这个任务。 - Reed Copsey

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接