一种三角网格模型特征保持混合简化方法与流程

文档序号:16886274发布日期:2019-02-15 22:40阅读:231来源:国知局
一种三角网格模型特征保持混合简化方法与流程

本发明属于计算机图形学领域,特别涉及一种三角网格模型特征保持混合简化方法。



背景技术:

由于逆向工程、增材制造、计算机辅助设计技术的发展,定义简单、无歧义的三角网格模型得到了越来越广泛的应用。但复杂三角网格模型通常由几万个、几十万个、甚至成百上千万个三角面片组成。为便于计算机存储和分析,通常需要进行简化处理,因此如何有效简化复杂三角网格模型也成为于计算机图形学领域和数字化制造领域研究的热点问题之一。

三角网格模型简化的本质是减少三角面片和网格顶点的数目。目前常用的几何元素折叠法依据原始模型进行相应的简化,故能较好地保留原模型的拓扑信息,而被广泛研究。几何元素折叠法是指在与原模型有一定几何误差的前提下,折叠对原始模型影响较弱的几何元素,主要有边折叠算法和三角形折叠算法。其中,三角形折叠一次可以简化掉四个三角面片,简化效率较高,在曲率变化不大处折叠效果较好,但特征保持性较差;而边折叠算法对于细节特征保持性较好,但效率较低。也有将网格模型拟合为曲面模型的方法,能够极大地减少顶点数量,但其结果不再是三角网格模型。

几何元素折叠方法需要解决两个关键问题,即折叠对象的确定和新顶点的选择。现有算法通过计算网格三角形折叠代价确定折叠对象,折叠代价计算方法主要有:李现民等人在学术期刊《计算机辅助设计与图形学学报》2002,14(1),p8-13发表的学术论文“基于子分规则的边折叠简化方法”等等中采用的二次误差测度法(quadricerrormetric,qem)、段黎明等人在学术期刊《光学精密工程》2017,25(2),p460-468发表的学术论文“高效率的三角网格模型保特征简化方法”等等中采用的特征保持法、裴艳云等人在学术期刊《计算机工程与应用》2013,49(14),p174-177发表的学术论文“一种基于不平滑度的网格简化算法”等等中采用的加权平均法等等。其中二次误差测度法原理简单,但是需要通过矩阵来求解折叠代价,在不通过加速手段进行简化处理的前提下效率较低;特征保持法对于细节特征保持较好,但对于复杂模型往往得不到很好的处理结果;加权平均法思路简单、计算较快,但对特征复杂模型无法取得较好的效果,且当简化程度增大时细节特征丢失严重,模型变形较大。

对于新顶点的选择,现有算法可以分为两种,即段黎明等人在学术期刊《光学精密工程》2017,25(2),p460-468发表的学术论文“高效率的三角网格模型保特征简化方法”等等中采用的子集选择法和李现民等人在学术期刊《计算机辅助设计与图形学学报》2002,14(1),p8-13发表的学术论文“基于子分规则的边折叠简化方法”等等中采用的优化选择法。子集选择法即选择三角面片中的顶点或边上的点,该方法计算速度较快但简化模型与原模型相差较大;优化选择法是求取空间中的一点使得折叠代价最小,该类方法简化效果虽然较好,但是计算速度较慢。

总之,由于三角网格模型形状的复杂性,单纯的三角网格模型简化算法难以实现复杂三角网格模型简化的特征保持和简化效率的平衡问题,有必要提出一种新的技术方案。



技术实现要素:

本发明的目的在于克服现有技术的不足,提供一种三角网格模型特征保持混合简化方法,通过以顶点曲度值为权值计算折叠后新顶点、基于点面距离计算折叠对象的折叠代价,对三角网格模型进行特征保持的混合简化,较好地解决了复杂三角网格模型简化的特征保持和简化效率的平衡问题。

本发明解决其技术问题所采用的技术方案是:

一种三角网格模型特征保持混合简化方法,包括以下步骤:

步骤a、读入三角网格模型并建立半边数据结构后,以顶点曲度值为权值计算折叠后新顶点,以减小模型简化的变形;

步骤b、基于点面距离计算折叠对象的折叠代价,控制边或面片的简化顺序以控制模型简化前后的变形程度;

步骤c、对三角网格模型进行特征保持的混合简化,包括孔洞边界特征的边折叠简化、特征区域的边折叠简化和非特征区域三角形折叠简化;三种简化依次顺序进行:即先对三角网格模型迭代进行孔洞边界特征的边折叠简化,在达到指定简化最大误差或简化次数后冻结被简化部分;再对三角网格模型迭代进行特征区域的边折叠简化,同样在达到指定简化最大误差或简化次数后冻结被简化部分;最后对三角网格模型迭代进行非特征区域三角形折叠简化,在达到指定简化最大误差、或简化次数、或简化率后,结束简化;

步骤d、非特征区域折叠简化过程中,进行三角面片折叠合法性检查。

优选的,步骤a中所述以顶点曲度值为权值计算折叠后新顶点,其具体计算方法为:

步骤a1、计算顶点曲度值,如下:

其中,kh为顶点平均曲率,kg为顶点高斯曲率;

步骤a2、三角网格模型上存在共边相邻两个面片的法矢夹角大于45°的特征区域和边界特征区域,采用边折叠简化方法保留特征,边折叠新顶点v0的计算公式如下:

其中,v1和v2为待折叠特征边的起点和终点,cp1和cp2为起点和终点的曲度值;

步骤a3、对非特征区域三角形则采取三角形折叠方式,折叠后新顶点v′0的计算公式如下:

其中,v′1、v′2和v′3为待折叠三角形的顶点,c′p1、c′p2和c′p3为顶点曲度值。

优选的,步骤b中所述基于点面距离计算折叠对象的折叠代价,其具体计算方法为:

步骤b1、对于折叠后的任一新顶点p,f为p所属折叠对象的一阶邻域三角面片中的某个面片,f所在平面为π,则点p到平面π的距离向量为:r=(p-q)·u,其中,q为f中任意一个顶点,u为f的单位法向量;

步骤b2、第i个折叠对象obi的折叠代价如下:

其中,δ(obi)为obi的折叠代价,fσ为obi的一阶邻域所有面片,||r||为向量的模长。

优选的,步骤c中所述孔洞边界特征的边折叠简化,具体方法为:

步骤c.1.1、识别网格模型中的所有孔洞边界边,对查找出的各边界边一阶邻域面片进行标记;将各边界边按邻接顺序存储到边的vector容器bordring中,并将各边的终点按顺序存储到顶点的vector容器m_vecpnts中;

步骤c.1.2、识别孔洞边界边ei中的尖锐特征边:识别尖锐特征边时遵循两个原则,其一是计算边ei的两特征角θ1和θ2,具体为:边ei的起始顶点为vi、终点为vi+1、边界中边的前一顶点为vi-1、后一顶点为vi+2,则θ1=arccos(vivi+1,vivi-1),θ2=arccos(vi+1vi+2,vi+1vi);其二是通过计算边的折叠代价;

判断边ei的两特征角θ1和θ2,若两特征角均小于阀值,转入步骤c.1.3;若特征角和折叠代价都不满足给定的阀值则跳转到步骤c.1.4;

步骤c.1.3、标记该孔洞边界边,取下一条边界边继续步骤c.1.2;

步骤c.1.4、计算折叠后的新顶点vt,从边界边表中删除待折叠ei,用新顶点vt,更新与ei起点和终点相关的边界边及ei一阶邻域中的边、三角面片信息;

步骤c.1.5、若边界边容器bordring中无可简化边,则边界处理结束,否则跳转到步骤c.1.2继续简化;

步骤c.1.6、重复步骤c.1.1到c.1.5,直到孔洞边界没有再做边折叠简化;

步骤c.1.7、对所有孔洞边界的一阶邻域三角面片做处理标记,防止在特征区域的边折叠简化和非特征区域三角形折叠简化过程中被处理。

优选的,步骤c中所述特征区域的边折叠简化,具体方法为:

步骤c.2.1、孔洞边界简化后的三角网格模型中,计算各边相邻两个面片的法矢夹角,夹角大于45°时将其添加到特征边容器中;

步骤c.2.2、遍历特征边容器,对于每一条特征边,搜索其一阶邻域面片看是否有“已使用”或“已冻结”标志,若有则跳转到步骤c.2.6;否则继续步骤c.2.3;

步骤c.2.3、按照步骤a2中方法计算折叠边对应的新顶点v0;遍历特征边的一阶邻域面片,按照步骤b2中方法计算所有特征边折叠代价;

步骤c.2.4、将所有特征边按折叠代价大小排序,取出边表中折叠代价较小的边ei,用其对应新顶点v0替代边、面片中相应的顶点,更新顶点链表,删除特征边ei;

步骤c.2.5、若遍历结束,则清空特征边表,结束特征区域边折叠操作,否则,继续;

步骤c.2.6、从特征边容器中取下一条边,跳转到步骤c.2.1。

优选的,步骤c中所述非特征区域三角形折叠简化,具体方法为:

步骤c.3.1、遍历三角网格模型面表中非特征区域所有的非冻结三角形,通过步骤b2方法求取所有未被标记的三角面片的折叠代价,并按照步骤a3中方法求取折叠后的新顶点,将折叠代价和新顶点存储在三角形的数据结构中;

步骤c.3.2、将所有未被标记三角面片按折叠代价值进行升序排列,得到一个折叠误差序列;

步骤c.3.3、原始模型面表中三角形的数量为n,r为单次简化率,将三角面片序号小于预设定序列长度值的三角形作为待折叠三角形;当折叠误差序列小于n·(1-r)时,可对序列中折叠误差最小的三角面片f0作三角形折叠处理;

步骤c.3.4、遍历原始模型中所有三角面片,将未经冻结的三角面片存入新的模型数据结构pmeshtri中;若遍历完成,则停止简化操作;

步骤c.3.5、判断当前简化结果是否达到要求,若否,则以新得到的模型pmeshtri为新原始模型继续步骤c.3.1至步骤c.3.4的简化操作;否则,输出简化后的网格模型并进行显示。

优选的,步骤d中所述三角面片折叠合法性检查,具体方法如下:

对三角形f0进行折叠时如果f0及其一阶邻域内三角形被重复多次折叠的情况采用如下方式进行处理:

检查检查f0及其一阶邻域内三角形是否被标记,若是,则不对f0进行折叠操作;

对三角形f0折叠后如果三角形边由两个或两个以上的三角形共用的情况采用如下方式进行处理:

比较与f0相关联的三角面片的法向量在折叠前后的变化情况,如果法向量变化超过45°,则不对f0进行折叠操作。

本发明与现有相关技术相比,具有以下优点:

⑴本发明提供的三角网格模型特征保持混合简化方法,通过对复杂网格模型的边界改进边折叠、特征区域的边折叠和非特征区域的三角面片折叠的混合折叠算法,较好地解决了复杂三角网格模型简化的特征保持和简化效率的平衡问题。

⑵通过以顶点曲度值为权值计算折叠后新顶点,增强了简化算法对不同模型的适应性,有效控制了简化前后模型的变形问题。

⑶提出基于点面距离计算折叠对象的折叠代价,来改进传统的qem算法,提高了简化算法的运行效率,大大节省了计算机的内存开销。

以下结合附图及实施例对本发明作进一步详细说明;但本发明的一种三角网格模型特征保持混合简化方法不局限于实施例。

附图说明

图1是本发明的流程示意图;

图2是本发明用来存储三角网格模型拓扑信息的半边结构图;

图3是本发明边折叠的折叠代价计算示意图;

图4是本发明三角形折叠的折叠代价计算示意图;

图5是本发明的孔洞边界边可折叠性判断示意图;

图6是本发明的非特征区域三角形折叠简化程序流程图;

图7是本发明的三角面片折叠合法性示意图;

图8是本发明的被简化三角网格模型实例;

图9是本发明对原始模型实例简化60%后的模型;

图10是本发明对原始模型实例简化90%后的模型。

具体实施方式

实施例

参见图1至图10所示,本发明的一种三角网格模型特征保持混合简化方法,程序流程如图1所示,主要包括如下步骤:

步骤a、读入三角网格模型并建立半边数据结构后,以顶点曲度值为权值计算折叠后新顶点,以减小模型简化的变形;

步骤b、基于点面距离计算折叠对象的折叠代价,控制边或面片的简化顺序以控制模型简化前后的变形程度,保持重要细节特征;

步骤c、对三角网格模型进行特征保持的混合简化,包括孔洞边界特征的边折叠简化、特征区域的边折叠简化、非特征区域三角形折叠简化;三种简化依次顺序进行:即先对三角网格模型迭代进行孔洞边界特征的边折叠简化,在达到指定简化最大误差或简化次数后冻结被简化部分;再对三角网格模型迭代进行特征区域的边折叠简化,同样在达到指定简化最大误差或简化次数后冻结被简化部分;最后对三角网格模型迭代进行非特征区域三角形折叠简化,在达到指定简化最大误差、或简化次数、或简化率后,结束简化;

步骤d、非特征区域折叠简化过程中,进行三角面片折叠合法性检查。

本实施例中,所述读入三角网格模型并建立半边数据结构的方法如下:

使用open()函数打开硬盘内指定路径下的stl(stereolithography)三角网格模型文件;使用fscanf()从文本格式的stl文件中读取面片顶点数据和法矢数据;每读入一个顶点的数据,需要使用c++标准模板库中的集合容器类set及关联容器类map来去除坐标值相同的点顶点,建立无冗余的点表和面表,同时建立面片到顶点、顶点到面片的拓扑邻接信息。建立半边数据结构如图2,图2中三角面片f0的半边he1的起点为顶点a,终点为顶点b,伙伴半边为he2。三角面片f1中半边he2的下一个半边he3,记为he_next,半边he2的前一个半边he4,记为he_pre,半边he1的伙伴半边he2,记为he_pair。创建半边结构时,由面表中每个面片创建三条半边,通过关联容器类map查找伙伴半边,建立面片到面片、顶点到边、边到顶点等拓扑邻接信息。

在半边数据结构的基础上,以顶点曲度值为权值计算折叠后新顶点,具体计算如下:

步骤a1、计算顶点曲度值:

其中,kh为顶点平均曲率,kg为顶点高斯曲率。kh和kg可以通过顶点一阶邻域面片拟合为二次曲面方式进行计算,也可以通过估算法求得;

步骤a2、三角网格模型上存在共边相邻两个面片的法矢夹角大于45°的特征区域和边界特征区域,采用边折叠简化方法保留特征,边折叠新顶点v0的计算公式如下:

其中,v1和v2为待折叠特征边的起点和终点,cp1和cp2为起点和终点的曲度值;

步骤a3、对非特征区域三角形则采取三角形折叠方式,折叠后新顶点v′0的计算公式如下:

其中,v′1、v′2和v′3为待折叠三角形的顶点,c′p1、c′p2和c′p3为顶点曲度值。

本实施例中,所述步骤b中,基于点面距离计算折叠对象的折叠代价计算如下,图3中折叠对象为边,如粗线段所示;图4中折叠对象为三角形,如粗三角形所示。图3和图4中示意了边折叠对象的一阶领域三角面片,p为折叠对象被折叠后产生的新顶点,f为折叠对象的一阶邻域三角面片中的某个面片,f所在平面为π。则折叠代价的具体计算方法为:

步骤b1、计算点p到平面π的距离向量为:r=(p-q)·u,其中q为f中任意一个顶点,u为f的单位法向量,如图3和图4所示;

步骤b2、第i个折叠对象obi(图3中为一条边,图4中为一个三角形)的折叠代价如下:其中δ(obi)为obi的折叠代价,fσ为obi的一阶邻域所有面片,||r||为向量的模长。

本实施例中,所述步骤c中,孔洞边界特征的边折叠简化中,为保证孔洞边界特征不被过度简化,先识别边界区域,然后将孔洞边界区域进行边简化处理,通过简化精度控制简化程度可保持原始模型中的特征,并提高算法效率。具体方法为:

c.1.1、识别网格模型中的所有孔洞边界边,对查找出的各边界边一阶邻域面片进行标记;将各边界边按邻接顺序存储到边的vector容器bordring中,并将各边的终点按顺序存储到顶点的vector容器m_vecpnts中;

c.1.2、识别孔洞边界边ei中的尖锐特征边,如图5所示:识别尖锐特征边时遵循两个原则,其一是计算边ei的两特征角θ1和θ2,具体为:边ei的起始顶点为vi、终点为vi+1、边界中边的前一顶点为vi-1、后一顶点为vi+2,则θ1=arccos(vivi+1,vivi-1),θ2=arccos(vi+1vi+2,vi+1vi);其二是通过计算边的折叠代价;

判断边ei的两特征角θ1和θ2,若两特征角均小于阀值,转入步骤c.1.3;若特征角和折叠代价都不满足给定的阀值则跳转到步骤c.1.4;

c.1.3、标记该孔洞边界边,取下一条边界边继续步骤c.1.2;

c.1.4、计算折叠后的新顶点vt,从边界边表中删除待折叠ei,用新顶点vt,更新与ei起点和终点相关的边界边及ei一阶邻域中的边、三角面片信息;

c.1.5、若边界边容器bordring中无可简化边,则边界处理结束,否则跳转到步骤c.1.2继续简化;

c.1.6、重复步骤c.1.1到c.1.5,直到孔洞边界没有再做边折叠简化;

c.1.7、对所有孔洞边界的一阶邻域三角面片做处理标记,防止在特征区域的边折叠简化和非特征区域三角形折叠简化过程中被处理。

本实施例中,所述步骤c中,特征区域的边折叠简化为:首先从模型中孔洞边界简化之外的部分识别并保存特征边;边折叠操作是遍历所有特征边,删除或者折叠与可折叠特征边相关联的顶点、边和面,从而得到较稀疏的特征网格。为防止特征区域被过度简化,在达到指定简化最大误差或简化次数后将简化后的区域进行冻结,不做后续的三角形简化。具体方法为:

c.2.1、孔洞边界简化后的三角网格模型中,计算各边相邻两个面片的法矢夹角,夹角大于45°时将其添加到特征边容器中。定义eij为面片fi和面片fj的邻接边,为二面角值,ni和nj为三角面片的单位法矢,则边eij的二面角(dihedralangle)值计算为:

c.2.2、遍历特征边容器,对于每一条特征边,搜索其一阶邻域面片看是否有“已使用”或“已冻结”标志,若有则跳转到步骤c.2.6;否则继续步骤c.2.3;

c.2.3、按照步骤a2中方法计算折叠边对应的新顶点v0;遍历特征边的一阶邻域面片,按照步骤b2中方法计算所有特征边折叠代价;

c.2.4、将所有特征边按折叠代价大小排序,取出边表中折叠代价较小的边ei,用其对应新顶点v0替代边、面片中相应的顶点,更新顶点链表,删除特征边ei;

c.2.5、若遍历结束,则清空特征边表,结束特征区域边折叠操作,否则,继续;

c.2.6、从特征边容器中取下一条边,跳转到步骤c.2.1。

本实施例中,所述步骤c中,非特征区域三角形折叠简化为:将满足一定条件的三角形,在按“折叠代价”排序后,将三角面片序号小于预设定序列长度值的三角形作为待折叠三角形。用新顶点代替待折叠三角形,连接新顶点和面片“一阶邻域环”中的顶点并删除相应的面片和顶点即完成三角形折叠操作。具体方法为:

c.3.1、遍历三角网格模型面表中非特征区域所有的非冻结三角形,通过步骤b2方法求取所有未被标记的三角面片的折叠代价,并按照步骤a3中方法求取折叠后的新顶点,将折叠代价和新顶点存储在三角形的数据结构中;

c.3.2、将所有未被标记三角面片按折叠代价值进行升序排列,得到一个折叠误差序列;

c.3.3、原始模型面表中三角形的数量为n,r为单次简化率,将三角面片序号小于预设定序列长度值的三角形作为待折叠三角形;当折叠误差序列小于n·(1-r)时,可对序列中折叠误差最小的三角面片f0作三角形折叠处理,具体流程如图6;

c.3.4、遍历原始模型中所有三角面片,将未经冻结的三角面片存入新的模型数据结构pmeshtri中。若遍历完成,则停止简化操作;

c.3.5、判断当前简化结果是否达到要求,若否,则以新得到的模型pmeshtri为新原始模型继续步骤c.3.1-步骤c.3.4的简化操作;否则,输出简化后的网格模型并进行显示。

本实施例中,所述步骤d具体如下:

对非特征区域的三角面片进行折叠时,有可能出现如图7情况,图中三角形f0的一些边有超过两个连接面片,需要进行折叠合法性检查。对一个三角形f0进行折叠可能出现以下情况:①f0及其一阶邻域内三角形可能会被重复多次折叠;②折叠后三角形边可能由两个或两个以上的三角形共用;对这两种情况分别处理如下:

对于情况①,检查检查f0及其一阶邻域内三角形是否被标记,若是,则不对f0进行折叠操作;

对于情况②,比较与f0相关联的三角面片的法向量在折叠前后的变化情况,如果法向量变化超过45°,则不对f0进行折叠操作。

图8-图10为本发明的具体实例。其中图8为简化前的带孔洞兔子(bunny)模型,共包含66302各三角面片,该模型的三角网格密度均匀;图9为简化率达到60%、三角面片数量为23468的简化效果;图10为简化率达到90%、三角面片数量为6248的简化效果;图9和图10中,i所指之处为特征区域,三角网格密度比非特征区域要高;ii所指之处为孔洞边界,随着孔洞边界各处形状特征的变化,其三角网格密度也是变化的。

以上仅为本发明实例中一个较佳的实施方案。但是,本发明并不限于上述实施方案,凡按本发明所做的任何均等变化和修饰,所产生的功能作用未超出本方案的范围时,均属于本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1