唐伯虎 发表于 2021-7-18 09:47:03

Games101笔记:曲面细分、简化

接下来主要介绍对几何的操作,分为以下三种
· Mesh subdivision(upsampling)
细分,增加三角形数量,将模型的面合理的分成更多小的面,从而增加细节,提升模型精度,提高渲染效果。


   

   
[*]Mesh Simplification (downsampling)

简化,在尽量满足需求(如保证原有形状、外观)的前提下,减少三角形数量,提升性能。


   

   
[*]Mesh Regularization (same #triangles)

正规化,Mesh 的三角形有时有大有小,形状不规则,对渲染会造成不便,我们将三角形变成近似大小的正三角形,即改变三角形质量同时不改变模型的质量。(如下图其实是失败了的,因为牛耳朵那里已经不同)


   

接下来详细介绍~
Mesh Subdivision(曲面细分)
基本上细分算法都分两步~
   
[*]引入更多的顶点/面;
   
[*]调整三角形的位置;



   

Loop Subdivision
以 Loop细分为例,(Loop 是人名)
   
[*]引入三角形:
连接三角形三条边的中点,即将一个三角形分为四个三角形;



   

2. 调整:将三角形区分为旧顶点(即原来就有的三个顶点),和新顶点(即三条边中间的那三个点),然后对新旧顶点分别应用不同规则,调整其位置。
   
[*]新顶点位置的调整:

思路:计算周围的几个旧顶点对其影响的比例,加权平均。
以下图中白点位置的计算为例


   

被两个三角形共享的点记为 A,B,未被共享的点记为C,D,应用如下公式,即得到新的白点的位置:


   

其中可以看出,该公式认为共享的点 A,B对白点影响较大,加权较大。(该点为周围几个点的加权平均)。
   
[*]旧顶点位置的调整:

思路:旧顶点既考虑周围的旧顶点对其影响,也考虑其自身本来的影响。
以下图白点计算为例


   

其中,n 代表白点的 度,即有多少条边经过白点(可以理解为有多少个其他的顶点对其产生影响),u 为一个规定好的数值,公式如下:


   

其中可以看出,当白点的度较小时,白点自身影响大,度较大时,周围的点影响大。
下图为 Loop 细分的结果:


   

Catmull-Clark Subdivision (General Mesh)
Loop 细分只能对三角形进行细分,有局限性。可以使用 Catmull-Clark Subdivision。
该细分的几个定义:
   
[*]奇异点(Extraordinary vertex):
度不为 4 的点;
   
[*]Non-quad face:
非 4 边形的面;

思路:
   
[*]引入更多的面:取每一条边的中点,每一个面的中点,再将边上的中点和面上的中点连接。



   

如上图,取边上的中点(红色),与面上的中点(黑色),连接起来即将其分成了更小的面。
2. 调整
也是将点分为新老点分别调整,但是新点又分为在面上的点,和在边上的点,如下图


          新点的调整(左为面,右为边)               旧点的调整   

以上各个系数也为该算法认为的权重。
性质:由细分过程可知
   
[*]在非四边形面内点的点,其必是奇异点(因为要与每条边相连,而边数又不是四);
   
[*]一次细分后,所有非四边形面都消失了;
   
[*]后续的细分,奇异点数不会继续增加;

下图为 Catmull-Clark 细分的结果


   

Mesh Simplification(曲面简化)


   

介绍其中的一种方法:
Edge collapsing(边坍缩)
将一条边的两个顶点“捏”成一个顶点


          如上图,三个顶点,捏成了一个   

但是哪些边是重要的,不能捏起来,哪些边不重要,可以捏起来呢?
如果通过周围的点的平均来算,会产生如下图效果(黑色为原来的点,蓝色为简化后的点,蓝色三角形为简化后的样子)


   

可以看到,新生成的面(蓝色),比原本的样子(灰色)要小很多,不够好。
Quadric Error Metrics(⼆次误差度量)
找一个最优的点,使得该点到原来的边(面)的距离的平方和最小


   

思路:
   
[*]可以使用贪心算法,每次坍缩都找距离最小的点;
   
[*]每次坍缩后,都会导致原先距离改变,因此需要重新找到距离最小的;

由以上两点可知,我们应该使用的结构为:优先队列(堆)


      

                                                      往期精选
                              Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着

                     Unity3D 经验者转到 UE4 的经验
                     喵的Unity游戏开发之路 - 从入门到精通的学习线路和全教程

                                    

             声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

作者:所以然
原文:https://zhuanlan.zhihu.com/p/382074891


More:【微信公众号】 u3dnotes






本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

文档来源:开源中国社区https://my.oschina.net/u/4589456/blog/5128010
页: [1]
查看完整版本: Games101笔记:曲面细分、简化