三维网格补洞算法(Poisson Method)

  下面介绍一种基于Poisson方程的三角网格补洞方法。该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原始网格融合。算法的主要步骤如下:

  1-检测孔洞边界并初始化补洞网格

  2-调整补洞网格

    2.1-计算补洞网格中顶点的期望法向

    2.2-基于期望法向旋转补洞网格中的三角面片

    2.3-基于Poisson方程调整补洞网格顶点位置

  下面分别介绍算法中每一步的具体过程:

1:检测孔洞边界并初始化补洞网格

  检测孔洞边界和初始化补洞网格方法与以前介绍的方法相同。由于初始化补洞网格无法与原始孔洞周围的网格有效融合,因此需要调整补洞网格的顶点位置使得补洞网格与原始网格之间光滑过渡。

2.1计算补洞网格中顶点的期望法向

  由于已知原始网格孔洞边界的法向,将其作为补洞网格边界的法向,构建Laplace方程求解补洞网格内部顶点的法向分布。

  • Laplace算子:

  假设f表示在每个顶点上的标量,那么网格域上在顶点xi处的Laplace算子定义如下(不考虑面积影响):

其中N1(xi)表示顶点xi的1环邻域点,αij和βij为边eij对应的2个对角。

function L = Laplace_Matrix(V, F)
    fring = compute_vertex_face_ring(F);
    fpoint = [V(F(:,1),:), V(F(:,2),:), V(F(:,3),:)];
    farea = 0.5*doublearea(V, F);

    nV = size(V,1);
    L = sparse([],[],[],nV,nV);
    for i = 1:nV
        nf = length(fring{i});
        for j = 1:nf
            f = F(fring{i}(j),:);
            Tk = fpoint(fring{i}(j),:);

            gradBi = gradB(f, i, Tk);

            for k = 1:3
                gradBj = gradB(f, f(k), Tk);
                L(i,f(k)) = L(i,f(k)) + dot(gradBi,gradBj)*farea(fring{i}(j));
            end
        end
    end
end

2.2:基于期望法向旋转补洞网格中的三角面片

  计算得到补洞网格中顶点的期望法向之后,可以进一步求得三角面片的期望法向,三角面片的期望法向是其三个顶点期望法向的平均值,然后补洞网格中所有的三角面片根据期望法向进行旋转。旋转参数计算方法如下:假设ni、ni’和ci为三角面片fi的原始法向、期望法向和重心位置,ni与ni’的叉乘方向a为三角面片fi的旋转轴方向,ni与ni’之间的夹角φ为三角面片fi的旋转角度,那么三角面片fi将以ci为旋转中心,绕旋转轴a旋转角度φ到新的位置。

2.3:基于Poisson方程调整补洞网格顶点位置

  旋转补洞网格的三角面片会撕裂补洞网格,因此我们利用Poisson方程将其重构成连续的网格曲面。在建立Poisson方程时我们需要先计算撕裂网格的梯度场,将其作为Poisson方程的引导场,从而进行网格顶点位置的调整。

其中f为待求的调整后网格顶点位置,w为撕裂网格的梯度场。

  • 梯度算子:

  假设f表示在每个顶点上的标量,那么网格域上标量场f在任意三角面片T内的梯度算子定义如下:

其中基函数梯度▽Φi的表达式是,⊥表示将向量逆时针旋转90度,AT表示三角片T的面积。

  • 散度算子:

  假设w表示在每个三角片上的向量,那么网格域上向量场w在顶点xi处的散度算子定义如下:

其中T1(xi)表示顶点xi的1环邻域三角片,AT表示三角片T的面积。

效果:

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

相关:

三维网格形变算法(Gradient-Based Deformation):http://www.cnblogs.com/shushen/p/4932089.html

三维网格补洞算法(Radial Basis Function):http://www.cnblogs.com/shushen/p/5759679.html

参考文献:

[1] Wei Zhao, Shuming Gao, and Hongwei Lin. 2007. A robust hole-filling algorithm for triangular mesh. Vis. Comput. 23, 12 (November 2007), 987-997.

时间: 2024-11-06 09:46:16

三维网格补洞算法(Poisson Method)的相关文章

网格补洞算法(Radial Basis Function)

在逆向工程中,由于设备或模型的原因,我们获取得到的三维模型数据往往并不完整,从而使得生成的网格模型存在孔洞,这对后续的模型分析会造成影响.下面介绍一种基于径向基函数(RBF:Radial Basis Function)的三角网格补洞方法. Step 1:检测孔洞边界 三角网格是由一系列顶点(V)以及由这些顶点所构成的三角面片(F)所组成,由三角面片可以得到网格的边(E).通常一条边连接两个三角面片,这种边称为网格内部边,而如果某条边仅连接一个三角面片,那么称这条边为网格边界边,所有的边界边按顺序

(补)最优化方法 Optimization Method

随机梯度下降 mini batch 批梯度下降算法 牛顿法 考虑这样一个问题,找到函数值为0的点,对于方程,目标是找到一个,使得,这里是一个实数,牛顿法是按照如下方式进行的: 一维情况下,牛顿方法可以简单理解为:随机选取一个点,然后求出f在该点处的切线L,该切线L的斜率即f在该点处倒数,该切线与x轴相交的下一个点即作为下一次迭代的值,这样知道收敛便可求得,过程如下图所示: 在优化方法中,极值点事一阶导函数为0的点,即f’(x)=0,对于一个方程,如何求得其极值点呢,只需对上述公式做如下修改: 推

iOS开发总结(A0)- Class, variable, enum, method 命名规范及好的做法

参考effective objective 2.0 item 19 use clear and consistent naming 中的建议 1. method name : 适用驼峰命名法,方法名称应尽能表明方法是干什么的,不必担心名称过程,因为在使用时,xcode 会自动补全 - 如果method返回一个值,方法名称应表明这是什么值 - 不要用缩写 - 对于boolean property ,加上is 或者has 前缀 - 不要使用get 前缀 - 名称应易读,尽量像一个自然句子 2. cl

菜鸟学四轴控制器之6:刀具半径补偿算法

为什么要有刀具补偿? 想象一下,如果我们的刀具可以理想到半径无穷小,倒是不需要考虑半径的补偿,但是实际上我们用到的是刀具的边沿在雕刻物体,如下图: 简单来看,好像是直接平行于轮廓进行移动就可以了,其实不然,单条直线的雕刻是平行,但是直线和直线,直线和圆弧,圆弧和圆弧都是不同的,并且!直线与直线的刀具补偿也分为三种情况分析.并且,在理论上有两种方法来进行补偿. 且慢,还分为三步,第一步是建立补偿,第二步 进行补偿,第三步撤销补偿. 两种方法分别为: 1.B刀具半径补偿 2.C刀具半径补偿 按照以往

最优解算法的讨论

不懂优化的人希望能有通用的方法来解决他手头的问题.但不幸的事没有这样的方法存在.高速的方法都须要某些条件,比方常见的有强凸.线性,可分解啥的.眼下研究的比較成熟的就是强凸光源可分解 非凸没有特别有效的方法来解.假设是强凸的,何必用那么复杂的方法求最优解?正是由于不是强凸的,才用到优化方法.就算是凸的.也分好几种不同的情况.仅仅用一阶梯度,达到牛顿梯度法的收敛速度.在convex问题中,还有non-smooth的函数,也是不好解的. 算法论中的动态规划.贪心算法等等是主要的理论.实际中採用的往往须

菜鸟学四轴控制器之1:插补是啥东西

之前看过运动控制芯片的手册,包括了NOVA的MCX314和PCL6045等,知道插补的概念. 但是插补到底是啥玩意,其实一直是有点疑惑的,然后就傻乎乎的去问一些专家,他们的说法是: 插补可以同时多轴输出,速度很快.然后就不知道问啥了. 基于我之前做步进电机的经验,以及测试步进电机驱动器的经验,我一般情况下都是通过单片机发一个固定脉冲来测试驱动器的性能.如果需要测试电机各种速度下的力矩特性,最多采用了S加减速曲线,在我看来,要画一个直线,那太简单了,直接X轴和Y轴同时给不同速度的脉冲不就OK了么?

排序算法总结------选择排序 ---javascript描述

每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此恶补排序算法. 一.基本排序算法:基本排序算法有冒泡排序,选择排序,插入排序. 选择排序算法思想:选择排序从数组的头开始,将第一个元素与其他元素进行比较,找到最小的元素,然后放到数组的第一个位置.然后再从第二个元素开始找比他小的元素,放到第二个位置,以此类推,重复上述步骤,当进行到数组的第二个位置时

Ray-AABB交叉检测算法

??最近在解决三维问题时,需要判断线段是否与立方体交叉,这个问题可以引申为:射线是否穿过立方体AABB. ??在3D游戏开发中碰撞检测普遍采用的算法是轴对齐矩形边界框(Axially Aligned Bounding Box, AABB)包装盒方法,其基本思想是用一个立方体或者球体完全包裹住3D物体对象,然后根据包装盒的距离.位置等相关信息来计算是否发生碰撞. slab的碰撞检测算法 ??本文接下来主要讨论射线与AABB的关系,主要对box2d碰撞检测使用的slab的碰撞检测算法(Slabs m

融合非负矩阵分解和图全变分的歌曲推荐算法

摘要: Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Processing Laboratory 2 (LTS2), Swiss Federal Institute of Technology (EPFL) Kirell Benzi, Vassilis Kalofolias, Xavier Bresson and Pierre Vandergheynst Signal Proce