从我的上一个问题中:Marching Cube Question
然而,我仍然不清楚:
- 如何创建虚拟的立方体/体素以检查顶点是否在等值面以下?
- 如何知道哪个顶点在等值面以下?
- 每个立方体/体素如何确定使用哪个cubeindex/表面?
- 如何使用triTable中的数据绘制表面?
假设我有一个苹果的点云数据。
我该怎么做?
有谁熟悉Marching Cube能帮助我吗?
我只会C++和OpenGL。(C有点超出我的能力范围)
从我的上一个问题中:Marching Cube Question
然而,我仍然不清楚:
假设我有一个苹果的点云数据。
我该怎么做?
有谁熟悉Marching Cube能帮助我吗?
我只会C++和OpenGL。(C有点超出我的能力范围)
首先,等值面可以用两种方式表示。一种方式是从外部源获取等值和每个点的标量数据集,这就是MRI扫描的工作原理。第二种方法是创建一个隐式函数F(),该函数以点/顶点作为其参数并返回一个新的标量值。考虑以下函数:
float computeScalar(const Vector3<float>& v)
{
return std::sqrt(v.x*v.x + v.y*v.y + v.z*v.z);
}
1)这取决于您的实现方式。您需要拥有一种数据结构,可以在每个立方体角(顶点)查找值。这可以是3D图像(即OpenGL中的3D纹理),也可以是自定义的数组数据结构,或任何其他格式。
2)您需要检查立方体的顶点。对此有不同的优化方法,但普遍而言,从第一个角开始,只需检查立方体的所有8个角的值。
3)大多数(快速)算法创建掩码位来用作静态选项数组的查找表。对于此,只有那么多可能的选项。
4)一旦从triTable制作了三角形,就可以使用OpenGL将它们渲染出来。
假设我有一个苹果的点云数据,我该怎么办?
这无法与Marching Cubes一起使用。Marching Cubes需要体素数据,因此您需要使用一些算法将数据的点云放入立方体体积中。高斯喷洒是一个选择。
通常,如果您正在使用点云进行工作,并且想要查看表面,则应查看表面重建算法,而不是Marching Cubes。
如果您想了解更多信息,我强烈建议阅读一些关于可视化技术的书籍。其中一本好书来自Kitware公司 - The Visualization Toolkit。
您可能需要查看VTK。它具有Marching Cubes的C ++实现,并且完全开源。
根据要求,这里提供一些使用JavaScript/Three.js实现Marching Cubes算法的示例代码(用于图形):
http://stemkoski.github.com/Three.js/Marching-Cubes.html
如需了解更多理论细节,请查看以下文章: