计算机图形学GAMES101(十一)几何(网格处理)
本文最后更新于 2024年5月26日 下午
本节涉及内容:
- 网格细分(Mesh subdivision)
- 网格简化(Mesh simplification)
- 网格规则化(Mesh regularization)
曲面细分
曲面细分可以使模型的细节更加丰富。
曲面细分的规则:
- 首先创建更多的三角形(顶点)
- 其次,调整它们的位置
Loop Subdivision
Loop细分是一种三角形网格的细分法则,它按照下图三角形分裂,每条边计算生成一个新的顶点,同时每个更新新顶点/原始顶点的位置
怎么改变新顶点的位置
其中白色的顶点是会被两个三角形所共享,将共享顶点所在的这条公共边两端的两个公共顶点分别定义为A、B,然后把这两个三角形非公共的两个顶点分别定义为C、D。
因为A、B顶点离白点交近所以影响较大,C、D顶点离白点交远所以影响较小。所以新顶点的位置=3/8*(A+B)+1/8*(C+D)。(加权平均)
怎么改变旧顶点的位置
对于一个老顶点(中间的白色顶点),它周围的老顶点会对其位置产生影响。那么就需要综合考虑周围老顶点的位置信息和该顶点自身的位置信息。
n表示顶点的度(连接的边的数量)
u代表比率系数
老顶点的位置=(1 - n*u) * original_position + u * neighbor_position_sum
通过这个公式可以发现n当越大时,代表连接的三角形越多那么自身的位置影响就很小,基本就可以由周围的顶点决定位置。
反之,n当越小时,代表连接的三角形越少那么周围顶点影响就很小,基本就可以由老顶点自身位置决定。
Catmull-Clark Subdivision (General Mesh)
当模型不是由三角形组成时采用Catmull-Clark细分。
Catmull-Clark细分步骤:
在每个面添加中心点
在每条边添加中点
连接所有的新顶点
可以发现中间的两个点都是奇异点,因为这个点是在三角形内的,因为它要于三角形三边都要连接,所以它的度一定不是4
经过了这次细分所以的非四边形面都没有了,也就是说经过细分后一个四边形面会增加一个奇异点,并且四边形面会消失。
而且在这个基础上再次细分,奇异点不会增加了
怎么调整顶点的位置
Catmull-Clark细分将顶点分成三类:
1、顶点在面中间(Face point)
2、顶点在边的中心点(Edge point)
3、以前老的顶点(Vertex point)
Loop细分和Catmull-Clark细分对比:
曲面简化
在一个很复杂的模型的基础上进行简化(删除一部分三角形)使其保留原始轮廓,达到节省资源的目的。
边坍缩(edge collapsing)
方法:首先找到一条边的两个顶点然后将这个两个顶点合拢成一个点。
⼆次误差度量(Quadric Error Metrics)
二次误差度量可以找到哪些边应该被坍缩,哪些应该被保留
二次误差度量的概念:
希望找到一个位置,使得这个点和它相关联的面的距离的平方和最小。
怎么去坍缩?
对于整个模型,首先去坍缩每一条边,然后计算二次误差度量。然后将二次误差度量的值升序排列,进行边坍缩时只需要从最小的开始坍缩,并且因为坍缩之后其他边也会受到牵连,所以又要再次计算二次误差度量,然后再取最小的进行坍缩。
曲面规则化
原模型的三角形是不规则的,网格规则化就是把三角形变成正三角形。