常见的曲面操作有如下三种,本文将主要对曲面细分和曲面简化进行介绍。
- 曲面细分(Mesh Subdivision)
- 曲面简化(Mesh Simplification)
- 曲面正则化(same triangles)
让每个三角形更像正三角形。
文章目录
1 曲面细分
细分一般都要先加点,然后再调整点的位置。
1.1 Loop细分
Loop细分一般有两步操作:
- 把三角形数量增多。
- 改变三角形位置,让模型看上去更光滑。
1.1.1 Loop细分算法
- 把每个三角形分成4个。
- 根据权重分配新的顶点(新顶点和旧顶点的调整方式不同)。
更新新的顶点的方法 比如按照如下方式更新图中白点,白点是对周围几个面的平均,AB离得比CD近,所以权重大。
更新旧顶点的方法 根据自己原本的位置和自己周围顶点的位置来进行加权平均,如下所示(n是顶点度数)。
1.1.2 Loop细分结果
1.2 Catmull-Clark细分(General Mesh)
Loop细分只能解决三角形网格的细分问题,对于一般的情况可以采用Catmull-Clark细分。
1.2.1 基本概念
非四边形面(Non-quad face):顾名思义。
奇异点(Extraordinary vertex):度数不为4的点。
1.2.2 Catmull-Clark细分算法
1)增加新点
- 取每个面的一个点(比如重心)
- 取每个边的中点
- 将所有新添加的点做连接
- 在一次细分后会引入两个新的奇异点。
- 新奇异点的度数为3,其他奇异点的度数不变。
- 经过一次细分,所有非四边形面会消失。
- 细分之后,每个非四边形面都会变成一个奇异点(以后再细分奇异点和非四边形面都不会发生变化了)。
2)调整规则
对于新增的点,面上的点和边上的点位置更新规则如下:
对于旧的点:
1.2.3 Catmull-Clark细分结果
2 曲面简化
目标:减少三角形的数量并保留整体的形状。
2.1 基本概念
2.1.1 边坍缩(Collapsing An Edge)
2.1.2 二次误差度量(Quadric Error Metrics)
- 它用来表示曲面简化带来的误差的大小。
- 用局部顶点做平均效果是不好的。
- 二次误差:新的点应该使与它相关联的面的平方和达到最小。
2.2 通过二次误差来进行边坍缩
- 假设坍缩每一条边,然后分别得到它们的二次误差。 做为各自的分数。
- 每次都折叠分数最小的边,然后更新被影响边的分数。
- 使用贪心算法就可以得到不错的结果。