基于变分法的网格补洞算法
三维网格模型修复一直是计算机辅助几何设计领域中的一个重要领域,关于网格网格补洞算法也看过一些文章,也有很不错的修复效果。最近安排到一个任务关于3D打印模型修复功能,查阅了不少文章,本文主要针对这篇文章进行研究(https://erkaman.github.io/posts/hole_filling.html), 并实现修复功能。
一、一维曲线拟合理论
问题描述:如下有个残缺的图表(可以看成数据点),两边有边界数据,中间缺失一些关键数据,试图以某种方式填补空缺。
用一个函数 f 来表示这个图表的数据,***f(1)***代表第一个数据点,x=1,x=2,x=7,x=8为已知数据点,而x=3,x=4,x=5,x=6是需要求取的点,通过一条曲线修复这个空缺。
关于这个补洞,可能有很多的方式来修复,比如以下两种方式:
认为比较好的修复方式:
认为比较差的修复方式:
辨别好与坏的方式,是看补洞区域与边界区域的连接情况。先看一下x处的一阶导数:
当h的取值等于1时,认为好的修复方式,在x=1,和x=2处的导数:fx(1)=5−2=3,
fx(2)=2.1,而认为比较差的修复方式,对应的导数分别为:fx(1)=5−2=3, fx(2)=0.2fx(2)=0.2。显然第一种方式两个导数的变化率更小,具有二阶连续的特性。因此需要找一个拟合函数***f***,使得导数变化率最小,用次函数修复效果更好。
二、基于变分法的二阶导数能量最小化
假设一般情况,函数连续,期望函数f(x)二阶可导,并且在a到b区间的和最小,即区间内积分最小,使用以下能量方程表示
f(x)最小,同样f(x)的平方最小,这是拟合时常规思想。在此图标中边界为x=2,x=7,a就是2,b就是7。
为了最小化能量,引入变分法常规方法,假设***f***d 最小能量为E(f)。在区间a,b之间添加一个噪音函数u(x),则u(x)必须二阶可导,并且边界处满足u(a)=u(b)=0 and ux(a)=ux(b)=0。同时引入λ作为干扰的幅度,满足 λ=0时能量方程最小。
能量方程表示为:
对λ求导,并进行部分积分法推导,最终为
u为任意函数,要使得等式成立,则必须满足
最终求解如下方程
三、离散化并求解最小方程
综上所述,能量方程为:
对函数f进行求导(h=1)
四阶导数为:
如f(3)处的四阶导数满足以下关系
同样x=4,x=5,x=6也满足,图表的解就相当于求以下方程组:
由于x=1,x=2,x=7,x=8的值已知,则方程组简化为:
则计算结果为:
四、三维网格补洞处理
如下待修复网格模型
先求边界顶点的中心点,并简单修复表面,可以看到模型表面不具有二阶可导。(下图做聊一次上采样的网格细分处理,当细分的点越多,最终拟合的效果越光滑)
在网格曲面上求解 以下方程来拟合曲面:
拉普拉斯-贝尔特拉米算子的推导过程非常复杂,涉及到第一基本公式、切平面张量、黎曼曲面等概念,此处直接给出算子的表达公式:
五、求解补洞方程
归根结底就是求解如下方程
其中H为拉普拉斯-贝尔特拉米算子矩阵,记录网格的拓补、特征信息,V为待求取的点集,即补洞区域的点,h为边界约束点,其值为1,u为边界点本身。通过求解方程组,便得到新的顶点位置:
再对模型进行降采样,恢复原模型的顶点、面片数据,并对补洞网格进行融合处理(融合操作实际上在构造H矩阵之前完成,目的为整个网格拓补连续),最终效果为
本人实现效果(左边为修复前,右边为修复后)