Opengl 网格状结构的网格简化

Opengl 网格状结构的网格简化,opengl,3d,mesh,simplification,Opengl,3d,Mesh,Simplification,我正在开发一个3D建筑应用程序。建筑是在三维网格(如魔方)上完成的,网格的每个单元要么是实心立方体,要么是45度的坡度。为了说明这一点,这里有一张我从谷歌图片中提取的倒角立方体的图片: 忽略右侧的图像,焦点是左侧的图像。目前,在构建阶段,我分别绘制了每个单元的每个面。但是,当涉及到导出它时,我想简化它。在上面的立方体中,我希望上下左右的正面由单个四边形(两个三角形)组成,边从两个四边形减少到单个四边形 我最近一直试图做的是: 从各个方向逐层迭代形状,并为每个层找出一个良好的简化(删除重叠边以创

我正在开发一个3D建筑应用程序。建筑是在三维网格(如魔方)上完成的,网格的每个单元要么是实心立方体,要么是45度的坡度。为了说明这一点,这里有一张我从谷歌图片中提取的倒角立方体的图片:

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

我最近一直试图做的是:

从各个方向逐层迭代形状,并为每个层找出一个良好的简化(删除重叠边以创建单个多边形,然后分割多边形以避免出现孔洞,使用耳剪裁进行三角化)

我显然把事情复杂化了(至少我希望是这样)。如果我有一个顶点、法线和索引的列表(目前有很多重复的顶点),有没有一些简洁的方法来简化?限制是索引不能在面之间共享(因为我需要法线指向不同的方向),但是如果它不是最快或最优化的解决方案,我不介意,我宁愿它易于实现和维护

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

谷歌“网格简化”。你会发现,这个问题是一个巨大的问题,并且得到了大量的研究。看看这些介绍性资源:(第11页开始介绍好东西)和。CGAL也进行了很好的讨论:


一旦熟悉了这些问题,您将有一些将简化应用于问题的决策。简化的速度应该有多快?准确性有多重要?(迭代顶点聚类是一种快速而肮脏的方法,但其结果可能会非常丑陋。)你能依赖第三方库吗?(即CGAL?不再显示为活动状态,但还有其他活动)。

感谢Roger Rowland提供的精彩提示!如果有人偶然发现这个问题,下面是我所做工作的简短总结:

首先要解决的问题是:确保要简化的网格是流形网格!这是遍历半边数据结构的要求。有一个例子,我有问题,这是重叠的四边形和三角形;我最初决定只保留四边形,而不是将它们分割成三角形,因为这样更容易,但这会导致边破坏半边网格

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

完成此操作后,销毁网格。我是通过边折叠来实现的,通过法线偏差确定要折叠的边(在我的例子中,如果折叠产生的面法线不等于其原始值,则不会执行折叠)

起初我是通过自己的实现实现的,但我开始遇到令人沮丧的bug,因此选择使用OpenMesh来代替它(这很容易入门)


还有一个问题我还没有解决:如果有两个立方体彼此对角接触,结果就是一条有四个面连接的边:一条复杂的边!我怀疑在边上迭代检查连接的面的数量,然后通过复制适当的顶点进行解析是很简单的。但话虽如此,我不会花时间去解决这个问题,除非它以后成为一个关键问题。

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

对于左图,找到具有相同法线(相同的x、y、z坐标)的所有“边共享三角形”(由于向量的正缩放方向不受影响,因此将其设置为单位法线)。合并它们。然后用最大纵横比对其进行三角剖分,将给出您想要的解决方案

另一种简单可行的网格简化方法是我现在提出的。 取法线并除以幅值(坐标平方和的根),得到单位法向量。取附加三角形,并在它们之间取点积(x,y,z坐标相乘并相加)。它给出了这些法线或三角形之间的角度的余弦值。取一个范围(比如0.99—1),并考虑这个范围内的所有相邻三角形相对于参照三角形并合并它们并重新三角剖分。我们完全可以忽略一些面积较小的奇怪方向的三角形


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

您应该首先关注删除隐藏面的问题?它已经有10年历史了,但仍然非常有用。还有一个可能会有帮助。Ratchet-删除隐藏面后,我现在没有任何面之间的共享顶点@罗杰-这张报纸看起来很棒!我将研究它。至于OpenMesh,我会调查的。我在尝试Blender的抽取工具时取得了一些成功,尽管它需要大量的手动调整来简化它,而不消耗任何“重要”顶点。许多方法过于随意简化,没有用处。