评论

收藏

Games101笔记:曲面细分、简化

游戏开发 游戏开发 发布于:2021-07-18 09:47 | 阅读数:462 | 评论:0

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


    DSC0000.jpg   

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


    DSC0001.jpg   

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


    DSC0002.jpg   

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


    DSC0003.jpg   

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


    DSC0004.jpg   

2. 调整:将三角形区分为旧顶点(即原来就有的三个顶点),和新顶点(即三条边中间的那三个点),然后对新旧顶点分别应用不同规则,调整其位置。
       
  • 新顶点位置的调整:
      
  思路:计算周围的几个旧顶点对其影响的比例,加权平均。
以下图中白点位置的计算为例


    DSC0005.jpg   

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


    DSC0006.jpg   

其中可以看出,该公式认为共享的点 A,B对白点影响较大,加权较大。(该点为周围几个点的加权平均)。
       
  • 旧顶点位置的调整:
      
  思路:旧顶点既考虑周围的旧顶点对其影响,也考虑其自身本来的影响。
以下图白点计算为例


    DSC0007.jpg   

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


    DSC0008.jpg   

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


    DSC0009.jpg   

  Catmull-Clark Subdivision (General Mesh)
  Loop 细分只能对三角形进行细分,有局限性。可以使用 Catmull-Clark Subdivision。
该细分的几个定义
       
  • 奇异点(Extraordinary vertex):
    度不为 4 的点;
       
  • Non-quad face:
    非 4 边形的面;
      
  思路:
       
  • 引入更多的面:取每一条边的中点,每一个面的中点,再将边上的中点和面上的中点连接。
      


    DSC00010.jpg   

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


    DSC00011.jpg        新点的调整(左为面,右为边)          DSC00012.jpg        旧点的调整     

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


    DSC00013.jpg   

  Mesh Simplification(曲面简化)


    DSC00014.jpg   

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


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

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


    DSC00016.jpg   

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


    DSC00017.jpg   

思路:
       
  • 可以使用贪心算法,每次坍缩都找距离最小的点;
       
  • 每次坍缩后,都会导致原先距离改变,因此需要重新找到距离最小的;
      
  由以上两点可知,我们应该使用的结构为:优先队列(堆)


    DSC00018.jpg    


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

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

                                    

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

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


  More:【微信公众号】 u3dnotes

DSC00019.png





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


关注下面的标签,发现更多相似文章