图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

图形学笔记(九)几何 ——几何表示方法(CSG、距离函数、水平集 、点云、网格(obj格式))、贝塞尔曲线(面)

常见的曲面操作有如下三种,本文将主要对曲面细分和曲面简化进行介绍。

  • 曲面细分(Mesh Subdivision)
  • 曲面简化(Mesh Simplification)
  • 曲面正则化(same triangles)
    让每个三角形更像正三角形。
    图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

文章目录

1 曲面细分

细分一般都要先加点,然后再调整点的位置。

1.1 Loop细分

Loop细分一般有两步操作:

  1. 把三角形数量增多。
  2. 改变三角形位置,让模型看上去更光滑。

1.1.1 Loop细分算法

  1. 把每个三角形分成4个。图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
  2. 根据权重分配新的顶点(新顶点和旧顶点的调整方式不同)。

更新新的顶点的方法 比如按照如下方式更新图中白点,白点是对周围几个面的平均,AB离得比CD近,所以权重大。
图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
更新旧顶点的方法 根据自己原本的位置和自己周围顶点的位置来进行加权平均,如下所示(n是顶点度数)。

图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

1.1.2 Loop细分结果

图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

1.2 Catmull-Clark细分(General Mesh)

Loop细分只能解决三角形网格的细分问题,对于一般的情况可以采用Catmull-Clark细分。

1.2.1 基本概念

非四边形面(Non-quad face):顾名思义。
奇异点(Extraordinary vertex):度数不为4的点。
图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

1.2.2 Catmull-Clark细分算法

1)增加新点

  • 取每个面的一个点(比如重心)
  • 取每个边的中点
  • 将所有新添加的点做连接
    图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
  • 在一次细分后会引入两个新的奇异点。
  • 新奇异点的度数为3,其他奇异点的度数不变。
  • 经过一次细分,所有非四边形面会消失。
  • 细分之后,每个非四边形面都会变成一个奇异点(以后再细分奇异点和非四边形面都不会发生变化了)。

2)调整规则

对于新增的点,面上的点和边上的点位置更新规则如下:
图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
对于旧的点
图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

1.2.3 Catmull-Clark细分结果

图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

2 曲面简化

目标:减少三角形的数量并保留整体的形状。

图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

2.1 基本概念

2.1.1 边坍缩(Collapsing An Edge)

图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

2.1.2 二次误差度量(Quadric Error Metrics)

  • 它用来表示曲面简化带来的误差的大小。
  • 用局部顶点做平均效果是不好的。
  • 二次误差:新的点应该使与它相关联的面的平方和达到最小。
    图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

2.2 通过二次误差来进行边坍缩

  • 假设坍缩每一条边,然后分别得到它们的二次误差。 做为各自的分数。
  • 每次都折叠分数最小的边,然后更新被影响边的分数。
  • 使用贪心算法就可以得到不错的结果。
    图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化
上一篇:构建素数表


下一篇:Event Loop