几何处理
几何处理(Geometry Processing):网格细分、网格简化、网格正规化(即不要出现特别尖、长的三角形)
(1)曲面细分(Mesh Subdivision)
以 Loop Subdivision 为例:
第一,分出更多的三角形
第二,让这些三角形的位置发生一点变化,使得我原来的模型变得更光滑。
调整三角形的位置其实就是调整顶点的位置。对于 Loop Subdivision 来说,就是区分新的顶点和老的顶点,新的顶点就是边的中心取的点,要对这两种点分别有不同的规则来改变它们的位置。( Loop Subdivision 和循环没有任何关系,因为发明 Loop 细分的人的 Family Name 就是 Loop )
对这个新的顶点,它必须在一条边上,而且只要这条边表示的不是物体的边界,那它一定被不同的三角形所共享。那么我们把共享的这条边的两个顶点叫做 A、B,把三角形不共享的顶点叫做 C、D。找到这四个点的位置,进行一个加权平均(认为 A 和 B 离得近一点,贡献就大一点):
对旧的顶点,一部分相信周围相邻的顶点,另一部分保留自己的属性。
定义 n 是顶点的度(图论,顶点连接边的数量),u 是与顶点的度有关的一个数。
如果一个顶点连了很多个三角形,比如 20 个三角形,那这个顶点就完全可以由周围 20 个三角形来决定各种各样的信息,来更新它自己,也就是说这个点自己就不太重要了;如果这个点只连了 2 个三角形,那这个顶点就非常重要,如果我要更新的话就要更多地相信它自己。
Loop 细分得到的结果:
对于三种点不同的更新规则:
两种细分方法:
(2)曲面简化(Mesh Simplification)
多细节层次 LOD(Levels of Detail)技术。
介绍一种方法:边坍缩(Edge Collapsing)
如果直接取平均效果不好,我们希望引入一种误差的度量,即二次误差度量,我希望把一个点放在某个位置上可以最小化二次误差。二次误差和机器学习中的 L2 距离非常相似,距离的平方和最小。
对于整个的模型有那么多条边,我都假设如果坍缩这条边,并且我把坍缩后的点放在最佳的位置上,会得到一个多大的二次度量误差。也就是说我先坍缩最小的,再坍缩第二小的,然后坍缩第三小的。
并且我坍缩了一条边后,会影响其他边的二次误差度量。我要做这样一个操作:第一,我要从一堆边中选二次度量误差最小的一个;第二,当我取最小后,我要对它所影响的这些边的二次度量误差做更新。就是说,要有某种数据结构,我要能瞬间取最小值,又要动态的以最小代价去更新受影响的这些元素。即优先队列,或堆。
第二个问题是,我要找的是在全局上这个物体的简化表示,而现在说我不断地在局部做最优解的方式,试图找到全局的最优解,这种方式其实是一个典型的贪心算法,当然这并不是一个能够保证有全局最优性质的做法。为什么人们依然会选择这样的做法呢,其实对于实际的物体来说也很难构造一些超级复杂的场景,使得证明说这个贪心算法找到的最优解与实际的最优解相去甚远的这种特例,所以我们这么做效果挺不错的。