三维网格补洞算法(Radial Basis Function)

  在逆向工程中,因为设备或模型的缘由,咱们获取获得的三维模型数据每每并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会形成影响。下面介绍一种基于径向基函数(RBF:Radial Basis Function)的三角网格补洞方法。node

Step 1:检测孔洞边界网络

  三角网格是由一系列顶点(V)以及由这些顶点所构成的三角面片(F)所组成,由三角面片能够获得网格的边(E)。一般一条边链接两个三角面片,这种边称为网格内部边,而若是某条边仅链接一个三角面片,那么称这条边为网格边界边,全部的边界边按顺序链接以后就造成了网格的孔洞。ide

Step 2:初始化网格函数

  为了使孔洞填充简单、健壮,能够采用最小角度法进行网格修补,具体步骤以下:优化

  (1)获得孔洞边界点信息,计算边界边长度的平均值lspa

  (2)计算每一个边界点的两条相邻边的夹角大小。code

  (3)找出具备最小夹角的边界点,计算它的两个相邻边界点的距离s,判断s < 2×l是否成立:若成立,则按下图所示增长一个三角形,若不成立则增长两个三角形。orm

  (4)更新边界点信息。blog

  (5)判断孔洞是否修补完整,若未完整,转(2),不然结束。ci

Step 3:最小二乘网格

  初始化补洞获得的网格质量不是很好,咱们须要优化网格顶点的位置,优化的条件是:

其中di为顶点vi的1环邻域顶点数。

  上式能够用一个线性方程组来描述:LV = 0,其中L是Laplace矩阵,具体形式为,矩阵L的秩等于n – k,n为网格顶点的数目,k为网格连通区域的个数,若是网格是全连通的,那么矩阵L的秩是n – 1。所以若是咱们要使方程有解,须要加入m(m ≥ k)个控制顶点坐标vs做为方程的边界条件,在实际中咱们将初始化网格的边界顶点做为控制顶点。

  其实上述线性方程组的求解等价于以下能量函数最小化的求解:

  能量函数的第一部分是使得网格顶点尽可能光滑,即每一个顶点位于其1环邻域顶点的中心,第二部分是为了控制顶点的位置知足要求。

  最小二乘网格的优点是可以生成高质量的光滑网格,生成过程仅须要网格的拓扑链接关系和少数控制点的坐标信息。

Step 4:径向基函数(RBF)隐式曲面

  径向基函数是一个仅依赖于离控制点c距离的函数,即h(x,c) = h(||x - c||),距离一般是欧式距离,也能够是其余形式距离。径向基函数网络是一个三层BP网络,其能够表示为多个基函数的线性组合:

  下面列出2个最经常使用的基函数形式:

  (1)Gaussian:h(r) = e-(εr)2

  (2)Polyharmonic spline:h(r) = rk,k = 一、三、五、… 或h(r) = rkln(r),k = 二、四、六、…

  利用径向基函数网络并经过给定控制点xi和对应的值fi以后,能够求解获得网络中的系数λi,所以径向基函数网络可以解决空间散乱数据点的平滑插值问题,函数的零等值面就是咱们要求的曲面。

  在实际求解时函数f(x)表达式中一般会增长一个一次多项式P(x),以下:

,其中:

  将控制点位置xi和值fi代入函数f(x)能够获得以下方程,求解以后便可肯定隐式曲面f(x)。

  控制点xi可分为三类:

  (1)边界控制点:曲面经过的点,f(xi) = 0

  (2)外部控制点:将边界控制点沿法向正方向移动一小段距离而获得的控制点,取f(xi) = -1

  (3)内部控制点:将边界控制点沿法向负方向移动一小段距离而获得的控制点,取f(xi) = 1

  计算时咱们选择的基函数为h(r) = r3,其实此时隐式曲面函数知足Δ3f = 0,将基函数代入后获得隐式曲面的表达式以下:

function options = RBF_Create(x, y, type)
    % x: input data; y: input data value
    options = [];
    options.nodes = x;
    switch type
        case 'linear'
            options.phi = @rbfphi_linear;
        case 'cubic'
            options.phi = @rbfphi_cubic;
    end    
    
    [n, dim] = size(x);
    A = zeros(n,n);
    for i = 1:n
        r = normrow(bsxfun(@minus, x(i,:), x));
        temp = feval(options.phi, r);
        A(i,:) = temp';
        A(:,i) = temp;
    end
    % Polynomial part
    P = [ones(n,1) x];
    A = [ A      P
          P' zeros(dim+1, dim+1)];
    B = [y; zeros(dim+1, 1)];
    
    coeff = A\B;
    options.coeff = coeff;
end

% Radial Base Functions
function u = rbfphi_linear(r)
    u = r;
end
function u = rbfphi_cubic(r)
    u = r.*r.*r;
end
View Code

Step 5:牛顿插值

  为了获得插值隐式曲面的网格,咱们须要把最小二乘网格的顶点投射到隐式曲面上,这里咱们采用牛顿迭代法:

  最小二乘网格的顶点位置做为迭代初始条件,当||xk+1 – xk|| < ε时,迭代中止,ε为设定的偏差。上式中梯度表达式以下:

效果:

 本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

 

 

参考文献:

[1] Olga Sorkine and Daniel Cohen-Or. 2004. Least-Squares Meshes. In Proceedings of the Shape Modeling International 2004 (SMI '04). IEEE Computer Society, Washington, DC, USA, 191-199.

[2] Greg Turk and James F. O'Brien. 1999. Shape transformation using variational implicit functions. In Proceedings of the 26th annual conference on Computer graphics and interactive techniques (SIGGRAPH '99). ACM Press/Addison-Wesley Publishing Co., New York, NY, USA, 335-342.

[3] 袁自然. 三角网格模型光顺简化和缝补技术的研究及应用[D]. 南京航空航天大学, 2007.

相关文章
相关标签/搜索