【问题标题】:How to speed up marching cubes?如何加快行进方块?
【发布时间】:2009-05-15 13:57:27
【问题描述】:

我正在使用this marching cube algorithm 绘制 3D 等值面(移植到 C#,输出 MeshGeomtry3Ds,但其他方面相同)。生成的曲面看起来不错,但计算时间很长。

有没有什么方法可以加快方块的行进速度?最明显的一种是简单地降低空间采样率,但这会降低生成的网格的质量。我想避免这种情况。

我正在考虑使用两遍系统,其中第一遍采样空间更加粗糙,消除了场强远低于我的等值线的体积。这是明智的吗?有什么陷阱?

编辑: 代码已被分析,大部分 CPU 时间被分配在行进立方体例程本身和每个网格单元角的场强计算之间。字段计算超出了我的控制范围,因此加快立方体例程是我唯一的选择...

我仍然对尝试消除死区的想法很感兴趣,因为这会大大减少对两个系统的调用次数。

【问题讨论】:

    标签: performance 3d marching-cubes


    【解决方案1】:

    我知道这有点老了,但我最近基于大致相同的来源实现了 Marching Cubes。这里有很多低效率。至少,如果你在做类似的事情

    for (int x=0; x<densityArrayWidth; x++)
      for (int z=0; z<densityArrayLength; z++)
        for (int y=0; y<densityArrayHeight; y++)
          Polygonize(Gridcell, isolevel, Triangles)
    

    看看你要重新分配 edgeTable 和 Tritable 多少次!那些立即需要搬到整个班级。我也放弃了 gridCell 对象,直接从点/值到三角形。

    简而言之,不仅仅是算法的复杂性,内存分配(在基础上会分配大量内存)也需要时间。

    【讨论】:

      【解决方案2】:

      以防万一其他人在这里结束,通过更粗略的采样率消除死区几乎没有任何区别。任何远程安全(即:允许对工件进行采样的边界)粗略采样最终都会在任何远程非平凡领域中占据大部分网格。

      加快基础字段评估(大量记忆)似乎主要解决了性能问题。

      【讨论】:

        【解决方案3】:

        改用行进四面体 - 数学更简单,允许您在每个单元格中考虑更少的案例。

        【讨论】:

        • 我认为这不是一个好主意...数学更简单,但是对于给定的网格分辨率,您必须处理比立方体更多的四面体。这是一份调查论文的链接,其中包含可能的优化指针等。它有点旧(2006 年),但我认为最近没有那么多革命性的研究。 graphics.ethz.ch/teaching/scivis_common/Literature/Newman06.pdf
        • 更多的四面体,但每一个的计算量更少,依赖的操作更少,可能更可并行化。事实上,我不知道;我之所以提到它,是因为我们正在计划自己进行一项用行进四边形替换行进立方体的实验,我很好奇是否有其他人尝试过并测量过。
        • 刚刚在我下载的 C# 端口上尝试和测量。立方体 3 秒 四面体 11 秒。我不知道的是我是否可以用四面体改变网格大小,让它更快更好看。
        【解决方案4】:

        每个立方体有 12 条边,如果您遍历每个立方体并找到 12 个交点,则您对交点进行了 4 倍的计算 - 您只需在每个立方体的左下角使用 3 条边,区域右上角的额外行,然后使用特殊升级访问您找到的所有值。我打算做一个关于这个的话题,因为它需要讨论而且很复杂。

        此外,通过使用八叉树评估 ISO 级别并跳过远离 ISO 级别的区域,测试需要多边形的空间区域。

        我看过传播,但它不是那么可靠和高效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-15
          • 2013-07-27
          • 2021-04-12
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          • 2012-10-24
          相关资源
          最近更新 更多