一种基于半边半面数据结构的3D打印实体模型生成方法

文档序号:30623327发布日期:2022-07-02 05:21阅读:230来源:国知局
一种基于半边半面数据结构的3D打印实体模型生成方法
一种基于半边半面数据结构的3d打印实体模型生成方法
技术领域
1.本发明提供一种基于半边半面数据结构的3d打印实体模型生成方法,即一种面向3d打印实体模型的基于半边半面数据结构表示的生成方法,它涉及一种用于在计算机中表示样条实体模型的半面数据结构以及基于该数据结构生成3d打印样条实体模型的方法,属于计算机辅助设计(computer aided design,cad)和计算机辅助制造(computer aided manufacturing,cam)技术领域。


背景技术:

2.目前cad技术领域三维实体模型几何建模比较通用的方式是采用边界表示法(b-rep,即boundary representation,意为边界表示,是目前使用最广泛的两种实体表示法之一)。在b-rep方法中,几何实体使用封闭形体的边界曲面来表示,其最大的特点是将几何信息与拓扑信息分开表述,因此边界表示方法可以提供几何模型完整的边界信息,但这种表示方法缺乏对实体内部信息的完整表达,同时需要牺牲存储空间以及运算效率,并且不易表达具有复杂外形的几何模型,在等几何分析或者需要实体模型内部信息的应用如基于功能梯度材料的3d打印等场景无法满足现代工业的要求。
3.因此本发明提出了一种可以解决上述问题的基于半边半面的实体模型数据结构,基于此数据结构可以实现样条实体模型边界以及实体内部信息的完整表述,同时在一定程度上降低存储空间消耗并提高运算效率。


技术实现要素:

4.(一)发明目的:
5.本发明的目的在于提出一种基于半边半面数据结构的3d打印实体模型生成方法,解决现有的b-rep方法无法详细描述实体内部信息的问题,同时提高运算效率降低存储空间的占用。该方法基于一种以半边及半面为核心元素的数据结构进行实体模型数据的生成;这种数据结构能够详细、准确地描述实体模型的完整拓扑、几何信息,同时可以有效弥补现有的非流形数据结构存在的缺陷,如存储空间增长以及无法准确描述实体模型内部信息等。基于该数据结构的实体模型生成方法的提出能够有效的提升实体模型数据生成的效率和质量,能够方便地应用于诸如3d打印模型生成等实际应用环境。
6.(二)技术方案:
7.本发明提出了一种基于半边半面数据结构的3d打印实体模型生成方法,即一种样条实体模型数据的生成方法,可以针对目前主流的b-rep表示模型数据存储空间大,表达复杂实体结构运算效率低下等问题提供一种新的解决方法,减少存储空间,提高对实体模型尤其是复杂结构实体模型的运算效率,从而可以方便地应用于需要实体模型内部信息的工业场景,如三维拓扑优化、3d打印等;
8.本发明一种基于半边半面数据结构的3d打印实体模型生成方法,其步骤如下:
9.步骤一、构建基础网格数据;
10.构造一个实体网格对象solidmesh,然后依次逐个创建所有的anchor、vertex、edge、face、cube对象,并为每个对象添加相应的部分必要属性,同时将这些拓扑对象分别添加到mesh中的相应list中进行id标识;
11.所述的“solidmesh”,是指:一个实体网格对象,代表模型的整体网格对象,是“实体网格”的英文符号;
12.所述的“vertex”,是指:实体网格中的拓扑元素对象——顶点,每个顶点指向一个三维空间中的笛卡尔点;
13.所述的“edge”,是指:实体网格中的拓扑元素对象——边,每个边的两端各有一个顶点vertex;
14.所述的“face”,是指:实体网格中的拓扑元素对象——面,每个面代表一个三维空间中的二维平面区域,区域的边界由多个边edge包围而成;
15.所述的“cube”,是指:实体网格中的拓扑元素对象——实体单元,每个实体单元代表三维空间中的一个区域,区域的边界由多个面face包围而成,同时多个实体单元无缝拼接共同组成实体网格solidmesh的空间区域;
16.所述的“anchor”,是指:实体网格中的几何元素对象——锚点,包含一个表示空间位置的几何坐标属性,以及表示锚点处材料性质的属性;
17.所述的“mesh”,是指:由点线等拓扑元素构成的网格框架;
18.所述的“list”,是指:一个列表,通常每个list中仅存放多个相同类型的对象,如vertexlist中仅存放点对象(vertex);
19.所述的“id”,是指:索引标识号码。上述的每个拓扑对象及几何对象均需绑定一个id,同时同类型的对象id不能出现重复,但不同类型的对象id可以重复,比如两个vertex对象的id号不能相同,但是一个edge对象的id号可以与另一个vertex对象的id号相同;
20.步骤二、构建半面链接元素;
21.对每个face对象创建两个(非边界情况下)halfface对象,并设定每个halfface对象指向的cube、face对象,同时把这两个halfface(非边界情况下)相互设定为hoppo关系;
22.所述的“halfface”,是指:半面对象,是连接体面拓扑元素与边点拓扑元素的中间元素之一,是一个逻辑对象,仅存在于网格结构的逻辑结构层面,具有以下特性:

每个半面属于唯一的一个实体单元,

每个实体单元包含多个半面,

每个半面属于唯一的一个面,

面位于实体网格边界处时仅包含一个半面,其他面都包含两个半面;
23.所述的“hoppo”,是指:两个半面之间的位置关系——相对关系,如果两个半面指向同一个面对象则把这两个半面定义为一对相对(hoppo)的半面;
24.步骤三、构建半边链接元素并构建半边环;
25.对于每个halfface对象,执行以下两步操作:
26.1、按照halfface所在face上的边对象的周向逆时针顺序逐个创建halfedge对象,每个halfedge对象创建后指定其所属的halfface、edge、vertex,同时将此halfedge添加到上述edge对象的halfedgelist中;
27.2、按照创建顺序将halfedge存为list,对此list中的半边构建半边环,即指定每个半边的前置半边hpre及后置半边hnext;
28.所述的“halfedge”,是指:半边对象,是一个逻辑对象,仅存在于实体网格的逻辑
结构层面,且具有以下特性:

每个半边都有唯一一个出发点(vertex),

每个半边都属于唯一一个边对象,

每个半边都属于唯一一个半面对象,

每个半边都属于唯一一个实体单元对象,

属于同一个半面的多个半边根据前后半边关系逆时针首尾相连构成环状半边结构;
29.所述的“halfedgelist”,是指:由多个半边对象存放在一个list中组成的半边列表;
30.所述的“hpre”,是指:半边之间的位置关系,与hnext相对应,若a半边是b半边的前置半边(hpre),则b半边是a半边的后置半边(hnext);
31.所述的“hnext”,是指:半边之间的位置关系,与hpre相对应,若c半边是d半边的后置半边(hnext),则d半边是c半边的前置半边(hpre);
32.步骤四、由已完成的内容补全所有已有对象中缺失的成员属性;
33.由已完成的内容补全其他设置:包括设定每个cube的主半面、设定每个vertex的主半边、设定每个半边的相邻半边关系hadjacent以及半边转角信息hconertype、设定halfface对象的边界标志以及细分标志;
34.所述的“hadjacent”,是指:两个半边的位置关系——相邻半边关系,若两个半面同时满足:

指向同一个边对象、

指向同一个实体单元,则将这两个半边对象相互定义为相邻关系(hadjacent);
35.所述的“hconertype”,是指:半边的出发点在此半边所指向半面上的位置特征标记:若出发点为转角点(即在该面上共用该出发点的两条边之间有夹角)则标记为0,若出发点为非转角点(即在该面上共用该出发点的两条边之间在同一条直线上)则标记为1;
36.步骤五、对上述构建完成的实体网格按照构建规则进行拓扑结构检查,确保其包含的拓扑信息与链接元素之间的对应关系正确、完整,若没有问题则完成实体网格的构建;
37.其中,步骤一中所述的“对象”,是面向对象程序设计中的概念,每个对象包含多个属性或内容,如solidmesh是实体网格在程序设计中创建的对象,包含多个list如anchorlist/vertexlist/edgelist/

用于对拓扑对象进行id标识;
38.所述的“anchorlist”,是指:存放了多个锚点(anchor)对象的列表;
39.所述的“vertexlist”,是指:存放了多个顶点(vertex)对象的列表;
40.所述的“edgelist”,是指:存放了多个边(edge)对象的列表;
41.其中,步骤一中所述的“为每个对象添加相应的部分必要属性”,是指在这一步骤中只能添加目标对象的部分属性,其他属性需要在后面的步骤逐步进行添加或设定,在这一步骤可以完成添加的对象属性包括:anchor对象的几何信息(即点的坐标arc4dpoint)、类型(type)、材料属性(material)等;vertex对象设定其所包含的anchorlist同时也为anchorlist中的锚点设定其指向的vertex;edge对象设定其节点距(interval);cube对象设定其所包含的anchorlist;
42.所述的“arc4dpoint”,是指:代表空间坐标点的符号,用于存储空间坐标点在空间直角坐标系中的位置数据;
43.其中,步骤一中所述的“将这些拓扑对象分别添加到mesh中的相应list中进行id标识”,以anchor为例,具体做法是:每创建一个新的anchor就将此锚点添加到mesh的anchorlist中,并为其赋予id,此id的取值依据为当前列表最后一个anchor的id加1,即按
照只增不减的方式为新增的对象赋予id,此外需要说明的一点是,即使需要删除list中的某个对象,也不更改其他对象的id,即只需要保证同一个list中所有对象的id具有唯一性即可,无须保持连续性;
44.其中,步骤二中所述的“对每个face对象创建两个(非边界情况下)halfface对象”,是指:若face处于非边界位置则创建两个halfface对象,若face处于边界处则仅需创建一个halfface对象;同理,“把这两个halfface(非边界情况下)相互设定为hoppo关系”是指:对非边界处的face对象将创建的两个halfface对象相互设定为hoppo关系;若face处于边界处则仅会创建一个halfface,且此halfface的hoppo属性为空;
45.其中,步骤二中所述的“设定每个halfface对象指向的cube、face对象”,具体做法是:由于两个halfface是依据同一个face对象(为叙述方便,暂记为face0)创建的,因此这两个halfface指向的face对象即为face0;而每个face对象都是两个相邻cube的交界,因此两个halfface指向的cube即分别为此face相邻的两个cube。
46.其中,步骤三所述的“每个halfedge对象创建后指定其所属的halfface、edge、vertex”,具体做法如下:
47.①
由于halfedge是基于halfface创建的,因此这周向的所有halfedge都指向同一个halfface,即创建每个halfedge的同时将其设定为指向此halfface;
48.②
由于是周向逆时针顺序创建halfedge,因此若提前遍历halfface所在face对象并逆时针顺序获取面上的点、线列表,则创建的halfedge即与列表按顺序一一对应;即首先遍历halfface所在face并按照逆时针方向顺序获取面上的点线列表,则创建每个halfedge的同时设定点线列表中与之相对应位置上的点或线为此halfedge的指向对象;
49.其中,步骤三中所述的“按照创建顺序将halfedge存为list,对此list中的半边构建半边环”,具体做法为:
50.①
若半边在list开头位置,则此半边的后置半边为list第二个位置的半边,前置半边为list末尾位置的半边;
51.②
若半边在list末尾位置,则此半边的后置半边为list开头位置的半边,前置半边是list倒数第二个位置的半边;
52.③
若半边在list中间位置,则此半边的后置半边为list中下一个位置的半边,前置半边为list中上一个位置的半边。
53.其中,步骤四中所述的“设定每个cube的主半面”的具体做法为:遍历获取指向此cube的所有半面,按照需要选择其中一个半面作为主半面,一般选择某个非细分面作为主半面即可;
54.其中,步骤四中所述的“设定每个vertex的主半边”具体做法为:遍历获取指向此vertex的所有半边,选择其中一个作为主半边即可;
55.其中,步骤四中所述的“设定每个半边的相邻半边关系hadjacent”具体做法为:由于每条边会存储指向此边的所有半边list,同时根据基于此数据结构的网格格式可知每个list中的数量必为偶数,即可以按照是否在同一个cube中将list中的半边两两一组,则每组的两个半边即互为相邻关系;
56.其中,步骤四中所述的“设定halfface对象的边界标志及细分标志”具体做法为:遍历face对象,若face对象所指向的两个halfface对象都不为空,则两个halfface的边界
标志均为假;否则若仅有一个不为空,则将不为空的此halfface的边界标志设为真;细分标志的设定需判定该面所在cube是否处于细分边界处,一般是在细分方法中进行设定;
57.通过以上步骤,可以完成一个基于半边半面数据结构的样条实体模型构建过程,构建完成的样条实体模型不仅可以完整表达实体模型的几何拓扑结构,同时具有可以局部细分的优良特性,可以广泛应用于诸如3d打印模型构建等场景。
58.(三)本发明的优点及有益效果在于:
59.1.本发明给出的数据结构具有更加清晰的逻辑结构,更加有效的数据组织,同时由于所有数据均以共享方式存储,因此可以大大减少存储空间的浪费,减少数据冗余,在提高运算效率的同时并降低模型数据的维护难度;
60.2.本发明给出的数据结构支持任意细分操作,可以表达拓扑结构更加复杂的实体模型,可适应于局部几何、材料等细节信息的描述,实际应用范围更加广泛;
61.本发明所述的数据结构即保留了b-rep模型本身边界表示的特点,又可以完整表达实体内部的几何与拓扑属性,比b-rep方法更加适合分析模型的表达,构建的模型可以直接用于等几何分析,可以省去模型转换的时间,提高分析效率;本发明所述的数据结构将实体模型的几何信息与拓扑信息分开进行描述,并且创造性地将各拓扑元素之间分离开来,相互之间的访问操作全部由半面及半边两种连接元素进行统一管理,可以更加高效高质量地管理实体模型的拓扑关系以及几何信息;
62.3.基于本发明所述的数据结构的框架,查找等功能的实现可使用局部搜索算法进行,这样做的好处是对于数据量较大的实体模型或者精细度较高的实体模型进行查找操作时,由于是局部搜索方式,因此查找的时间效率不会因为模型增大而降低,这也是本发明所述的数据结构所具有的优势之一。
63.4.基于本发明所述的方法生成的实体模型支持非均质材料样条模型的3d打印任务,且便于进行切片以及扫描路径生成。
64.5.本发明所述方法科学,工艺性好,具有广阔推广应用价值。
附图说明
65.图1为本发明所述的方法流程图。
66.图2为本发明所述的数据结构组织结构图。
67.图3为本发明所述的数据结构表示的实体模型示意图。
68.图4为使用本发明所述的数据结构构造的扳手实体模型示例的外观效果。
69.图5为图4所示扳手模型的内部剖面图及其局部放大效果示意图。
70.图6为基于本发明所述的方法生成扳手模型后进行3d打印的流程图。
71.图中序号、符号、代号说明如下:
72.图2:solidmesh代表整个模型的整体网格;cube代表实体单元,拓扑元素之一,每个solidmesh由许多cube组成;face代表相邻实体单元共用的边界处的面片对象,拓扑元素之一,两个相邻cube共享同一个face,但边界处face由一个cube独享;halfface代表半面对象,是连接体面拓扑元素与边点拓扑元素的中间元素之一;edge代表边对象,拓扑元素之一,每个面上至少有四条边;halfedge代表半边对象,是连接体面拓扑元素与边点拓扑元素的中间元素之一;vertex代表顶点对象,拓扑元素之一;anchor代表锚点对象,是用于描述
模型几何信息的核心元素。
73.图2:箭头表示不同元素之间的数据传递关系,其中实线箭头由上位元素指向下位元素,虚线箭头相反;上位元素可包含多个可进行数据传递的下位元素,但下位元素有且仅有一个上位元素,如图2中edge相对halfedge是上位元素就表示一个edge同时包含多个halfedge,但一个halfedge仅属于唯一的edge;不同元素对象之间的上下位关系是相对的,如图2中cube相对halfface是上位元素,halfface相对cube是下位元素;halfface相对halfedge是上位元素,halfedge相对halfface是下位元素,但整体而言,拓扑元素相对链接元素是上位元素。
具体实施方式
74.本发明提出了一种基于半边半面数据结构的3d打印实体模型生成方法,即一种面向3d打印模型生成的样条实体模型数据生成方法;本发明可应用于各种实体几何模型在计算机中的生成数据结构表示,特别是3d打印模型的生成,数据模型中更加清晰的相互依赖结构以及更加丰富的拓扑关系可以明显提高3d打印模型的生成精度以及实物的打印精度。下面结合一个将本发明应用于3d打印模型生成的扳手模型示例及附图,对本发明的技术方案进行清楚、完整的描述。
75.本发明为一种基于半边半面数据结构的3d打印实体模型生成方法,即一种基于半边半面数据结构的样条实体模型数据的生成方法,流程图如图1所示,以使用c++语言实现为例,数据结构组织图如图2所示,构建的扳手实例模型网格实例如图4、图5所示,构建的过程包括以下几个步骤:
76.步骤一、构建基础网格数据;
77.实例化一个实体网格对象solidmesh,此时已同时创建了多个列表,包括cubelist,facelist,edgelist,vertexlist,anchorlist,用于对此扳手实体模型中的拓扑对象以及几何对象进行id标识及统一管理。
78.此扳手模型的基础数据包括:37315个cube对象、117654个face对象、123606个edge对象、43267个vertex对象、1101391个anchor对象。逐个创建这些对象,同时为每个对象赋予必要的属性,包括:anchor对象的几何信息(即点的坐标arc4dpoint)、类型(type)、材料属性(material)等;vertex对象设定其所包含的anchorlist同时也为anchorlist中的锚点设定其指向的vertex;edge对象设定其节点距(interval);cube对象设定其所包含的anchorlist,其他必要属性将在后面的步骤中完成设定。
79.每个对象创建完成后分别以共享内存的方式存入对应的列表中并按照只增不减的原则获得唯一id标识。
80.步骤二、构建半面链接元素;
81.遍历上一步骤的facelist,对于每个face对象:非边界面情况下创建两个halfface对象,并设定两个halfface对象同时指向此面,但分别指向此面相邻的两个cube,同时把这两个halfface相互设定为hoppo关系;边界面情况下仅需创建一个halfface对象,设定此halfface对象指向此面同时指向此面所在的cube;
82.步骤三、构建半边链接元素;
83.通过遍历facelist对halfface进行遍历,对于每个halfface对象:
84.遍历获取halfface所在face上的边及点对象并按照逆时针顺序或单连通域正方向顺序将vertex及edge分别存放在临时的vertexlist以及edgelist;
85.根据拓扑关系可以直观知道vertexlist与edgelist的长度相同,因此建立一个临时的索引——从1开始且不大于其中一个list中的对象个数,索引递增的同时逐个创建相同数量的halfedge,并设定每个halfedge指向vertexlist及edgelist中与此halfedge具有相同索引的vertex及edge,同时将此halfedge存入该edge的halfedgelist中;
86.建立一个临时的halfedgelist,按照创建顺序,存放上述逐个创建的halfedge,对此list中的所有半边构建半边环,按照如下三种情况设定每个半边的前置半边hpre及后置半边hnext:
87.①
若半边在list开头位置,则此半边的后置半边为list第二个位置的半边,前置半边为list末尾位置的半边;
88.②
若半边在list末尾位置,则此半边的后置半边为list开头位置的半边,前置半边是list倒数第二个位置的半边;
89.③
若半边在list中间位置,则此半边的后置半边为list中下一个位置的半边,前置半边为list中上一个位置的半边。
90.步骤四、由已完成的数据补全所有已有对象中缺失的成员属性;
91.根据图2,还需进行补充的成员属性及实施方法如下:
92.设定每个cube的主半面:局部搜索获取指向此cube的halfface,按需选择一个作为主半面即可;
93.设定每个vertex的主半边:局部搜索获取指向此vertex的半边,按需选择一个作为主半边即可;
94.设定每个半边的相邻半边关系hadjacent:在步骤三中已将所有指向同一个edge的半边存入了同一个list,因此只需遍历edgelist,对每个edge中的halfedgelist:根据基于此数据结构的网格格式可知每个list中的半边数量必为偶数,因此可以按照是否在同一个cube中将halfedgelist中的半边两两分为一组,将每组的两个半边相互设定为相邻关系;
95.设定halfface对象的边界标志:遍历face对象,若face对象所指向的两个halfface对象都不为空,则两个halfface的边界标志均为假;否则若仅有一个不为空,则将不为空的此halfface的边界标志设为真。细分标志的设定需判定该面所在cube是否处于细分边界处,一般是在细分算法中进行设定。
96.半边转角信息hconertype及细分标志:一般是在细分算法中进行设定,未进行细分操作的初始模型默认所有半边转角为0,细分标志为假;
97.步骤五、网格模型完整性检查;
98.对上述构建完成的扳手实体网格按照构建规则进行拓扑结构检查,确保其包含的拓扑信息与链接元素之间的对应关系正确、完整,如检查每个边是否连接了两个点对象,检查是否有重复构建的半边半面或者其他冲突信息,如果有则需要按照图2及图3所示的数据结构图进行修复处理,最终构建完成的样条实体模型网格内各对象的局部相互关系如图3所示,图中立方体为cube对象,两个cube之间为face对象,每个face对象链接两个halfface对象。图中较小的圆点为anchor对象,较大的圆点为vertex对象,两个vertex对象之间由
edge对象进行连接,单边箭头代表halfedge对象,但值得一提的是半边及半面对象仅用于管理拓扑对象以及几何对象之间的链接关系,实际显示的网格模型是不包含这两个对象的,相当于一种概念对象。
99.按照上述步骤完成扳手模型的构建后,最终生成的模型外观如图4所示,内部剖面网格以及局部放大图如图5所示。可以由图4及图5看出实体模型是由分层的小实体单元彼此连接而成,因此基于本发明所述的方法创建的扳手模型完全支持切片成逐层的截面,从而指导打印机进行逐层打印,打印扳手的流程如图6所示。
100.在3d打印任务中,首先需要给定一个合适的切片方向,这样可以提高生产精度,减少打印耗时,生产出高质量少材料的支撑结构,也有利于提高最终产品的刚度和强度,一般情况下z轴就是一个非常合适的切片方向,但也可以根据实际打印任务的需要选择x轴y轴或自定义的其他方向作为切片方向。基于本发明所述的模型生成方法构建出扳手的实体模型后,在构建完成的模型中使用样条参数构造一个标量场,并使其梯度方向与z轴对齐,然后即可在参数域中直接对模型进行切片,即按照图5所示剖面的法线方向进行切片。为了构造这个标量场,可以先按照3d打印的需求自定义一个标量计算函数,并根据此函数计算模型内每个节点处的标量值,由此产生的等值线层在标量场中将沿梯度方向均匀分布,之后即可根据等值线按层进行切片。
101.另外,若针对异质样条模型的3d打印任务,则需要在构建扳手模型的过程中为每个节点赋予不同的材料属性,并在参数域将扳手模型生成切片网格,然后利用移动立方体技术,在参数域内形成一系列三角形切片层,最后映射到非均质材料的物理域上,即可完成切片过程。
102.完成扳手的切片后,将每个切片层的内部非均质材料离散为具有多个材料分区的离散梯度功能材料结果,根据curaengine(一种3d打印切片引擎,可用于3d打印切片模型的扫描路径生成等)的规则对每个离散分区的边界轮廓进行提取、配对和排序,以生成每个切片层的扫描路径。最后,将扫描路径生成为g代码,由配备多喷嘴的3d打印机生成最终的扳手实物。
103.自此就完成了本发明的全部过程。
104.以上所述仅为本发明的较佳实例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1