我想要的是使用我创建的体素模型对网格进行重新三角测量。
从谷歌搜索中我发现Marching Cubes应该是一个合适的算法。我已经阅读了很多教程,但是iso-surface部分让我很困惑。
我遵循本教程http://paulbourke.net/geometry/polygonise/,但无法理解我的情况下的iso-surface究竟是什么以及如何提取它。
这是我的初始物体表面吗?
EDIT1:
到目前为止,我已经通过重新三角测量做到了这一点:
似乎我在isosurface和体素之间找到了正确的itnersection点,因为似乎有一个正确的体素模型:
但为什么他们在重新三角测量中错过了这么多三角形呢?
EDIT2:
调试我的代码,我注意到以下内容: 我使用的Marching Cube表有指向iso-surface切割我的体素的顶点的指针。这些三元组构成了新的三角形。但是我注意到Table多次表示用顶点构造三角形(例如)intersection_point(0)-intersection_point(3)-intersection_point(5)但我的交点位于不同的位置。
- >交点的位置取决于它们所处的边缘。
答案 0 :(得分:1)
首先 - 您需要知道为什么以及如何重新对网格进行三角测量。基于体素的网格具有特定的外观,因此如果您只是想简化三角形/顶点数或网格拓扑,那么体素不是满足您需求的方式 - 它们只会破坏您的网格并使其变得难看。
但是,如果你真的想拥有体素,那么让我们看看我们在谈论什么......
一般来说,'iso-something'线/表面是一条线/表面,我们的'某事'是恒定的。让我们想象一下山的地图 - 你有一个点代表一个山的尖端和它周围的一些圆形线 - 这些线代表恒定的高度,这意味着当你沿着这条线去旅行时,你不会改变你的高度在海上。
现在,当你从2D移动到3D时,'line'被'surface'取代,一切都保持不变。让我们以一个灯泡为例 - 假设灯泡在每个方向上不断点亮,并且知道得到的距离越近 - 温度升高,那么以灯泡为中心的每个球体将成为它的“等长”表面。 仅使用一个灯泡的示例非常简单,但是当您拥有更多灯泡时,表面会变得更加有趣,这是使用Voxel场和Marching Cubes算法的完美示例。
所有这些示例都使用了一些物理值,并且在您的确切情况下可能会产生误导,但是当您需要对网格进行体素化时,您只需假设您存储某种物体的“密度”,这基本上意味着内部的体素。网格的值为1,而外部的体素的值为0。
BTW:几个月前我实现了自己的Marching Cubes,它没有使用任何静态表但是在代码中计算了所有内容,所以如果你有更具体的问题,我可以帮你解决一些细节。