如何在网格上合并相邻共面的面?

9

我正在寻找一种方法/算法,可以将三维网格中的多个相邻共面面合并成一个单独的面。我希望这样能够优化我的网格生成程序,因为现在它会生成许多“小”三角形。当我在屏幕上查看最终的三维对象时,我可以看到它们都朝着同一个方向,并且可以用一个更大的三角形替代整个类别!希望我的意思清楚明白。感谢您的帮助。


听起来你正在寻找一个网格简化算法。有很多这样的算法,我头脑中对它们了解不够,无法给出任何建议,但这就是你要搜索的谷歌术语,“网格简化算法”。(注意:我知道你不是想简化整个网格,而是想合并相邻的三角形,但我怀疑这些算法会在处理过程中完成这项工作,你所需要做的就是保持低容差以保留网格中绝大部分的细节。) - hexist
谢谢你的回答 - 但是有很多方法可以简化网格。例如 - 合并(或焊接)在一起的顶点。合并共面面只是我需要的简化的一个部分。此外,我不想通过降低网格的分辨率而改变对象的形状。合并共面面不会这样做。 - Ross Oliver
一个天真的方法是计算每个三角形的法线(取两条边的叉积并将其归一化),并合并具有相同法线(或具有可容忍的小差异)的相邻三角形。你试过了吗? - user824425
是的,我正在编写一些能够实现这个功能的代码。但是我正在努力理解合并过程。也就是说,我需要将哪些顶点折叠成一个,并且如何从面列表中删除其中一个三角形。我还在继续努力。 - Ross Oliver
这也有帮助:https://dev59.com/4GYq5IYBdhLWcg3w5Um8 - meawoppl
显示剩余2条评论
2个回答

2
我建议您将脸投影到一个平面上,然后应用一个算法来进行多边形平面并集polygon union a plane。之后再“反投影”回去,就完成了。尽可能地减少维度。

通常情况下,3D对象的网格显然不是平面的(特别是如果网格是封闭的且对象包含一些手柄),因此没有单一的平面可以投影而不产生自相交。 - Fedor
@Fedor 我认为这个答案中的建议是针对连续的共面面片群体而言的。 - undefined

1

你的任务是网格简化(或减少)的特殊情况,其中算法只允许减少一些网格元素而不会在对象形状中引入任何错误。这里可能最著名的算法是使用二次误差度量进行表面简化

它搜索网格中可以在单个顶点中收缩的边(每个边的位置都自动选择),以便最小化与该收缩相关联的二次误差(在您的情况下,误差为零)。

让我们考虑一个简单的例子,即将立方体面细分为8个三角形:

Mesh simplification

  • 左侧:选择品红色边缘进行收缩,剩余的顶点将位于边缘底部。
  • 中间:在第一次收缩后,选择下一个品红色边缘,在收缩后它将成为立方体角落的一个顶点。
  • 右侧:简化的最终结果(在其他立方体面上进行了收缩之后),其中不再有共面三角形可以合并(至少在更大的三角形中不行)。

上述插图是在MeshInspector应用程序中准备的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接