平滑(smooth)

3D平滑处理是一种减少锯齿(阶梯状线条)的技术。 平滑处理可设置为有利于提高系统性能或改进图象质量。(功能可以查看3Dmax
blender等等)
网格平滑属于数字几何处理领域的问题,计算机图形学和计算机辅助设计中,用多边形网格可以表示复杂的三维实体。随着三维扫描和曲面重建技术的发展,得到这些实体表面的多边形网格表示已经不是难事,但所得到的表面往往包含含噪声。在形状设计领域,在散乱点拟合和光滑形伏、纹理映射等应用领域,都有对平滑曲面的极大需求。故产生了网格平滑这一个研究点。

如下图:
处理前

处理后

平滑的算法多数是基于伞状结构的操作,所谓伞状结构,是以三角网格中某一个顶点P为中心,取所有与其相邻的顶点P1…Pn-1和边组成的一阶邻域结构,当然 为了方便于在O(1)的时间内获取点P的相邻点与相邻面,故需要提供辅助结构来存储这些邻接点面的信息(自定义)。如下图所示:
mesh拓扑结构

常用的平滑算法:拉普拉斯平滑、 基于曲率的平滑 基于曲率的平滑与拉普拉斯平滑的区别在于,基于曲率的平滑是沿着顶点P的法向量所在直线去移动P的,一般的拉普拉斯平滑会讲点P移动到类似于重心的位置,而基于曲率的平滑的移动位置是与法向量方向相反的,这样做的目的是要更好的保持模型原来的大致形状。

拉普拉斯平滑(Laplacian Smooth):

最基础的平滑,其他的平滑都是在拉普拉斯的基础上改进的。 最为基础的拉普拉斯平滑算法的实现,简单的拉普拉斯平滑算法的原理是将每个顶点都移动到相邻顶点的平均位置,即采用所谓伞状算子。

在这里插入图片描述在这里插入图片描述

1. 初始化Mesh的邻接点结构集
2. 新建临时点集,用来存储点平滑后的位置
3. 对所有Mesh中的顶点P
    1. 初始化临时向量为零向量
    2. 获取P的邻域点集Adj(P)
    3. 对所有领域点T,将其位置加到临时向量里
    4. 临时向量/=领域点集数
    5. 将临时向量的位置存入临时点集
4. 对所有Mesh中的顶点P
    1. 将P的位置修改为临时点集中对应点的位置

stepSmoothNum 整个算法(法线平滑+顶点拟合)的迭代次数。
Boundary 一维边界平滑 仅自身平滑边界边(例如,形成网格边界的多段线独立平滑)。这可以减少边界上的收缩,但会对非常小的边界产生奇怪的影响。
cotangentWeight 使用余切加权方案求位置的平均值。否则使用更简单的伞形方案(如果存在边,则为1)。

拉普拉斯平滑算法有很多进一步的变形,首先在求取平均位置时,可以采用不同的加权策略,例如对不同的邻接点采用不同的权值。一般来说,距离中心点P较远的邻接点,我们可以让他对P平滑后的位置影响小一点。这样就可以采用一种距离的倒数为权值的拉普拉斯平滑。
在这里插入图片描述

有时为了控制平滑的速率,也会引入参数lambda来控制平滑的速率,即从原来所执行的:
在这里插入图片描述
转变成 在这里插入图片描述
同时,平滑算法往往可以反复对Mesh执行,使得Mesh越来越光顺,迭代次数T也是平滑算法中重要的参数。

缺点:
拉普拉斯平滑虽然能够让Mesh的表面光顺,但迭代次数一旦多了(使用使用的迭代次数一般不超过10),就会使得模型整体发生收缩现象。
在这里插入图片描述

基于曲率的平滑:

基于曲率的平滑与拉普拉斯平滑的区别在于,基于曲率的平滑是沿着顶点P的法向量所在直线去移动P的,从下图可以看出,一般的拉普拉斯平滑会讲点P移动到类似于重心的位置,而基于曲率的平滑的移动位置是与法向量方向相反的,这样做的目的是要更好的保持模型原来的大致形状
在这里插入图片描述

通过适当的选择拉普拉斯平滑中的权值ω,我们可以让基于曲率的平滑与拉普拉斯平滑达到算法上的统一。经过推导可知ω选择如下值的时候,即等价于将P如上图2中进行移动。
在这里插入图片描述

其中α和β的是P与其第i个邻接点Pi所构成边所对的两个角,(这里假设网格为流形,即每条边都只有至多两个三角形共有),下图显示了这两个角的位置:
在这里插入图片描述

这样点P的位置仍然由如下公式来决定,只是修改了权值计算方式:
在这里插入图片描述

在这里插入图片描述

单地说顶点法线就是把共享该顶点的几个面的法线想加,然后除以面的数量,得到的平均值法线,这就是顶点法线。
顶点光照强度在整个面上是均匀过度的.而如果直接使用面法线计算光照,整个面都是用的同一个法线,所以整个面的光照强度是一样的;

面法线: 垂直一个平面的直线叫面法线;顶点法线: 每一个顶点都有法向量,就能知道光线到达物体表面的入射角;
顶点法线与面法线
面法线与顶点法线区别

优点:
包括3Dmax等等都是那本用的这个 比较实用好用!

Taubin平滑算法(Taubin Smooth):

        关于lambda mu值的几个注意事项lambda是λ ,mu是μ
        Taubin平滑的原理基于了一部分数字信号处理方面的知识,用简单的话来表述, 就是使用一个负收缩因子μ将拉普拉斯平滑照成的收缩再放大回去( 防止过分的出现变形失真),  其算法的主体采用了2个与拉普拉斯平滑算法相似的过程,一个过程采用正因子λ(0~1),  另一个过程采用负因子μ(-1~0),每一次迭代都必须重复这两个过程
        我们假设0<λ,并且μ是一个负比例因子,使得μ<-λ。
        保持μ+λ<0(例如绝对值mu更大)
        让kpb为通带频率,taubin说:
        kpb=1/λ+1/μ>0
        kpb值在0.010.1之间,与原文献相比,结果良好。
        kpb*μ-μ/λ=1
        μ=1/(kpb-1/λ)
        所以如果
        *λ==0.5,kpb==0.1->mu=1/0.1-2=-0.526
        *λ==0.5,kpb==0.01->mu=1/0.01-2=-0.502
即有:

在这里插入图片描述

HC拉普拉斯平滑(HC Laplacian Smooth):

HCLaplacian平滑是一种对拉普拉斯平滑的改进方法,其针对的问题也是拉普拉斯算法产生的模型整体收缩问题,与Taubin算法不同,其不再是从信号处理的角度去看待拉普拉斯算法所引入的系统误差,HCLaplacian算法试图将拉普拉斯算法对顶点的移动以某种程度再移动回去,移动的具体原则需要参考顶点原先的位置
一种拉普拉斯平滑的改进;
缺点:
与拉普拉斯挺接近会破坏模型拓扑结构不实用!

ScaleDependent Laplacian Smooth:

两个差不多都是基于拉普拉斯不过都可以不要!
缺点:
在大模型下不太友好;

两步平滑(TwoStep Smooth):

分两步相对于平滑面的法线/基于曲率的平滑,先平滑法线,然后再移动顶点,当然这个过程不会增加或者删除face与vertex,将相似的法线平均在一起。顶点重定位,将顶点移动到适合新法线的位置。
缺点:
可能会破坏模型的拓扑结构,不实用!

深度平滑(Depth Smooth):

是一种拉普拉斯平滑,与两步平滑有点相似都是先改变法线然后是顶点的位置,它被约束为只在一个给定方向(通常是观察者方向)移动顶点,整个算法(法线平滑+顶点拟合)的迭代次数,
优点:
比两步平滑实用!

平滑处理大牛布朗大学Gabriel Taubin教授简介:

Taubin教授目前就职于布朗大学计算机工程系。他在阿根廷布宜诺斯艾利斯大学获得了数学学士学位,并在布朗大学获得了计算机工程博士学位。1990年他加入IBM研究院,担任主任研究员。2003年,他加入布朗大学成为教授。由于他在三维几何数据压缩技术和多媒体标准方面的贡献,被IEEE选为院士。他也曾经在加州理工大学、麻省理工学院等大学担任客座教授。
从2010年到2013年,Taubin教授担任《IEEE计算机图形与应用杂志》的主编,同时担任《IEEE可视化与计算机图形学报》的副主编以及《几何模型》杂志的编委会成员。
Taubin教授的研究方向包括:应用计算几何、计算机图形学、几何建模、三维影像学、计算机视觉等

1995年tubin平滑算法

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐