03 - 曲面处理

曲面处理

曲面细分(Mesh Subdivision)

曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果。

Loop细分

(这里的Loop是人名)这个细分是专门针对三角形面的。

通常过程如下:

  1. 生成更多三角形或顶点,如图:

  2. 调整这些三角形或顶点的位置,对于新顶点和老顶点分别做对应处理。

    对于新生成的顶点,其位置为周围4个顶点位置的权重和:

    对于老顶点,做如下处理:

Catmull-Clark细分

更一般的,除了三角形面,还有四边形面需要进行细分:

定义一些概念:

  • Non-quad face:非四边形面
  • Extraordinary vertex:奇异点,度不为4的点

每一次细分时,都要在每个面中添加一个点,在每条边的中点处添加一个点,然后面上的新顶点和边上的新顶点连起来。如下图:

也能知道Catmull-Clark细分的一些特点:

  • 有几个非四边形面,就会多出几个奇异点。例如上图中,一共有2+2 = 4个。

  • 新多出来的奇异点的度数与原来所在面的边数相等。例如上图中是3度。

  • 第一次细分之后所有面都会变成四边形,且往后奇异点数目不再增加,例如上图再一次细分如下:

Loop 细分类似,同样需要去调整新老顶点的位置:

  • 对于新顶点,分为两类,在面上的和在边上的:

  • 对于老顶点,处理如下:

曲面简化(Mesh Simplification)

曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术)。

边坍缩(Edge Collapse)

如上图所示,边坍缩就是将一条边的两个顶点合成为一个顶点。但还要好好考虑坍缩那条边,使得原模型样貌被改变的程度最小。

因此引入二次误差度量(Quadric Error Metrics):

应使得蓝色的点到原来各个平面垂直距离的平方和最小。

引入此度量后,利用边坍缩进行曲面简化的大致过程如下:

  1. 为每条边”打上分数“,值为坍缩这条边之后,代替两个老顶点的新顶点所能得到的最小二次误差。
  2. 选取分数最小的边进行坍缩,新顶点位置为二次误差最小的位置。
  3. 更新其他边的分数
  4. 重复上述操作。

Ps:这是一个贪心算法,使用“堆/优先队列”较好。

曲面正则化

将三角面都变的尽可能相同,从而也达到提升模型效果的目的。

参考资料

  • GAMES101-现代计算机图形学入门
  • 计算机图形学十一:曲面细分(subdivision)与曲面简化(Smplication) - 知乎 (zhihu.com)