03 - 曲面处理
曲面处理
曲面细分(Mesh Subdivision)
曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果。
Loop细分
(这里的Loop是人名)这个细分是专门针对三角形面的。
通常过程如下:
生成更多三角形或顶点,如图:
调整这些三角形或顶点的位置,对于新顶点和老顶点分别做对应处理。
对于新生成的顶点,其位置为周围4个顶点位置的权重和:
对于老顶点,做如下处理:
Catmull-Clark细分
更一般的,除了三角形面,还有四边形面需要进行细分:
定义一些概念:
Non-quad face
:非四边形面Extraordinary vertex
:奇异点,度不为4的点
每一次细分时,都要在每个面中添加一个点,在每条边的中点处添加一个点,然后面上的新顶点和边上的新顶点连起来。如下图:
也能知道Catmull-Clark
细分的一些特点:
有几个非四边形面,就会多出几个奇异点。例如上图中,一共有2+2 = 4个。
新多出来的奇异点的度数与原来所在面的边数相等。例如上图中是3度。
第一次细分之后所有面都会变成四边形,且往后奇异点数目不再增加,例如上图再一次细分如下:
与Loop 细分
类似,同样需要去调整新老顶点的位置:
对于新顶点,分为两类,在面上的和在边上的:
对于老顶点,处理如下:
曲面简化(Mesh Simplification)
曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术)。
边坍缩(Edge Collapse)
如上图所示,边坍缩就是将一条边的两个顶点合成为一个顶点。但还要好好考虑坍缩那条边,使得原模型样貌被改变的程度最小。
因此引入二次误差度量(Quadric Error Metrics):
应使得蓝色的点到原来各个平面垂直距离的平方和最小。
引入此度量后,利用边坍缩进行曲面简化的大致过程如下:
- 为每条边”打上分数“,值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差。
- 选取分数最小的边进行坍缩,新顶点位置为二次误差最小的位置。
- 更新其他边的分数
- 重复上述操作。
Ps:这是一个贪心算法,使用“堆/优先队列”较好。
曲面正则化
将三角面都变的尽可能相同,从而也达到提升模型效果的目的。
参考资料
- GAMES101-现代计算机图形学入门
- 计算机图形学十一:曲面细分(subdivision)与曲面简化(Smplication) - 知乎 (zhihu.com)