行进立方体算法 - 似乎缺少三角形

时间:2014-02-04 20:42:19

标签: 3d iso cubes mc

我想要的是使用我创建的体素模型对网格进行重新三角测量。

从谷歌搜索中我发现Marching Cubes应该是一个合适的算法。我已经阅读了很多教程,但是iso-surface部分让我很困惑。

我遵循本教程http://paulbourke.net/geometry/polygonise/,但无法理解我的情况下的iso-surface究竟是什么以及如何提取它。

这是我的初始物体表面吗?

EDIT1:

到目前为止,我已经通过重新三角测量做到了这一点:

re-triangulated object

似乎我在isosurface和体素之间找到了正确的itnersection点,因为似乎有一个正确的体素模型:

voxel model

但为什么他们在重新三角测量中错过了这么多三角形呢?

EDIT2:

调试我的代码,我注意到以下内容: 我使用的Marching Cube表有指向iso-surface切割我的体素的顶点的指针。这些三元组构成了新的三角形。但是我注意到Table多次表示用顶点构造三角形(例如)intersection_point(0)-intersection_point(3)-intersection_point(5)但我的交点位于不同的位置。

- >交点的位置取决于它们所处的边缘。

1 个答案:

答案 0 :(得分:1)

首先 - 您需要知道为什么以及如何重新对网格进行三角测量。基于体素的网格具有特定的外观,因此如果您只是想简化三角形/顶点数或网格拓扑,那么体素不是满足您需求的方式 - 它们只会破坏您的网格并使其变得难看。

但是,如果你真的想拥有体素,那么让我们看看我们在谈论什么......

一般来说,'iso-something'线/表面是一条线/表面,我们的'某事'是恒定的。让我们想象一下山的地图 - 你有一个点代表一个山的尖端和它周围的一些圆形线 - 这些线代表恒定的高度,这意味着当你沿着这条线去旅行时,你不会改变你的高度在海上。

Wiki example

现在,当你从2D移动到3D时,'line'被'surface'取代,一切都保持不变。让我们以一个灯泡为例 - 假设灯泡在每个方向上不断点亮,并且知道得到的距离越近 - 温度升高,那么以灯泡为中心的每个球体将成为它的“等长”表面。 仅使用一个灯泡的示例非常简单,但是当您拥有更多灯泡时,表面会变得更加有趣,这是使用Voxel场和Marching Cubes算法的完美示例。

所有这些示例都使用了一些物理值,并且在您的确切情况下可能会产生误导,但是当您需要对网格进行体素化时,您只需假设您存储某种物体的“密度”,这基本上意味着内部的体素。网格的值为1,而外部的体素的值为0。

BTW:几个月前我实现了自己的Marching Cubes,它没有使用任何静态表但是在代码中计算了所有内容,所以如果你有更具体的问题,我可以帮你解决一些细节。