网格结构的网格简化

时间:2014-01-27 15:05:17

标签: opengl 3d mesh simplification

我正在开发一款3D建筑应用。建筑物在3D网格上完成(如Rubik的立方体),网格的每个单元格都是实心立方体或45度斜率。为了说明,这是我从谷歌图像中删除的倒角立方体的图片:

enter image description here

忽略右侧的图像,焦点是左侧的图像。目前,在构建阶段,我将每个单元格的每个面分别绘制。但是,当涉及到导出它时,我想简化它。所以在上面的立方体中,我希望上下左右前后面由每个单个四边形(两个三角形)组成,边缘将从两个四边形减少到单个四边形。 / p>

我最近尝试做的事情如下:

从所有方向逐层迭代形状,并为每个图层找出一个很好的简化(删除重叠边以创建单个多边形,然后拆分多边形以避免空洞,使用耳剪裁来进行三角测量)。

明确过于复杂的事情(至少我希望我是)。如果我有一个顶点,法线和索引列表(目前有很多重复的顶点),是否有一些简洁的方法可以简化?限制是指数不能在面之间共享(因为我需要指向不同方向的法线),否则我不介意它是不是最快或最优的解决方案,我宁愿它很容易实现并保持。

编辑:为了进一步澄清,我已经执行了隐藏的脸部移除,这不是问题。其次,最重要的是质量不会降低,只能简化面部本身(我需要保留锋利的边缘)。

3 个答案:

答案 0 :(得分:0)

感谢Roger Rowland的精彩提示!如果其他人偶然发现了这个问题,这里是我所做的简短摘要:

要解决的第一件事:确保您尝试简化的网格是一个多重网格!这是遍历halfedge数据结构的要求。我遇到问题的一个例子是重叠的四边形和三角形;我最初决定将四边形分开,而不是将它们分成三角形,因为它更容易,但是这会导致边缘破坏半边网格。

一旦网格是流形的,就从顶点和面创建一个半边网格。

完成后,对网格进行抽取。我是通过边缘折叠来做的,通过正常偏差确定哪些边缘会折叠(在我的情况下,如果折叠的结果面具有不等于其原始值的法线,则不执行折叠)

我最初是通过自己的实现完成的,但是我开始遇到令人沮丧的错误,因此选择使用OpenMesh(它很容易上手)。

还有一个问题我尚未解决:如果有两个立方体彼此对角,触摸,结果是一个边缘有四个面连接到它:一个复杂的边缘!我怀疑迭代边缘检查连接的面数是多么微不足道,然后通过复制适当的顶点来解析。但话虽如此,我不打算花时间修理,除非它后来成为一个关键问题。

答案 1 :(得分:0)

我给出一个理论上的答案。

对于左图,找到所有具有相同法线(相同的x,y,z坐标)的“边共享三角形”(由于矢量正比例缩放方向的影响而使其成为法线)。合并它们。然后以最大纵横比对其进行三角剖分,即可提供所需的解决方案。

我现在提出另一种简化网格的简便方法。 取 NORMALS 并除以大小(坐标平方和的根),得出单位法向矢量。并取相邻的三角形,并在它们之间取 DOT PRODUCT (分别乘以x,y,z坐标并相加)。它给出这些法线或三角形之间的角度的 COSINE 值。取一个范围(如0.99-1),并考虑参考三角形并考虑合并该范围内的所有相邻三角形,然后重新进行三角形划分。我们绝对可以忽略一些怪异方向上面积较小的三角形。

还有另一个建议可以简化网格划分,如左图或建筑物图中所示。定义预定义的面数(此处6 + 8 = 14)表示法线的值,并根据接近这些面的方向(按点积)对所有面进行分类,然后合并并重新划分三角形。

答案 2 :(得分:-1)

Google“网格简化”。你会发现这个问题是一个巨大的问题并且经过深入的研究。看看这些介绍性资源:link(第11页启动好东西)和link。 CGAL也有一个很好的讨论:link

一旦熟悉这些问题,您就可以做出一些将简化应用于问题的决定。简化有多快?准确性有多重要? (迭代顶点聚类是一种快速而肮脏的方法,但其结果可能是任意丑陋的。)你能依靠第三方库吗? (即CGAL?GTS不再显示活动,但还有其他活动。)