我正在使用this marching cube algorithm绘制3D等值面(移植到C#,输出MeshGeomtry3D
s,但其他方面相同)。结果表面看起来很棒,但需要很长时间才能计算出来。
有没有办法加速行进立方体?最明显的一个是简单地降低空间采样率,但这会降低结果网格的质量。我想避免这种情况。
我正在考虑使用双通道系统,其中第一次通过采样空间更加粗糙,消除了场强远低于我的等级的体积。这是明智的吗?有什么陷阱?
编辑代码已被分析,并且大部分CPU时间在行进立方体例程本身和每个网格单元角落的场强计算之间分配。现场计算超出了我的控制范围,因此加速立方体程序是我唯一的选择......
我仍然想到尝试消除死区的想法,因为这会大大减少对两个系统的调用次数。
答案 0 :(得分: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对象,直接从点/值到三角形。
简而言之,不仅仅是算法的复杂性,内存分配(以及它们中的大量内存分配)也需要时间。
答案 1 :(得分:2)
以防万一其他人到此为止,通过较粗略的采样率消除死区使得几乎没有差别。任何远程安全(即:允许采样工件的边界)粗略的采样最终会在任何远程非平凡的领域中占据大部分网格。
加快潜在的现场评估(重度记忆)似乎主要解决了性能问题。
答案 2 :(得分:0)
尝试行进四面体 - 数学更简单,允许您考虑每个单元格更少的案例。
答案 3 :(得分:0)
每个立方体有12条边,如果你通过每个立方体并找到12个交叉点,你对交叉点进行了4次太多的计算 - 你必须在每个立方体的左下角只使用3条边,区域右上角的额外行,然后使用特殊升级来访问您找到的所有值。我将就此做一个主题,因为它需要讨论,而且很复杂。
此外,通过使用Octree评估ISO级别,以及跳过远离ISO级别的区域,测试需要多边形的空间区域。
我看过传播,但它不那么可靠和有效。