普通的 marching cubes 每个立方体有 12 条边,但你可以每个立方体只保留 3 条边,并将这些边保存在一个数组中。然后再次遍历所有的立方体时,引用相邻立方体的边而不是重新计算它们。
如何引用相邻立方体的过程并没有在网上清楚地讨论,因此任何使用 marching cubes 的人都可以帮助找到解决方案的细节。你知道是否已经有实现了吗?
下面是一张图片,黄色部分显示了每个立方体所需的 3 条边,而不是 12 条。
编辑- 我刚刚找到了这个解决方案,虽然它只是其中的一部分:
想象一下从具有最低坐标的立方体角落出发的 3 条边。然后,所有其他边都属于其他立方体。如果我们的立方体坐标为 (x,y,z),则相邻立方体的坐标为 (x+1,y,z)、(x,y+1,z)、(x,y,z+1)、(x+1,y+1,z)、(x+1,y,z+1) 和 (x,y+1,z+1)。你可以将边想象成向量。然后,立方体角落的边为 (1,0,0)、(0,1,0) 和 (0,0,1)。坐标为 (x+1,y,z) 的立方体有属于我们的立方体的边 (0,1,0) 和 (0,0,1)。坐标为 (x+1,y+1,z) 的立方体只有一条边 (0,0,1) 属于我们的立方体。因此,如果你为立方体存储了 4 个元素,就可以像这样访问它们:
现在edge7连接哪些点?答案是 (x,y+1,z) 和 (x,y+1,z)+(0,0,1)=(x,y+1,z+1)。
现在edge7连接哪些立方体?这更难了。我们可以看到坐标z沿着边缘变化,这意味着邻近的立方体具有相同的z坐标。现在所有其他坐标都会改变。当我们有+1时,该立方体具有较大的坐标。当我们有+0时,该立方体具有较小的坐标。所以这条边连接了立方体(x,y,z)和(x-1,y+1,z)。另外两个具有相同边缘的立方体是(x,y+1,z)和(x-1,y,z)。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
编辑2- 所以我正在做这件事,它并不简单。我有一个循环同时计算8个点、12个边、边缘插值、位值和顶点边缘值,所有这些都在一个循环中。
因此,我正在做一个新的循环来尽可能地计算并将其放置在数组中,以在复杂的循环中使用。
我可以回收沿边缘交点插值的值,并将其存储在一个数组中,尽管我将不得不重新计算所有点的值,因为我用于决定位数的点的值引用了顶点表中的值。这让我很困惑!我以为一旦我有了边缘相交的值,我就可以直接使用它们来获取三角形表,而无需重新计算所有点的值!
事实上不是。 无论如何,下面是另一个已经完成此操作的人提供的信息,如果只是可读的话! http://www.new-npac.org/projects/sv2all/sv2/vtk/patented/vtkImageMarchingCubes.cxx 向此行滚动:Cubes are responsible for edges on their min faces.
如何引用相邻立方体的过程并没有在网上清楚地讨论,因此任何使用 marching cubes 的人都可以帮助找到解决方案的细节。你知道是否已经有实现了吗?
下面是一张图片,黄色部分显示了每个立方体所需的 3 条边,而不是 12 条。
![Image](https://istack.dev59.com/7TfYhm.webp)
想象一下从具有最低坐标的立方体角落出发的 3 条边。然后,所有其他边都属于其他立方体。如果我们的立方体坐标为 (x,y,z),则相邻立方体的坐标为 (x+1,y,z)、(x,y+1,z)、(x,y,z+1)、(x+1,y+1,z)、(x+1,y,z+1) 和 (x,y+1,z+1)。你可以将边想象成向量。然后,立方体角落的边为 (1,0,0)、(0,1,0) 和 (0,0,1)。坐标为 (x+1,y,z) 的立方体有属于我们的立方体的边 (0,1,0) 和 (0,0,1)。坐标为 (x+1,y+1,z) 的立方体只有一条边 (0,0,1) 属于我们的立方体。因此,如果你为立方体存储了 4 个元素,就可以像这样访问它们:
edge1 = cube[x][y][z][0];
edge2 = cube[x][y][z][1];
edge3 = cube[x][y][z][2];
edge4 = cube[x+1][y][z][1];
edge5 = cube[x+1][y][z][2];
edge6 = cube[x][y+1][z][0];
edge7 = cube[x][y+1][z][2];
edge8 = cube[x][y][z+1][0];
edge9 = cube[x][y][z+1][1];
edge10 = cube[x+1][y+1][z][2];
edge11 = cube[x+1][y][z+1][1];
edge12 = cube[x][y+1][z+1][0];
现在edge7连接哪些点?答案是 (x,y+1,z) 和 (x,y+1,z)+(0,0,1)=(x,y+1,z+1)。
现在edge7连接哪些立方体?这更难了。我们可以看到坐标z沿着边缘变化,这意味着邻近的立方体具有相同的z坐标。现在所有其他坐标都会改变。当我们有+1时,该立方体具有较大的坐标。当我们有+0时,该立方体具有较小的坐标。所以这条边连接了立方体(x,y,z)和(x-1,y+1,z)。另外两个具有相同边缘的立方体是(x,y+1,z)和(x-1,y,z)。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
编辑2- 所以我正在做这件事,它并不简单。我有一个循环同时计算8个点、12个边、边缘插值、位值和顶点边缘值,所有这些都在一个循环中。
因此,我正在做一个新的循环来尽可能地计算并将其放置在数组中,以在复杂的循环中使用。
我可以回收沿边缘交点插值的值,并将其存储在一个数组中,尽管我将不得不重新计算所有点的值,因为我用于决定位数的点的值引用了顶点表中的值。这让我很困惑!我以为一旦我有了边缘相交的值,我就可以直接使用它们来获取三角形表,而无需重新计算所有点的值!
事实上不是。 无论如何,下面是另一个已经完成此操作的人提供的信息,如果只是可读的话! http://www.new-npac.org/projects/sv2all/sv2/vtk/patented/vtkImageMarchingCubes.cxx 向此行滚动:Cubes are responsible for edges on their min faces.