0

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

通过谷歌搜索,我发现 Marching Cubes 应该是一个合适的算法。我已经阅读了很多教程,但是等值面部分让我感到困惑。

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

它是我最初的物体表面吗?

编辑1:

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

重新三角化的对象

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

体素模型

但是为什么他们在重新三角剖分时遗漏了这么多三角形呢?

编辑2:

调试我的代码时,我注意到以下内容:我使用的 Marching Cube 表具有指向等值面切割我的体素的顶点的指针。这些三元组构成了新的三角形。但我注意到很多时候表格说用顶点(例如)intersection_point(0)-intersection_point(3)-intersection_point(5) 构造三角形,但我的交点在不同的位置。

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

4

1 回答 1

1

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

但是,如果你真的想要体素,那么让我们看看我们在说什么......

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

维基示例

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

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

顺便说一句:几个月前,我实现了自己的 Marching Cubes,它没有使用任何静态表,而是在代码中计算了所有内容,因此如果您有更具体的问题,我可以为您提供一些详细信息。

于 2014-02-06T17:31:16.777 回答