关于带属性的QEM边折叠算法的一些总结
关于带属性的QEM边折叠算法的一些总结,属性主要总结的是纹理坐标这个会产生接缝的属性,如果有总结的存在误区的地方请务必告诉我,谢谢!

【涉及到的论文】
1. Surface Simplification Using Quadric Error Metrics (Michael Garland and Paul S. Heckbert, 1997)
2. Simplifying Surfaces with Color and Texture using Quadric Error Metrics(Michael Garland and Paul S. Heckbert, 1998)
【动机】
以前只了解过只涉及几何属性的版本(上面第一篇),也注意到blender里面的精简修改器(边塌陷)可以在简化的同时一定程度保持uv坐标,法线,甚至蒙皮,正好最近想做的内容里面涉及到网格简化的部分,就想看看如何在QEM简化几何属性的同时还可以保持其他属性。
【一些总结】
不带属性的QEM边折叠算法可以处理顶点的几何属性xyz, 带属性的QEM理论上可以处理带uv坐标的广义顶点坐标xyzuv, 带顶点颜色的广义顶点坐标xyzrgb, 以及带顶点法线的广义顶点坐标xyzabc以及他们的组合。
由于带属性的QEM本质上是对广义顶点坐标的权衡,比如,对xyz优化可以得到纯几何的简化,而对xyzuv优化得到的是几何和纹理坐标的折衷,所以得到的结果并不能保证几何质量。如使用xyzuvabc(几何+顶点纹理坐标+顶点法线)将导致几何质量显著下降。
由于第二点,感觉一些现象得到了解答。如pymeshlab中(经过查看源码了解到他使用的是vcg库中的简化算法)只提供了关于QEM边折叠算法的几何版本以及带纹理坐标版本,而不是提供一个广义顶点坐标的版本。如blender中,似乎边塌陷精简修改器并不直接使用QEM进行顶点法线的优化,而是在简化后进行法线的计算。看起来他们都避免让广义顶点坐标过长,看起来只有xyzuv这一个组合得到了广泛的应用。
在原论文中,只给出了关于顶点属性(也就是,属性和顶点一一对应)的QEM算法的解释,而在实际中一个顶点往往会有多个属性(如uv接缝处),这使得简化算法需要考虑接缝(或者说,基于三角形的属性)而不是简单的顶点属性。
在blender和pymeshlab中,直接简化带有uv接缝的模型会导致uv接缝的偏移,在显示上产生比较明显的失真。而在一些其他论文方案中,对限制或阻止uv接缝处的边的塌陷——在接缝处会限制,使得边塌陷后还在接缝上;在接缝的根部会阻止,以防模型中多个接缝(或者说,模型的多个uv岛屿)的连接位置发生移动。
对于第五点,虽然其他论文方案中的限制和阻止方式会产生更还原的显示效果,但是限制了正常的QEM执行,也许这是他没有成为主流方案的原因。似乎blender和pymeshlab中的简化是主流方案,他们专注于几何简化并尽可能保护属性,虽然简化程度越高,接缝处的失真越明显,但是他们没有破坏正常的QEM,从而得到了稳健的算法。而专注于保护uv接缝的方法似乎在简化程度适中的情况下得到的结果还可以,但是在简化程度非常高的时候,uv接缝的维持会成为简化的阻碍,造成算法的不稳定,产生很低的几何质量。如果把他们的uv接缝维持看作一个约束的话,看起来这个约束实在太硬了。
主流方案中未照搬原论文(上面第二篇)中的理论,而仅仅是受改论文的启发的算法。对于每个顶点,该算法储存了1个几何QEM矩阵(xyz, 若写成齐次矩阵是4x4矩阵)和多个考虑贴图的QEM矩阵(xyzuv, 齐次矩阵是6x6矩阵)。似乎考虑贴图的QEM矩阵部分用于实际折叠(分为直接计算优化后的xyzuv向量,以及附带几何约束的版本,也就是给定xyz只计算优化后的uv部分),每个顶点储存的几何QEM矩阵看起来比较深奥,他似乎在接缝根部处顶点被折叠的时候附加额外的二次误差,源码中的注解是“这允许模拟具有多个纹理坐标的顶点中不存在的连续性,然而这种连续性仍然是不存在的,所以即便是算法用这种权宜之计进行了很好的折叠,显然也计算出了不理想的折叠代价,这应该通过额外的用户参数权重进行调整“,不太能理解,不知道实际情况下没有这个部分会怎么样。
【结语】
接缝问题好麻烦,我还是在简化过程中先不考虑接缝问题比较好。完美解决接缝问题最好的方法估计还是重新烘焙新的贴图。