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

问题描述 投票:0回答:1

我想使用我创建的体素模型重新三角化网格。

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

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

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

编辑1:

到目前为止,我已经通过重新三角测量完成了此操作:

re-triangulated object

我似乎找到了等值面和体素之间的正确交点,因为它似乎具有正确的体素模型:

voxel model

但是为什么他们在重新三角测量时丢失了这么多三角形?

编辑2:

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

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

3d iso cubes mc
1个回答
1
投票

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

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

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

维基示例

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.