7

我正在使用这个行进立方体算法来绘制 3D 等值面(移植到 C#,输出MeshGeomtry3Ds,但其他方面相同)。生成的曲面看起来很棒,但需要很长时间来计算。

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

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

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

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

4

4 回答 4

5

我知道这有点老了,但我最近基于相同的源实现了 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 对象,直接从点/值到三角形。

简而言之,不仅仅是算法的复杂性,内存分配(并且在基础上做了很多)也需要时间。

于 2012-06-06T18:57:16.613 回答
2

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

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

于 2009-06-18T21:39:28.200 回答
0

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

于 2010-04-25T05:45:05.380 回答
0

每个立方体有 12 条边,如果您遍历每个立方体并找到 12 个交点,那么您对交点的计算量是 4 倍 - 您只需要在每个立方体的左下角使用 3 条边,并额外增加一行在区域的右上角,然后使用特殊升级来访问您找到的所有值。我将就此做一个主题,因为它需要讨论并且很复杂。

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

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

于 2013-04-17T08:29:07.947 回答