3d marching cubes算法-似乎缺少三角形

3d marching cubes算法-似乎缺少三角形,3d,iso,cubes,mc,3d,Iso,Cubes,Mc,我想要的是使用我创建的体素模型重新三角化网格 通过谷歌搜索,我发现行进立方体应该是一个合适的算法。我读过很多教程,但iso曲面部分让我感到困惑 我遵循本教程,但无法理解在我的例子中,什么是iso曲面以及如何提取它 这是我最初的物体表面吗 编辑1: 到目前为止,我已经完成了重新三角测量: 我似乎在等值面和体素之间找到了正确的截面点,因为似乎有一个正确的体素模型: 但是为什么他们在重新三角测量时遗漏了这么多三角形呢 编辑2: 在调试代码时,我注意到以下几点: 我使用的行进立方体表有指向iso曲面

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

通过谷歌搜索,我发现行进立方体应该是一个合适的算法。我读过很多教程,但iso曲面部分让我感到困惑

我遵循本教程,但无法理解在我的例子中,什么是iso曲面以及如何提取它

这是我最初的物体表面吗

编辑1:

到目前为止,我已经完成了重新三角测量:

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

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

编辑2:

在调试代码时,我注意到以下几点: 我使用的行进立方体表有指向iso曲面切割体素的顶点的指针。这些三胞胎构成了新的三角形。但我注意到,很多时候,表格都说要用顶点(例如)交点(0)-交点(3)-交点(5)构造三角形,但我的交点位于不同的位置


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

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

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

一般来说,“iso某物”线/面是指我们的“某物”是恒定的线/面。让我们想象一幅山的地图——你有一个点代表一座山的顶端,周围有一些圆线——这些线代表恒定的高度,这意味着当你沿着这条线旅行时,你不会改变你在海上的高度

现在,当您从二维移动到三维时,“线”将替换为“曲面”,所有内容都保持不变。让我们拿一个灯泡作为例子,假设灯泡在各个方向上不断地发光,并且知道,你越接近温度升高,那么以灯泡为中心的每个球体将是它的“ISO术语”表面。 只有一个灯泡的例子很简单,但是当你有更多的灯泡时,曲面会变得更有趣,这是使用体素场和Marching Cubes算法的完美例子

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


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

您的输入是来自体素模型的网格,对吗?重新对该网格进行三角剖分的确切含义是什么(与输入网格相比,输出网格应如何改进)?与原始网格相比,输出网格没有改进。我在学校有一个项目,使用体素数据重新对网格进行三角剖分,然后将新的三角剖分与初始的三角剖分进行比较。你可以尝试一个更简单的对象,例如球体,这样你就很容易看到缺少任何三角形的典型立方体。我用了同样的方法,这对我帮助很大。如果您向我们展示代码中呈现的球体的一些屏幕,我可以告诉您有关问题的更多信息。希望有帮助:/根据您上次的编辑,似乎MCs algo本身就有这个问题。有些组合中,MCs无法创建正确的网格。你可以在谷歌上搜索“不明确的情况”,有很多解决方案,但它们相当复杂,更简单的方法是用额外的三角形覆盖潜在的孔,但这样你就破坏了网格的拓扑结构。我还在研究我自己的解决方案。我想当你说行进中的立方体会提取出一个丑陋的表面时,你不是那个意思吧??这应该是一个unicorn:O(我的意思是在我的代码中的某个地方有一个错误),看起来您有什么地方出错了,因为您的多维数据集使用的空间不应该重叠。也许可以试着用一些简单的数据看看你的代码是如何工作的。科伦达:我已经更新了我最初的问题,如果你检查一下,我会非常高兴的!