【问题标题】:Implementing Marching Cube Algorithm?实施行进立方体算法?
【发布时间】:2010-10-21 09:44:46
【问题描述】:

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

但是,我仍然不清楚:

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

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

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

【问题讨论】:

    标签: c++ opengl rendering 3d


    【解决方案1】:

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

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

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

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

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

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

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

    如果您想了解更多信息,我强烈建议您阅读一些有关可视化技术的书籍。 Kitware 人员提供了一个很好的解决方案 - The Visualization Toolkit

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

    【讨论】:

    • 6个glQuads可以等于一个体素吗?如果是这样,体素构建如何相对于?我的观点是立方体的中心吗?
    • @noob88:不,不是真的。您的“立方体”需要是由 8 个点组成的对象。 6 个 glQuads 可能是立方体/体素的面,而您使用的顶点可能是您的 8 个点。不过,我会制作一个不同的数据结构来保存它。像多维数组这样简单的东西可以工作。
    • 我明白了.. 我想我需要时间来测试一下 1st,我可以联系你吗?如果我还有其他问题希望我能得到你的帮助..
    • 最简单的方法是在这里问它;)我非常活跃...如果您添加评论,它将显示在我的个人资料中,我会回答。不过,我强烈建议您查看 VTK - 它非常稳定、非常成熟,而且做得很好。
    【解决方案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|


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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 2022-07-16
        相关资源
        最近更新 更多