CN112767526B - 一种适用于纹理贴图的浮雕网格重构方法 - Google Patents

一种适用于纹理贴图的浮雕网格重构方法 Download PDF

Info

Publication number
CN112767526B
CN112767526B CN202110148219.6A CN202110148219A CN112767526B CN 112767526 B CN112767526 B CN 112767526B CN 202110148219 A CN202110148219 A CN 202110148219A CN 112767526 B CN112767526 B CN 112767526B
Authority
CN
China
Prior art keywords
vertex
edge
patch
grid
mesh
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110148219.6A
Other languages
English (en)
Other versions
CN112767526A (zh
Inventor
李佳泽
王胜法
郑晓朋
雷娜
罗钟铉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Dalian University of Technology
Original Assignee
Dalian University of Technology
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Dalian University of Technology filed Critical Dalian University of Technology
Priority to CN202110148219.6A priority Critical patent/CN112767526B/zh
Publication of CN112767526A publication Critical patent/CN112767526A/zh
Application granted granted Critical
Publication of CN112767526B publication Critical patent/CN112767526B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/04Texture mapping

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Graphics (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Image Generation (AREA)

Abstract

本发明属于计算机辅助设计、工业设计制造技术领域,提供了一种适用于纹理贴图的浮雕网格重构方法。首先,根据导入的纹理图像边缘采样,对由导入的模型文件数据构建的三角网格,进行网格细分。然后,通过网格生成,重构浮雕边缘网格和浮雕表面网格。最后导出网格重构后的模型文件,完成浮雕网格重构。与普通网格重构方法相比,该方法减少了不必要顶点的生成,效率更高,而且能展现浮雕更多的细节,效果更好。

Description

一种适用于纹理贴图的浮雕网格重构方法
技术领域
本发明属于计算机辅助设计、工业设计制造技术领域,涉及一种适用于纹理贴图的浮雕网格重构方法。
背景技术
将图片转化为模型上三维浮雕网格常见的方法是先将网格等面积重构,细分,然后通过建立模型顶点与图像像素的映射,调整顶点位置以实现浮雕网格重构。然而这种方法会生成很多不必要顶点,不仅影响浮雕网格重构效率,浪费计算机存储空间,而且精度上不够高,影响浮雕网格效果。
本发明提出的适用于纹理贴图的浮雕网格重构方法具有实现容易,效率高,效果好等诸多优点,非常适用于浮雕网格建模。
发明内容
为解决上述问题,本发明提出一种适用于纹理贴图的浮雕网格重构方法,流程如图1所示。首先,根据导入的纹理图像边缘采样,对由导入的模型文件数据构建的三角网格,进行网格细分。然后,通过网格生成,重构浮雕边缘网格和浮雕表面网格。最后导出网格重构后的模型文件,完成浮雕网格重构。
本发明的技术方案:
一种适用于纹理贴图的浮雕网格重构方法,步骤如下:
(1)根据纹理图像边缘的网格细分
(1.1)纹理面片的构建
根据面片f1,f2......fnf构建对应的纹理面片集合UVF1={uvf1,uvf2......uvfnf},其中,fa与uvfa一一映射,1≤a≤nf,a∈N+;nf为初始网格面片最大索引值;uvfa顶点坐标为fa顶点UV坐标;
(1.2)纹理边缘采样点的位置分布
第一步,根据uvf1,uvf2......uvfnf分割纹理,得到纹理集合S1={s1,s2......snf},其中uvfa与sa一一映射;sa具体参数如下:
Figure BDA0002931520410000021
Figure BDA0002931520410000022
其中,
Figure BDA0002931520410000023
为uvfa三个顶点坐标中U轴坐标最大值;
Figure BDA0002931520410000024
为uvfa顶点坐标中V轴坐标最大值,
Figure BDA0002931520410000025
为上述UV坐标中U轴最小值;
Figure BDA0002931520410000026
为上述UV坐标中V轴最小值;
Figure BDA0002931520410000027
为sa的宽度;
Figure BDA0002931520410000028
为sa的高度;
Figure BDA0002931520410000029
为sa左上角坐标相对于纹理图像T左上角坐标的偏移量;Twidth为T宽度,Theight为T高度;
第二步,分别对s1,s2......snf进行查找边缘;对于sa,查找边缘后得到轮廓集合SVa={sva1,sva2......sv},且svab={svab1,svab2......svabβ};其中,sa与SVa一一映射;svab为SVa中第b个轮廓采样点序列,且1≤b≤α,α为轮廓数量;svabc为svab中第c个采样点,且1≤c≤β,β为svab中采样点数量;svabc在T上坐标为
Figure BDA00029315204100000210
Figure BDA00029315204100000211
Figure BDA00029315204100000212
计算过程如下:
Figure BDA00029315204100000213
其中,
Figure BDA00029315204100000214
为svabc在sa上像素坐标;
Figure BDA00029315204100000215
为sa左上角坐标相对于纹理图像T左上角坐标的偏移量;
第三步,判断采样点位置;分别判断与s1,s2......snf对应的轮廓集合SV1,SV2......SVnf中的采样点集中采样点相对于面片和网格边的位置,并建立边上采样点集合SOE={soe1,soe2......soene},soed={soev1,soev2......soevnse},其中ed与soed一一映射,1≤d≤ne;ne为初始网格边最大索引值;nse为soed中采样点数量;建立面片上采样点集合SOF={sof1,sof2......sofnf},sofa={sofv1,sofv2......sofvnsf},其中fa与sofa一一映射,nsf为sofa中采样点数量;
(1.3)采样边的构建
通过采样点得到采样边集合SE={se1,se2......senf},seg={seg1,seg2......segsne};其中,sea与sa一一映射,即sea为根据sa中采样点位置得到的采样边集合;segh为第h个插入seg的采样边,1≤h≤sne,sne为seg中采样边数量;
(1.4)多余采样点的删除
对于所有采样点,利用分治法,删除位置相同或两点之间欧式距离小于εv的采样点中的一个;
(1.5)根据采样点的网格细分
第一步,依次对面片f1,f2......fnf引入变量Ancestor,并将Ancestor赋值为面片索引,fa的Ancestora为a,Ancestora表示fa的Ancestor;
第二步,按照如下步骤进行网格细分:
1)依次遍历soe1,soe2......soecne1,对于每一个集合,找到soep中与ep中点的欧式距离最小的采样点soevdismin,其中,dismin取值唯一且1≤dismin≤nse;cne1为变量,随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等,初始值为ne;1≤p≤cne1,p∈N+;根据soevdismin的几何信息和ep顶点几何信息计算插值,在网格中生成新的顶点vnewk,其中,newk为生成新顶点后网格顶点最大索引值,然后对ep引入分割点变量SplitVertex,将vnewk赋值予SplitVertexp,SplitVertexp表示与ep对应的分割点变量;
2)构建面片集合WSF1
①依次遍历f1,f2......fcnf1,对于每个面片,如果三条边中的任意一条边包含变量SplitVertex,将该面片插入WSF1;其中,cnf1随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等,初始值为nf;
②依次遍历WSF1中面片元素,直至所有元素被遍历;对于fi,如果
Figure BDA0002931520410000041
上不包含
Figure BDA0002931520410000042
则计算
Figure BDA0002931520410000043
中点插值,在网格上生成新的顶点vnewi,其中,1≤i≤cnf1,i∈N+,fi∈WSF1;longest表示该边为fi最长边,
Figure BDA0002931520410000044
为fi的最长边;
Figure BDA0002931520410000045
Figure BDA0002931520410000046
的分割点变量;newi为生成新顶点后网格顶点数量;然后,对
Figure BDA0002931520410000047
引入变量
Figure BDA0002931520410000048
将vnewi赋值予
Figure BDA0002931520410000049
接着,删除ASi中与vnewi的UV坐标的欧式距离小于εv的采样点,并将以这些采样点为端点的采样边的对应端点坐标替换为vnewi的UV坐标,其中
Figure BDA00029315204100000410
Figure BDA00029315204100000411
分别为与fi三条边对应的SOE中的采样点集合;最后,如果另一个以
Figure BDA00029315204100000412
为边的三角面片没有在WSF1中,则将其插入WSF1
③依次遍历WSF1中面片元素,根据各面片边上SplitVertex建立拓扑关系,细分网格,具体步骤如下:
a.如果面片中有且只有1条边上有SplitVertex,以SplitVertex和不含SplitVertex的两条边的公共顶点为端点,构建新边,将三角面片分割为2个新面片;如果面片中有且只有2条边上有SplitVertex,连接两个SplitVertex,构成第一条新边;因为连接SplitVertex和另外两条边公共顶点有两种情况,所以比较这两种情况下新建边的长度,选取更短的情况构成第二条新边;新建的两条新边将面片分为3个新面片;如果面片中有3条边上有SplitVertex,依次连接三个SplitVertex,构成三条新边,将三角面片分割为4个新面片;
b.将a的取值范围改为1≤a≤cnf1,a∈N+;将d的取值范围改为1≤d≤cne1,d∈N+
c.对于每一个面片,将被分割前与该面片对应的SOF中的采样点集合和与该面片三条边分别对应的SOE中的采样点集合中的采样点分配到与新面片对应的采样点集合和与新网格边对应的采样点集合,并分别插入SOF,SOE;
d.对于每一个面片,将面片Ancestor变量值赋予通过分割该面片得到的新面片的Ancestor变量;
4)重复步骤1)—3),直至soe1,soe2......soecne1都变为空集;然后遍历sof1,sof2......sofcnf1,直至找到一个采样点集合不为空集,具体步骤如下:
①找到该集合中与该集合对应的纹理面片重心的欧式距离最小的采样点元素,将采样点从集合中删除,并根据该采样点与该纹理面片对应的网格面片顶点几何信息计算插值,在网格上生成新的顶点vnewa;其中,newa为新顶点生成后网格顶点最大索引值;
②将vnewa与面片顶点分别连接,构成三条新边,将面片分割为三个新面片;
③将a的取值范围改为1≤a≤cnf1,a∈N+;将d的取值范围改为1≤d≤cne1,d∈N+
④对于每一个被分割面片,将被分割前与该面片对应的SOF中的采样点集合中的采样点元素,分配到与新面片对应的采样点集合和与新网格边对应的采样点集合,并分别将这些集合插入SOE和SOF;
⑤对于每一个被分割面片,将面片Ancestor变量值赋予通过分割该面片得到的新面片的Ancestor变量;
5)重复步骤1)—4),直至soe1,soe2......soecne1,sof1,sof2......sofcnf1都变为空集;
(1.6)根据采样边的网格细分
第一步,根据Ancestor变量建立AF={af1,af2......afnf},afj={fk|(Ancestork=j)∧(1≤k≤cnf2∧k∈N+)},其中,1≤j≤nf,j∈N+;cnf2随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等;
第二步,计算采样边与网格边的相交情况,细分网格;依次遍历AF中每个集合,对于每一个AF集合,具体步骤如下:
1)构建边集ae,依次遍历集合中的面片元素,对于面片的各条边,如果以该边为边的两个面片的Ancestor值都与集合对应的Ancestor值相同,则将该边插入集合ae,其中ae中元素不重复;
2)依次遍历SE中与该面片集合对应的采样边集合中的采样边元素,细分网格;对于每一条采样边元素,具体步骤如下:
①根据采样边端点坐标和网格边顶点UV坐标将采样边和ae中网格边元素转至普吕克坐标系;
②建立网格边集合inserte;依次遍历ae中各网格边,在普吕克坐标系下,计算网格边与采样边是否相交,如果相交,将该网格边插入集合inserte;
③依次遍历inserte中网格边元素,根据交点生成网格顶点,建立WSF2集合,对于每条网格边,根据该网格边顶点和该采样边端点几何信息,计算网格边与采样边交点的几何信息,并在网格上生成新的顶点vnewb;其中,newb为新顶点生成后网格顶点最大索引值;将vnewb赋值予网格边的SplitVertex变量;将以该网格边为边的面片插入WSF2
④依次遍历WSF2中面片元素,进行网格细分;细分方式与(1.5)的2)中③相同;
⑤将通过本次细分得到的新的网格边插入ae;
(2)3D浮雕网格重构
(2.1)网格面片颜色属性的标记
第一步,根据面片
Figure BDA0002931520410000071
构建对应的纹理面片集合
Figure BDA0002931520410000072
其中,cnf3为变量,随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等;
第二步,根据
Figure BDA0002931520410000073
分割纹理,得到纹理集合
Figure BDA0002931520410000074
具体参照(1.2)第一步;
第三步,根据纹理图像像素值,二值化为0和255,判断面片
Figure BDA0002931520410000075
的颜色属性,依次遍历
Figure BDA0002931520410000076
对于每个纹理面片,具体步骤如下:
1)分别将纹理面片顶点坐标转至与该纹理面片对应的S中的图像像素坐标系下;
2)在图像坐标系下,遍历位于纹理面片内部的像素点,如果像素值为0的像素点数量占所有位于纹理面片内部的像素点数量的εcolor,则将该面片标记为Blackface;同理,如果像素值为255的像素点数量占εcolor,则将该面片标记为Whiteface;εcolor取90%,因误差等因素,可逐渐降低εcolor,直至判断面片颜色属性;
(2.2)网格顶点和网格边属性的标记
第一步,标记网格边和顶点的边缘属性;遍历
Figure BDA0002931520410000077
其中,cne3为变量,随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等;对于每条网格边,如果以该网格边为边的两个三角面片的颜色属性不一致,则将该网格边标记为Boundaryedge,同时将该网格边的两个端点标记为Boundaryvertex
第二步,标记网格顶点的颜色属性;遍历
Figure BDA0002931520410000078
其中,cnv3为变量,随网格顶点索引最大值变化而变化,值始终与当前网格顶点索引最大值相等;对于每个网格顶点,如果该顶点没有被标记为Boundaryvertex,说明该顶点的一阶领域三角面片颜色属性相同,且该顶点与一阶领域三角面片颜色属性相同,比如该顶点的一阶领域三角面片颜色属性为Blackface,则将该顶点标记为Blackvertex
(2.3)网格面片边缘属性的标记
标记网格面片边缘属性,依次遍历面片
Figure BDA0002931520410000081
对于每个面片,具体步骤如下:
1)依次遍历该面片三个顶点,如果三个顶点都没有被标记为Boundaryvertex,则将该面片标记为NotBoundaryface;如果至少有一个顶点被标记为Boundaryvertex,继续执行(2.3)的2);
2)依次遍历该面片三条边,有以下3种标记情况:
①没有边被标记为Boundaryedge,且该面片颜色属性为Blackface,则将该面片标记为BoundaryInface
②没有边被标记为Boundaryedge,且该面片颜色属性为Whiteface,则将该面片标记为BoundaryOutface
③至少有一边被标记为Boundaryedge,则将该面片标记为Boundaryface
(2.4)网格点环的生成
根据浮雕边缘网格顶点拓扑信息,生成网格点环,具体步骤如下:
1)建立网格边不重复集合ringedge,网格顶点集合ringvertex,依次遍历
Figure BDA0002931520410000082
对于每个网格顶点,如果以该顶点为端点的网格边中,有大于两条网格边被标记为Boundaryedge,将该顶点插入ringvertex
2)生成网格顶点;依次遍历ringvertex中网格顶点元素,对于每一个网格顶点,遍历以该顶点为端点的所有网格边,对于每一条网格边,在距离(欧式距离)该顶点dist的网格边上计算插值,生成网格顶点vnewd;其中,newd为生成新顶点后网格顶点最大索引值;dist取该网格边长度的εring,εring取2.0*10-5;将vnewd赋值予该网格边的SplitVertex变量;
3)生成网格拓扑信息;依次遍历ringvertex中网格顶点元素,对于每一个顶点,具体步骤如下:
①遍历该顶点的一阶领域三角面片,对于每一个面片,根据网格顶点,建立拓扑信息:
以该顶点为起始顶点,逆时针遍历该面片顶点,分别赋予临时别名v1,v2,v3;以v1和v2为端点的网格边SplitVertex变量值称为SplitVertex1,以v1和v3为端点的网格边SplitVertex变量值称为SplitVertex2
连接SplitVertex1和SplitVertex1,构成第一条新网格边;连接SplitVertex1和v2,构成第二条新网格边;该面片被分割为三个新面片;
②标记新面片的颜色属性;将该顶点的一阶领域三角面片标记为Whiteface;该顶点的二阶领域三角面片标记为母面片颜色属性;
(2.5)(2.1)-(2.4)的迭代
清除网格顶点,边,面片的边缘属性,迭代进行(2.1)-(2.4),直至所有网格顶点都满足:以该顶点为端点的所有网格边中,有不超过2条被标记为Boundaryedge
(2.6)浮雕边缘网格和表面网格的重构
第一步,根据被标记为Boundaryvertex生成新的网格顶点;具体步骤如下:
1)建立集合BoundarySetvertex;将
Figure BDA0002931520410000091
中,被标记为Boundaryvertex的顶点插入BoundarySetvertex;其中cnv4随网格顶点索引最大值变化而变化,值始终与当前网格顶点索引最大值相等;
2)生成新的网格顶点;依次遍历BoundarySetvertex中顶点元素,对于每个网格顶点,根据该顶点几何信息,生成新的网格顶点vnewe,其中,newe为生成新顶点后网格顶点最大索引值,vnewe的几何信息计算过程如下:
Figure BDA0002931520410000101
Figure BDA0002931520410000102
其中,其中
Figure BDA0002931520410000103
分别为vnewe的模型坐标和UV坐标;
Figure BDA0002931520410000104
分别为该顶点的模型坐标和UV坐标;
Figure BDA0002931520410000105
为该顶点的归一化法线坐标;εrelief在网格归一化的情况下取0.1;为该顶点引入变量Above,并将vnewe赋值予Above;
3)根据网格顶点,建立拓扑信息;具体步骤如下:
①建立浮雕边缘拓扑信息;首先建立BoundarySetedge;依次遍历E={e1,e2......ecne4},其中cne4随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等;对于每一条网格边,如果该网格边被标记为Boundaryedge,将该网格边插入集合BoundarySetedge
依次遍历BoundarySetedge中网格边元素,对于每一条网格边,暂称以该网格边为边并且颜色属性为Blackface的三角面片为fB,以fB中非该网格边端点的顶点为起点,逆时针遍历,先遍历到的顶点(不包含起点)称为ev1,后遍历到的称为ev2
新建面片fnew1,fnew2,fnew1的顶点为Above1,ev1,Above2;fnew2的顶点为Above2,ev1,ev2;其中,Above1,Above2分别为ev1,ev2的Above值;new1,new2分别为生成新面片后网格面片最大索引值;
②创建浮雕表面拓扑信息;首先,创建集合reliefface;依次遍历
Figure BDA0002931520410000106
其中,cnf4为当前网格面片最大索引值;将被标记为BoundaryInface和Boundaryface的面片插入reliefface;接着,依次遍历reliefface中的面片元素,对于每个面片,依次遍历该面片的顶点,如果顶点有变量Above且Above不为空值,则用Above值替代该顶点成为新的顶点,所有顶点更改后构成新面片,删除原面片;
(2.7)网格顶点位置的调整
依次遍历所有没有被标记为Boundaryvertex且颜色属性为Blackvertex的网格顶点,对于每个顶点,该顶点新的模型坐标vnewpos计算过程如下:
vnewpos=vposrelief*vnormal (2.3)
其中,vpos为该顶点未调整前的模型坐标;vnormal为该顶点的归一化法线坐标;εrelief在网格归一化的情况下取0.1就得到凸出明显的浮雕。
本发明的有益效果:本发明提出一种适用于纹理贴图的浮雕网格重构方法,通过适用于纹理图像信息的网格细分,网格生成,重构了浮雕边缘网格和浮雕表面网格。通过本发明重构浮雕网格,过程简洁,细节突出,效果精细。与普通网格重构方法相比,该方法减少了不必要顶点的生成,效率更高,而且能展现浮雕更多的细节,效果更好。
附图说明
图1是本发明的流程图。
图2(a)是用于构建图2(b)纹理面片的网格面片示意图。
图2(b)是由图2(a)网格面片构建的纹理面片示意图。
图3是网格边细分示意图。
图4(a)是网格边细分(新建边长于图4(b))示意图。
图4(b)是网格边细分(新建边短于图4(a))示意图。
图5是网格边细分示意图。
图6是网格面片细分示意图。
图7是点环生成网格边细分示意图。
图8(a)是点环生成(网格重构前)示意图。
图8(b)是点环生成(网格重构后)示意图。
图9是浮雕边缘的网格重构示意图。
图10是浮雕表面的网格重构示意图。
图11(a)是输入纹理示意图。
图11(b)是三维雕刻结果示意图。
图11(c)是三维雕刻结果(侧面角度)示意图。
图11(d)是三维雕刻结果(不同渲染)示意图。
图11(e)是带有纹理贴图的三维浮雕结果示意图。
具体实施方式
以下结合附图和技术方案,进一步说明本发明的具体实施方式。
一种适用于纹理贴图的浮雕网格重构方法,具体可分为导入模型文件和图像文件;根据导入的纹理图像边缘采样点,对由导入的模型文件数据构建的三角网格,进行网格细分;通过网格生成,重构浮雕边缘网格和浮雕表面网格;导出网格重构后的模型文件这四个主要步骤:
(一)模型文件和图像文件的导入
以M模型和P图像为例。
可以使用Assimp等库读取M模型文件(obj,stl等),并使用半边数据结构存储M模型网格数据。根据模型文件数据构建三角网格,三角网格M由(V,E,F)表示,其中V={v1,v2......vnv}为网格顶点集合,E={e1,e2......ene}为网格边集合,F={f1,f2......fnf}为网格面片集合。其中,nv表示初始网格顶点索引最大值;ne表示初始网格边索引最大值;nf表示初始网格面片索引最大值。
可以使用OpenCV等库读取P图像文件(bmp,png等),并将图像灰度化后二值化,像素灰度值为0或255。二值化后的P图像称为图像T。T的宽度为Twidth,高度为Theight
(二)根据图像T边缘的格细分
根据面片f1,f2......fnf构建对应的纹理面片集合UVF={uvf1,uvf2......uvfnf},其中fi与uvfi一一映射,1≤i≤nf,i∈N+
如图2,fi顶点为
Figure BDA0002931520410000131
uvfi顶点为
Figure BDA0002931520410000132
其中,
Figure BDA0002931520410000133
坐标为
Figure BDA0002931520410000134
的UV坐标
Figure BDA0002931520410000135
Figure BDA0002931520410000136
坐标为
Figure BDA0002931520410000137
的UV坐标
Figure BDA0002931520410000138
Figure BDA0002931520410000139
坐标为
Figure BDA00029315204100001310
的UV坐标
Figure BDA00029315204100001311
Figure BDA00029315204100001312
为边
Figure BDA00029315204100001313
顶点;
Figure BDA00029315204100001314
为边
Figure BDA00029315204100001315
顶点;
Figure BDA00029315204100001316
为边
Figure BDA00029315204100001317
顶点。
接着,根据uvf1,uvf2......uvfnf分割纹理,得到纹理集合S1={s1,s2......snf},其中uvfi与si一一映射。si具体参数如下:
Figure BDA00029315204100001318
Figure BDA00029315204100001319
其中,
Figure BDA00029315204100001320
为面片uvfi顶点
Figure BDA00029315204100001321
的坐标
Figure BDA00029315204100001322
中U轴坐标最大值;
Figure BDA00029315204100001323
为面片uvfi顶点
Figure BDA00029315204100001324
的UV坐标
Figure BDA00029315204100001325
Figure BDA00029315204100001326
中V轴坐标最大值。同理,
Figure BDA00029315204100001327
为上述UV坐标中U轴最小值;
Figure BDA00029315204100001328
为上述UV坐标中V轴最小值。
Figure BDA00029315204100001329
为si的宽度;
Figure BDA00029315204100001330
为si的高度;
Figure BDA00029315204100001331
为si左上角坐标相对于T左上角坐标的偏移量。
接着,可以使用OpenCV等库分别对s1,s2......snf进行查找边缘,以si为例,查找边缘后得到轮廓集合SVi={svi1,svi2......sv},且svij={svij1,svij2......svijβ}。其中,si与SVi一一映射,svij为SVi中第j个轮廓采样点序列,且1≤j≤α,α为轮廓数量;svijk为svij中第k个采样点,且1≤k≤β,β为svij中采样点数量。svijk在T上坐标为
Figure BDA00029315204100001332
Figure BDA00029315204100001333
计算过程如下:
Figure BDA0002931520410000141
其中,
Figure BDA0002931520410000142
为svijk在si上像素坐标。
Figure BDA0002931520410000143
为si左上角坐标相对于T左上角坐标的偏移量。
接着,判断采样点位置。分别判断s1,s2......snf的轮廓集SV1,SV2......SVnf中的采样点集中采样点的位置,并建立边上采样点集合SOE={soe1,soe2......soene},soed={soev1,soev2......soevnse},其中ed与soed一一映射,1≤d≤ne;soevtemp1为SVi中svij轮廓中的svijk的别名,1≤temp1≤nse;建立面上采样点集合SOF={sof1,sof2......sofnf},sofi={sofv1,sofv2......sofvnsf},其中fi与sofi一一映射,nsf为sofi中采样点数量,sofvtemp2为SVi中svij轮廓中的svijk的别名,1≤temp2≤nsf。
以采样点svijk为例,如果svijk与uvfi顶点
Figure BDA0002931520410000145
中的某一顶点的欧式距离小于εv,则将svijk标记为OnEdge;或者svijk与uvfi
Figure BDA0002931520410000146
中的某一条边的欧式距离小于εe,则将svijk标记为OnEdge,并将svijk插入与该边插入SOE中的与之对应的集合;如果svijk与uvfi的三条边的欧式距离都大于εe并且与三个顶点的欧式距离都大于εv,并且svijk在uvfi内部,则将svijk标记为InsideFace,并将svijk插入sofi;如果svijk与uvfi的三条边的欧式距离都大于εe并且与三个顶点的欧式距离都大于εv,并且svijk在uvfi外部,则将svijk标记为OutsideFace。其中,εv取1.0*10-3e取5.0*10-4。判断位于内部还是外部的方法如下:
因为需要计算外积,所以先将svijk坐标和顶点
Figure BDA0002931520410000147
坐标拓展到三维,且第三维赋值0.0。svijk坐标变为
Figure BDA0002931520410000148
uvvi1坐标变为
Figure BDA0002931520410000149
uvvi2坐标变为
Figure BDA00029315204100001410
uvvi3坐标变为
Figure BDA00029315204100001411
然后通过(3.4),(3.5),(3.6)计算,
Figure BDA00029315204100001412
Figure BDA0002931520410000151
Figure BDA0002931520410000152
得到
Figure BDA0002931520410000153
如果
Figure BDA0002931520410000154
方向完全相同,则svijk在uvfi内部;如果
Figure BDA0002931520410000155
方向不完全相同,则svijk在uvfi外部。
接着,通过采样点得到采样边集合SE={se1,se2......senf},sei={sei1,sei2......seisne}。其中,sei与si一一映射,即sei为根据si中采样点位置得到的采样边集合,siq为第q个插入sei的采样边,1≤q≤sne,sne为sei中采样边数量。得到采样边的具体方式如下:
依次以svij1和svij2,svij2和svij3……svijk和svijk+1……svijnse-1和svijnse,以及svijnse和svij1为采样边端点,判断是否需要插入sei中。以svijk和svijk+1为例,并设当前需要的判断的采样边为seexample1,1≤example1≤sne,如果svijk和svijk+1的标记情况符合以下任意一种情况,
①svijk:InsideFace svijk+1:InsideFace
②svijk:InsideFace svijk+1:OnEdge
③svijk:OnEdgesvijk+1:InsideFace
则将seexample1插入sei;如果svijk和svijk+1的标记情况符合下面两种情况的一种,
①svijk:InsideFacesvijk+1:OutsideFace
②svijk:OutsideFace svijk+1:InsideFace
则按照下面步骤:
1)分别计算uvfi的三个顶点
Figure BDA0002931520410000156
到seexample1的距离dist1。
2)如果某一顶点与seexample1的欧式距离小于dist1≤εe,进行步骤a,否则,进行步骤b。
a.将seexample1中被标记为OutsideFace的端点坐标替换为该顶点坐标,然后将seexample1插入sei
b.判断uvfi的三条边uvei1,uvei2,uvei3与seexample1的相交情况,如果某边与seexample1相交,计算交点,并将seexample1中被标记为OutsideFace的端点坐标替换为交点坐标,然后将交点作为采样点标记为OnEdge,并将其插入svi1和与该边在SOE中对应的集合,然后将seexample1插入sei
有些采样点位置相同或者两点之间欧式距离小于εv,所以接着需要删除多余的采样点。依次以面片f1,f2......fnf为单位,进行如下步骤:
1)构建采样点集ASi,其中
Figure BDA0002931520410000161
Figure BDA0002931520410000162
分别为与fi三条边对应的SOE中的采样点集合
2)基于分治法,找到ASi中的最近点对,如果两点之间欧式距离小于εv,进行如下步骤:
删除其中一个采样点,并将以该采样点为端点的采样边的对应端点坐标替换为另一个采样点的坐标。
3)重复2)直至最近点对两点之间欧式距离大于εv
接着,依次对面片f1,f2......fnf引入变量Ancestor,并将Ancestor赋值为面片索引。比如f1的Ancestor为1,f2的Ancestor为2,以此类推。Ancestori表示fi的Ancestor。
接着,按照如下步骤进行网格细分:
1)依次遍历soe1,soe2......soecne1,以soer为例,找到soer中与er中点的欧式距离最小的采样点soevdismin。其中,dismin取值唯一且1≤dismin≤nse;cne1为变量,随网格边最大索引值变化而变化,值始终与当前网格边索引最大值相等,初始值为ne;1≤r≤cne1,r∈N+。根据soevdismin的几何信息在网格中生成新的顶点vnewa,其中,newa为生成新顶点后网格顶点最大索引值,vnewa的几何信息包括
Figure BDA0002931520410000163
Figure BDA0002931520410000164
其中
Figure BDA0002931520410000165
为vnewa的模型坐标,
Figure BDA0002931520410000166
为vnewa的UV坐标,
Figure BDA0002931520410000167
Figure BDA0002931520410000168
计算过程如下:
Figure BDA0002931520410000171
Figure BDA0002931520410000172
其中,
Figure BDA0002931520410000173
为er端点
Figure BDA0002931520410000174
模型坐标。
Figure BDA0002931520410000175
为soevm的坐标。scalet1的计算过程如下:
①分别计算
Figure BDA0002931520410000176
的UV坐标U轴和V轴的坐标差值udiff和vdiff,其中
Figure BDA0002931520410000177
Figure BDA0002931520410000178
②如果udiff<=εthreshold,按照方式a计算;如果vdiff<=εthreshold,按照方式b计算;如果udiff>εthreshold且vdiff>εthreshold,按照方式c计算
Figure BDA0002931520410000179
Figure BDA00029315204100001710
Figure BDA00029315204100001711
其中,
Figure BDA00029315204100001712
的UV坐标为
Figure BDA00029315204100001713
Figure BDA00029315204100001714
的UV坐标为
Figure BDA00029315204100001715
对er引入变量SplitVertex,将vnewa赋值予SplitVertex,SplitVertexr表示与er对应的分割点变量。
2)将任意一条边上包含SplitVertex变量(SplitVertex不为空值)的面片插入集合(元素不重复)WSF1,具体步骤如下:
①依次遍历f1,f2......fcnf1,如果面片的三条边中的任意一条边包含变量SplitVertex(SplitVertex不为空值),将该面片插入WSF1,其中cnf1随网格面片最大索引值变化而变化,值始终与当前网格面片索引最大值相等。
②依次遍历WSF1中面片,直至所有面片被遍历。以fexm为例,如果fexm的最长边
Figure BDA0002931520410000181
上不包含变量
Figure BDA0002931520410000182
则参照
Figure BDA0002931520410000183
中点几何信息,在网格上生成新的顶点vnewb,其中,1≤exm≤cnf1,exm∈N+,fexm∈WSF1;longest表示该边为fexm最长边,
Figure BDA0002931520410000184
为fexm的最长边;
Figure BDA0002931520410000185
Figure BDA0002931520410000186
的分割点变量;newb为成新顶点后网格顶点最大索引值,vnewb的几何信息包括
Figure BDA0002931520410000187
Figure BDA0002931520410000188
其中
Figure BDA0002931520410000189
为vnewb的模型坐标,
Figure BDA00029315204100001810
为vnewb的UV坐标,
Figure BDA00029315204100001811
Figure BDA00029315204100001812
计算过程如下:
Figure BDA00029315204100001813
Figure BDA00029315204100001814
其中,
Figure BDA00029315204100001815
为两个端点的模型坐标;
Figure BDA00029315204100001816
Figure BDA00029315204100001817
两个端点的UV坐标。
③将vnewb赋值予
Figure BDA00029315204100001818
④以面片fexm为单位,删除与vnewb的UV坐标欧式距离小于εv的采样点,具体步骤如下:
a.构建采样点集ASexm,其中
Figure BDA00029315204100001819
Figure BDA00029315204100001820
分别为与fexm三条边对应的SOE中的采样点集合
b.依次遍历ASexm中元素,删除与vnewb的UV坐标的欧式距离小于εv的采样点,并将以这些采样点为端点的采样边的对应端点坐标替换为vnewb的UV坐标
⑤如果另一个以
Figure BDA00029315204100001821
为边的三角面片没有在WSF中,则将其插入WSF。
3)依次遍历WSF中元素,根据各面片边上变量SplitVertex建立拓扑关系,细分网格,以fexm为例,具体步骤如下:
①如果fexm中有且只有1条边上有变量SplitVertex(SplitVertex不为空值),以边上SplitVertex和不含SplitVertex的两条边的公共顶点为端点,构建新边,将三角面片分割为2个新面片,如图3;如果fexm中有且只有2条边上有变量SplitVertex(SplitVertex不为空值),连接两个SplitVertex,构成第一条新边;因为连接SplitVertex和另外两条边公共顶点有两种情况(如图4(a),图4(b)),所以比较这两种情况下新建边的长度,选取更短的情况构成第二条新边。新建的两条新边将面片分为3个新面片,如图4(b)。如果fexm中有3条边上有变量SplitVertex(SplitVertex不为空值),依次连接三个SplitVertex,构成三条新边,将三角面片分割为4个新面片,如图5。
②将fexm被分割前与fexm三条边
Figure BDA0002931520410000191
分别一一对应d的
Figure BDA0002931520410000192
中的采样点和sofexm中的采样点分配到与新网格面片一一对应的采样点集合和新网格边一一对应的采样点集合中,并将这些集合分别插入SOF和SOE。
③将Ancestorexm变量值赋予通过分割fexm得到的新面片的Ancestor变量。
4)重复1)—3),直至soe1,soe2......soecne1都变为空集。然后遍历sof1,sof2......sofcnf1,以sofexm2为例,其中,1≤exm2≤cnf1,exm2∈N+。具体步骤如下:
①依次遍历sofexm2中采样点元素,找到与uvfexm2重心的欧式距离最小的采样点sofvdismin,根据sofvdismin几何信息,在网格上生成新的顶点vnewc。其中,newc为生成新顶点后网格顶点最大索引值,vnewc的几何信息包括
Figure BDA0002931520410000193
Figure BDA0002931520410000194
其中
Figure BDA0002931520410000195
为的模vnewc型坐标,
Figure BDA0002931520410000196
为vnewc的UV坐标,
Figure BDA0002931520410000197
Figure BDA0002931520410000198
计算过程如下:
Figure BDA0002931520410000199
Figure BDA00029315204100001910
Figure BDA0002931520410000201
Figure BDA0002931520410000202
其中,
Figure BDA0002931520410000203
分别为fexm2三个顶点
Figure BDA0002931520410000204
的模型坐标;
scalem1,scalen1的计算过程如下:
Figure BDA0002931520410000205
Figure BDA0002931520410000206
Figure BDA0002931520410000207
Figure BDA0002931520410000208
Figure BDA0002931520410000209
其中,
Figure BDA00029315204100002010
分别为fexm2三个顶点
Figure BDA00029315204100002011
的UV坐标;
Figure BDA00029315204100002012
②将vnewc与fexm2顶点
Figure BDA00029315204100002013
分别连接,构成三条新边,将面片分割为三个新面片,如图6。
③将与fexm2一一对应的sofexm2中采样点分配到与新网格面片一一对应的采样点集合和新网格边一一对应的采样点集合中,并将这些集合分别插入SOF和SOE。
④将Ancestorexm2变量值赋予新面片的Ancestor。
5)重复1)—4),直至soe1,soe2......soecne1,sof1,sof2......sofcnf1都变为空集。
接着,根据Ancestor变量建立AF={af1,af2......afnf},afexm3={ftemp3|(Ancestortemp3=exm3)∧(1≤temp3≤cnf2∧cnf2∈N+)},其中,1≤exm3≤nf,exm3∈N+;cnf2随网格面片最大索引值变化而变化,值始终与当前网格面片索引最大值相等。
接着,计算采样边与网格边的相交情况,细分网格。依次遍历AF={af1,af2......afnf},以afexm3为例,具体步骤如下:
1)依次遍历afexm3中的面片元素,对于面片的各条边,如果以该边为边的两个面片的Ancestor值都与集合对应的Ancestor值相同,则将该边插入集合aeexm3,其中aeexm3中元素不重复。
2)依次遍历seexm3中采样边元素,判断与aeexm3中网格边的相交情况,细分网格。以seexmt为例,其中,seexmt表示seexmt∈seexm3。具体步骤如下:
①根据seexmt端点坐标和aeexm3中网格边顶点UV坐标将seexmt和aeexm3中网格边元素转至普吕克坐标系(Plücker coordinates)。
②建立集合inserteexm3。依次遍历aeexm3中各元素,比如aeexmt,其中,aeexmt表示aeexmt∈aeexm3。在普吕克坐标系下,计算aeexmt与seexmt是否相交,如果相交,将aeexmt插入集合inserteexm3
③依次遍历inserteexm3中网格边元素,根据交点生成网格顶点,建立WSF2集合(无重复元素),以aeexmt为例,具体过程如下:
根据aeexmt和seexmt顶点几何信息,在网格上生成新的顶点vnewd。其中,newd为当前网格顶点数量,vnewd的几何信息包括
Figure BDA0002931520410000211
Figure BDA0002931520410000212
其中
Figure BDA0002931520410000213
为vnewd的模型坐标,
Figure BDA0002931520410000214
为vnewd的UV坐标,
Figure BDA0002931520410000215
Figure BDA0002931520410000216
计算过程如下:
Figure BDA0002931520410000217
Figure BDA0002931520410000218
其中,
Figure BDA0002931520410000219
分别为aeexmt端点evexmt1,evexmt2的UV坐标;
Figure BDA00029315204100002110
分别为evexmt1,evexmt2的模型坐标;scalet2的计算过程如下:
Figure BDA00029315204100002111
将vnewd赋值予aeexmt的SplitVertex变量。将以aeexmt为边的面片插入WSF。
④依次遍历WSF中面片元素,进行网格细分。细分方式与(1.5)的2)中③相同。
⑤将通过本次细分得到的新的网格边插入aeexm3
(三)3D浮雕网格重建
根据面片
Figure BDA0002931520410000221
构建对应的纹理面片集合
Figure BDA0002931520410000222
其中,cnf3为变量,随网格面片最大索引值变化而变化,值始终与当前网格面片最大索引值相同。
接着,根据
Figure BDA0002931520410000223
分割纹理,得到纹理集合S2={s1,s2......scnf3},其中,uvfexm5与sexm5一一映射,1≤exm5≤cnf3,cnf3∈N+
接着,根据纹理图像像素值,判断面片
Figure BDA0002931520410000224
的颜色属性。依次遍历
Figure BDA0002931520410000225
以uvfexm5为例,具体步骤如下:
1)将uvfexm5顶点
Figure BDA0002931520410000226
坐标转至sexm5图像坐标系下,以
Figure BDA0002931520410000227
为例,其中1≤temp5≤3,temp5∈N+,具体步骤如下:
Figure BDA0002931520410000228
Figure BDA0002931520410000229
转至sexm5图像坐标系下变为
Figure BDA00029315204100002210
2)在图像坐标系下,遍历位于sexm5内部的像素点,如果像素值为0的像素点数量占所有位于sexm5内部的像素点数量的εcolor,则将该面片标记为Blackface;同理,如果像素值为255的像素点数量占εcolor,则将该面片标记为Whiteface。εcolor通常取90%,因误差等因素,可逐渐降低εcolor,直至可以判断面片颜色属性。
接着,标记网格边和顶点的边缘属性。遍历
Figure BDA00029315204100002211
其中,cne3为变量,随网格边最大索引值变化而变化,值始终与当前网格边最大索引值相同。以eexm6为例,其中,1≤exm6≤cne3,exm6∈N+。如果以eexm6为边的两个三角面片的颜色属性不一致,则将eexm6标记为Boundaryedge,同时将eexm6的两个端点标记为Boundaryvertex
接着,标记网格顶点的颜色属性。遍历
Figure BDA0002931520410000231
其中,cnv3为变量,随网格顶点最大索引值变化而变化,值始终与当前网格顶点最大索引值相同。以vexm7为例,其中,1≤exm7≤cnv3,exm7∈N+。如果vexm7没有被标记为Boundaryvertex,说明vexm7的一阶领域三角面片颜色属性相同,且vexm7与一阶领域三角面片颜色属性相同,比如vexm7的一阶领域三角面片颜色属性为Blackface,则将vexm7标记为Blackvertex
接着,标记网格面片边缘属性,依次遍历面片f1,f2......fcnf3,以fexm5为例,具体步骤如下:
1)依次遍历fexm5三个顶点
Figure BDA0002931520410000232
如果三个顶点都没有被标记为Boundaryvertex,则将fexm5标记为NotBoundaryface;如果至少有一个顶点被标记为Boundaryvertex,继续执行2)。
2)依次遍历fexm5三条边
Figure BDA0002931520410000233
有以下3种标记情况:
①没有边被标记为Boundaryedge,且fexm5颜色属性为Blackface,则将fexm5标记为BoundaryInface
②没有边被标记为Boundaryedge,且fexm5颜色属性为Whiteface,则将fexm5标记为BoundaryOutface
③至少有一边被标记为Boundaryedge,则将fexm5标记为Boundaryface
接着,为了避免在下一步中生成非流形网格,需要根据浮雕边缘网格顶点拓扑信息,生成网格点环,具体步骤如下:
1)建立网格边不重复集合ringedge,网格顶点集合ringvertex,依次遍历V={v1,v2......vcnv3},以vexm7为例,如果以vexm7为端点的网格边中,有两条以上(不包含两条)的网格边被标记为Boundaryedge,将vexm7插入ringvertex
2)生成网格顶点。依次遍历ringvertex中网格顶点元素,以ringvertex中vring为例,其中,vring∈ringvertex。遍历以vring为端点的所有网格边,以ering为例,其中,ering表示以vring为端点的网格边。根据ering几何信息,生成网格顶点vnewe,其中,newe为生成新顶点后网格顶点最大索引值,vnewe的几何信息包括
Figure BDA0002931520410000241
Figure BDA0002931520410000242
其中
Figure BDA0002931520410000243
为vnewe的模型坐标,
Figure BDA0002931520410000244
为vnewe的UV坐标,
Figure BDA0002931520410000245
Figure BDA0002931520410000246
计算过程如下:
Figure BDA0002931520410000247
Figure BDA0002931520410000248
其中,
Figure BDA0002931520410000249
分别为vring模型坐标和UV坐标;
Figure BDA00029315204100002410
分别为ering另一个端点的模型坐标和UV坐标;εring取2.0*10-5。将vnewe赋值予ering的SplitVertex变量。
3)生成网格拓扑信息。依次遍历ringvertex中网格顶点元素,以vring为例,具体步骤如下:
①遍历vring的一阶领域三角面片,以fring为例,其中,fring表示vring的一阶领域三角面片。根据网格顶点,建立拓扑信息。为了方便表示,以vring为起始顶点,逆时针遍历fring顶点,分别赋予临时别名v1,v2,v3。删除fring,构建新三角面片:以v1,SplitVertex1,SplitVertex2为顶点的fnew1;以v2,SplitVertex1,SplitVertex2为顶点的fnew2;以v2,v3,SplitVertex1为顶点的fnew3。其中,SplitVertex1是以v1,v3为端点的网格边对应的SplitVertex,SplitVertex2是以v1,v2为端点的网格边对应的SplitVertex;new1,new2,new3分别为生成新面片后网格面片最大索引值。如图7。
②标记新面片的颜色属性。将vring的一阶领域三角面片标记为Whiteface;将vi的二阶领域三角面片标记为原面片颜色属性,如图8。
接着,清除网格顶点,边,面片的边缘属性,迭代进行(三)中这步之前的步骤,直至所有网格顶点都满足:以该顶点为端点的所有网格边中,有不超过2条被标记为Boundaryedge
接着,根据被标记为Boundaryvertex生成新的网格顶点。具体步骤如下:
1)建立集合BoundarySetvertex。依次遍历网格顶点V={v1,v2......vcnv4},cnv4随网格顶点最大索引值变化而变化,值始终与当前网格顶点最大索引值相同。以vexm8为例,其中,1≤exm8≤cnv4,exm8∈N+。如果vexm8被标记为Boundaryvertex,则将vexm8插入BoundarySetvertex
2)生成新的网格顶点。依次遍历BoundarySetvertex中顶点元素,以vexm8为例,根据vexm8几何信息,生成新的网格顶点vnewf,其中,newf为生成新顶点后网格顶点最大索引值,vnewf的几何信息包括
Figure BDA0002931520410000251
Figure BDA0002931520410000252
其中
Figure BDA0002931520410000253
为vnewf的模型坐标,
Figure BDA0002931520410000254
为vnewf的UV坐标,
Figure BDA0002931520410000255
Figure BDA0002931520410000256
计算过程如下:
Figure BDA0002931520410000257
Figure BDA0002931520410000258
其中,
Figure BDA0002931520410000259
为vexm8模型坐标;
Figure BDA00029315204100002510
为vexm8的UV坐标;
Figure BDA00029315204100002511
Figure BDA00029315204100002512
的归一化法线坐标;εrelief在网格归一化的情况下取0.1就可以得到凸出明显的浮雕。为
Figure BDA00029315204100002513
引入变量Above,并将
Figure BDA00029315204100002514
赋值予Above。
3)根据网格顶点,建立拓扑信息。具体步骤如下:
①建立浮雕边缘拓扑信息。首先建立BoundarySetedge。依次遍历E={e1,e2......ecne4},其中,cne4随网格边最大索引值变化而变化,值始终与当前网格边最大索引值相同。以eexm9为例,其中,1≤exm9≤cne4,exm9∈N+。如果eexm9被标记为Boundaryedge,将eexm9插入集合BoundarySetedge。然后依次遍历BoundarySetedge中网格边元素,以eexm9为例,eexm9有两个端点,为了方便表示,按照如下方式赋予端点别名:
eexm9被标记为Boundaryedge,说明以eexm9为边的三角面片颜色属性一个为Blackface,一个为Whiteface,暂称颜色属性为Blackface的三角面片为
Figure BDA0002931520410000261
Figure BDA0002931520410000262
中非eexm9端点的顶点为起点,逆时针遍历,先遍历到的顶点称为
Figure BDA0002931520410000263
后遍历到的称为
Figure BDA0002931520410000264
新建面片fnew4,fnew5,fnew4的顶点为Above1,
Figure BDA00029315204100002616
Above2;fnew5的顶点为Above2,
Figure BDA0002931520410000265
其中,Above1,Above2分别为
Figure BDA0002931520410000266
的Above变量值。如图9。
②创建浮雕表面拓扑信息。首先,创建集合reliefface。依次遍历F={f1,f2......fcnf4},其中,cnf4随网格面片最大索引值变化而变化,值始终与当前网格面片最大索引值相同。将被标记为Boundaryface和BoundaryInface的面片插入reliefface。接着,依次遍历reliefface,以fexmf为例,其中,1≤exmf≤cnf4,exmf∈N+。依次遍历fexmf的顶点
Figure BDA0002931520410000267
Figure BDA0002931520410000268
为例,其中,1≤temp3≤3,temp3∈N+。如果
Figure BDA0002931520410000269
不为空值,则用
Figure BDA00029315204100002610
替代
Figure BDA00029315204100002611
成为新的顶点,其中,
Figure BDA00029315204100002612
表示
Figure BDA00029315204100002613
对应的Above值。所有顶点更改后构成新面片,删除原面片fexmf。如图10。
接着,建立集合BlackSetvertex。依次遍历V={v1,v2......vcnv5},其中,cnv5随网格顶点最大索引值变化而变化,值始终与当前网格顶点最大索引值相同。以vexmv为例,其中,1≤exmv≤cnf5,exmv∈N+。如果vexmv没有被标记为Boundaryvertex,且vexmv的颜色属性为Blackvertex,则将vexmv插入集合BlackSetvertex
接着,根据顶点几何信息,调整顶点位置。依次遍历BlackSetvertex,以vBS为例,其中,vBS表示vBS∈BlackSetvertex。vBS新的模型坐标
Figure BDA00029315204100002614
计算过程如下:
Figure BDA00029315204100002615
其中,
Figure BDA0002931520410000271
为vBS未调整前的模型坐标;
Figure BDA0002931520410000272
为vBS的归一化法线坐标;εrelief在网格归一化的情况下取0.1就可以得到凸出明显的浮雕。
(四)网格重构后模型文件的导出
根据(一)~(三)得到的半边数据结构和网格数据,可以通过Assimp等库导出网格重构后的模型文件。

Claims (1)

1.一种适用于纹理贴图的浮雕网格重构方法,其特征在于,步骤如下:
(1)根据纹理图像边缘的网格细分
(1.1)纹理面片的构建
根据面片f1,f2......fnf构建对应的纹理面片集合UVF1={uvf1,uvf2......uvfnf},其中,fa与uvfa一一映射,1≤a≤nf,a∈N+;nf为初始网格面片最大索引值;uvfa顶点坐标为fa顶点UV坐标;
(1.2)纹理边缘采样点的位置分布
第一步,根据uvf1,uvf2......uvfnf分割纹理,得到纹理集合S1={s1,s2......snf},其中uvfa与sa一一映射;sa具体参数如下:
Figure FDA0002931520400000011
Figure FDA0002931520400000012
其中,
Figure FDA0002931520400000013
为uvfa三个顶点坐标中U轴坐标最大值;
Figure FDA0002931520400000014
为uvfa顶点坐标中V轴坐标最大值,
Figure FDA0002931520400000015
为上述UV坐标中U轴最小值;
Figure FDA0002931520400000016
为上述UV坐标中V轴最小值;
Figure FDA0002931520400000017
为sa的宽度;
Figure FDA0002931520400000018
为sa的高度;
Figure FDA0002931520400000019
为sa左上角坐标相对于纹理图像T左上角坐标的偏移量;Twidth为T宽度,Theight为T高度;
第二步,分别对s1,s2......snf进行查找边缘;对于sa,查找边缘后得到轮廓集合SVa={sva1,sva2......sv},且svab={svab1,svab2......svabβ};其中,sa与SVa一一映射;svab为SVa中第b个轮廓采样点序列,且1≤b≤α,α为轮廓数量;svabc为svab中第c个采样点,且1≤c≤β,β为svab中采样点数量;svabc在T上坐标为
Figure FDA00029315204000000110
Figure FDA00029315204000000111
Figure FDA00029315204000000112
计算过程如下:
Figure FDA0002931520400000021
其中,
Figure FDA0002931520400000022
为svabc在sa上像素坐标;
Figure FDA0002931520400000023
为sa左上角坐标相对于纹理图像T左上角坐标的偏移量;
第三步,判断采样点位置;分别判断与s1,s2......snf对应的轮廓集合SV1,SV2......SVnf中的采样点集中采样点相对于面片和网格边的位置,并建立边上采样点集合SOE={soe1,soe2......soene},soed={soev1,soev2......soevnse},其中ed与soed一一映射,1≤d≤ne;ne为初始网格边最大索引值;nse为soed中采样点数量;建立面片上采样点集合SOF={sof1,sof2......sofnf},sofa={sofv1,sofv2......sofvnsf},其中fa与sofa一一映射,nsf为sofa中采样点数量;
(1.3)采样边的构建
通过采样点得到采样边集合SE={se1,se2......senf},seg={seg1,seg2......segsne};其中,sea与sa一一映射,即sea为根据sa中采样点位置得到的采样边集合;segh为第h个插入seg的采样边,1≤h≤sne,sne为seg中采样边数量;
(1.4)多余采样点的删除
对于所有采样点,利用分治法,删除位置相同或两点之间欧式距离小于εv的采样点中的一个;
(1.5)根据采样点的网格细分
第一步,依次对面片f1,f2......fnf引入变量Ancestor,并将Ancestor赋值为面片索引,fa的Ancestora为a,Ancestora表示fa的Ancestor;
第二步,按照如下步骤进行网格细分:
1)依次遍历soe1,soe2......soecne1,对于每一个集合,找到soep中与ep中点的欧式距离最小的采样点soevdismin,其中,dismin取值唯一且1≤dismin≤nse;cne1为变量,随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等,初始值为ne;1≤p≤cne1,p∈N+;根据soevdismin的几何信息和ep顶点几何信息计算插值,在网格中生成新的顶点vnewk,其中,newk为生成新顶点后网格顶点最大索引值,然后对ep引入分割点变量SplitVertex,将vnewk赋值予SplitVertexp,SplitVertexp表示与ep对应的分割点变量;
2)构建面片集合WSF1
①依次遍历f1,f2......fcnf1,对于每个面片,如果三条边中的任意一条边包含变量SplitVertex,将该面片插入WSF1;其中,cnf1随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等,初始值为nf;
②依次遍历WSF1中面片元素,直至所有元素被遍历;对于fi,如果
Figure FDA0002931520400000031
上不包含
Figure FDA0002931520400000032
则计算
Figure FDA0002931520400000033
中点插值,在网格上生成新的顶点vnewi,其中,1≤i≤cnf1,i∈N+,fi∈WSF1;longest表示该边为fi最长边,
Figure FDA0002931520400000034
为fi的最长边;
Figure FDA0002931520400000035
Figure FDA0002931520400000036
的分割点变量;newi为生成新顶点后网格顶点数量;然后,对
Figure FDA0002931520400000037
引入变量
Figure FDA0002931520400000038
将vnewi赋值予
Figure FDA0002931520400000039
接着,删除ASi中与vnewi的UV坐标的欧式距离小于εv的采样点,并将以这些采样点为端点的采样边的对应端点坐标替换为vnewi的UV坐标,其中
Figure FDA00029315204000000310
Figure FDA00029315204000000311
分别为与fi三条边对应的SOE中的采样点集合;最后,如果另一个以
Figure FDA00029315204000000312
为边的三角面片没有在WSF1中,则将其插入WSF1
③依次遍历WSF1中面片元素,根据各面片边上SplitVertex建立拓扑关系,细分网格,具体步骤如下:
a.如果面片中有且只有1条边上有SplitVertex,以SplitVertex和不含SplitVertex的两条边的公共顶点为端点,构建新边,将三角面片分割为2个新面片;如果面片中有且只有2条边上有SplitVertex,连接两个SplitVertex,构成第一条新边;因为连接SplitVertex和另外两条边公共顶点有两种情况,所以比较这两种情况下新建边的长度,选取更短的情况构成第二条新边;新建的两条新边将面片分为3个新面片;如果面片中有3条边上有SplitVertex,依次连接三个SplitVertex,构成三条新边,将三角面片分割为4个新面片;
b.将a的取值范围改为1≤a≤cnf1,a∈N+;将d的取值范围改为1≤d≤cne1,d∈N+
c.对于每一个面片,将被分割前与该面片对应的SOF中的采样点集合和与该面片三条边分别对应的SOE中的采样点集合中的采样点分配到与新面片对应的采样点集合和与新网格边对应的采样点集合,并分别插入SOF,SOE;
d.对于每一个面片,将面片Ancestor变量值赋予通过分割该面片得到的新面片的Ancestor变量;
4)重复步骤1)—3),直至soe1,soe2......soecne1都变为空集;然后遍历sof1,sof2......sofcnf1,直至找到一个采样点集合不为空集,具体步骤如下:
①找到该集合中与该集合对应的纹理面片重心的欧式距离最小的采样点元素,将采样点从集合中删除,并根据该采样点与该纹理面片对应的网格面片顶点几何信息计算插值,在网格上生成新的顶点vnewa;其中,newa为新顶点生成后网格顶点最大索引值;
②将vnewa与面片顶点分别连接,构成三条新边,将面片分割为三个新面片;
③将a的取值范围改为1≤a≤cnf1,a∈N+;将d的取值范围改为1≤d≤cn1e,d∈N+
④对于每一个被分割面片,将被分割前与该面片对应的SOF中的采样点集合中的采样点元素,分配到与新面片对应的采样点集合和与新网格边对应的采样点集合,并分别将这些集合插入SOE和SOF;
⑤对于每一个被分割面片,将面片Ancestor变量值赋予通过分割该面片得到的新面片的Ancestor变量;
5)重复步骤1)—4),直至soe1,soe2......soecne1,sof1,sof2......sofcnf1都变为空集;
(1.6)根据采样边的网格细分
第一步,根据Anc变量建立AF={af1,af2......afnf},afj={fk|(Ancestork=j)∧(1≤k≤cnf2∧k∈N+)},其中,1≤j≤nf,j∈N+;cnf2随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等;
第二步,计算采样边与网格边的相交情况,细分网格;依次遍历AF中每个集合,对于每一个AF集合,具体步骤如下:
1)构建边集ae,依次遍历集合中的面片元素,对于面片的各条边,如果以该边为边的两个面片的Ancestor值都与集合对应的Ancestor值相同,则将该边插入集合ae,其中ae中元素不重复;
2)依次遍历SE中与该面片集合对应的采样边集合中的采样边元素,细分网格;对于每一条采样边元素,具体步骤如下:
①根据采样边端点坐标和网格边顶点UV坐标将采样边和ae中网格边元素转至普吕克坐标系;
②建立网格边集合inserte;依次遍历ae中各网格边,在普吕克坐标系下,计算网格边与采样边是否相交,如果相交,将该网格边插入集合inserte;
③依次遍历inserte中网格边元素,根据交点生成网格顶点,建立WSF2集合,对于每条网格边,根据该网格边顶点和该采样边端点几何信息,计算网格边与采样边交点的几何信息,并在网格上生成新的顶点vnewb;其中,newb为新顶点生成后网格顶点最大索引值;将vnewb赋值予网格边的SplitVertex变量;将以该网格边为边的面片插入WSF2
④依次遍历WSF2中面片元素,进行网格细分;细分方式与(1.5)的2)中③相同;
⑤将通过本次细分得到的新的网格边插入ae;
(2)3D浮雕网格重构
(2.1)网格面片颜色属性的标记
第一步,根据面片
Figure FDA0002931520400000061
构建对应的纹理面片集合
Figure FDA0002931520400000062
其中,cnf3为变量,随网格面片索引最大值变化而变化,值始终与当前网格面片索引最大值相等;
第二步,根据
Figure FDA0002931520400000063
分割纹理,得到纹理集合
Figure FDA0002931520400000064
具体参照(1.2)第一步;
第三步,根据纹理图像像素值,二值化为0和255,判断面片
Figure FDA0002931520400000065
的颜色属性,依次遍历
Figure FDA0002931520400000066
对于每个纹理面片,具体步骤如下:
1)分别将纹理面片顶点坐标转至与该纹理面片对应的S中的图像像素坐标系下;
2)在图像坐标系下,遍历位于纹理面片内部的像素点,如果像素值为0的像素点数量占所有位于纹理面片内部的像素点数量的εcolor,则将该面片标记为Blackface;同理,如果像素值为255的像素点数量占εcolor,则将该面片标记为Whiteface;εcolor取90%,因误差等因素,可逐渐降低εcolor,直至判断面片颜色属性;
(2.2)网格顶点和网格边属性的标记
第一步,标记网格边和顶点的边缘属性;遍历
Figure FDA0002931520400000067
其中,cne3为变量,随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等;对于每条网格边,如果以该网格边为边的两个三角面片的颜色属性不一致,则将该网格边标记为Boundaryedge,同时将该网格边的两个端点标记为Boundaryvertex
第二步,标记网格顶点的颜色属性;遍历
Figure FDA0002931520400000071
其中,cnv3为变量,随网格顶点索引最大值变化而变化,值始终与当前网格顶点索引最大值相等;对于每个网格顶点,如果该顶点没有被标记为Boundaryvertex,说明该顶点的一阶领域三角面片颜色属性相同,且该顶点与一阶领域三角面片颜色属性相同,比如该顶点的一阶领域三角面片颜色属性为Blackface,则将该顶点标记为Blackvertex
(2.3)网格面片边缘属性的标记
标记网格面片边缘属性,依次遍历面片
Figure FDA0002931520400000072
对于每个面片,具体步骤如下:
1)依次遍历该面片三个顶点,如果三个顶点都没有被标记为Boundaryvertex,则将该面片标记为NotBoundaryface;如果至少有一个顶点被标记为Boundaryvertex,继续执行(2.3)的2);
2)依次遍历该面片三条边,有以下3种标记情况:
①没有边被标记为Boundaryedge,且该面片颜色属性为Blackface,则将该面片标记为BoundaryInface
②没有边被标记为Boundaryedge,且该面片颜色属性为Whiteface,则将该面片标记为BoundaryOutface
③至少有一边被标记为Boundaryedge,则将该面片标记为Boundaryface
(2.4)网格点环的生成
根据浮雕边缘网格顶点拓扑信息,生成网格点环,具体步骤如下:
1)建立网格边不重复集合ringedge,网格顶点集合ringvertex,依次遍历
Figure FDA0002931520400000081
对于每个网格顶点,如果以该顶点为端点的网格边中,有大于两条网格边被标记为Boundaryedge,将该顶点插入ringvertex
2)生成网格顶点;依次遍历ringvertex中网格顶点元素,对于每一个网格顶点,遍历以该顶点为端点的所有网格边,对于每一条网格边,在距离(欧式距离)该顶点dist的网格边上计算插值,生成网格顶点vnewd;其中,newd为生成新顶点后网格顶点最大索引值;dist取该网格边长度的εring,εring取2.0*10-5;将vnewd赋值予该网格边的SplitVertex变量;
3)生成网格拓扑信息;依次遍历ringvertex中网格顶点元素,对于每一个顶点,具体步骤如下:
①遍历该顶点的一阶领域三角面片,对于每一个面片,根据网格顶点,建立拓扑信息:
以该顶点为起始顶点,逆时针遍历该面片顶点,分别赋予临时别名v1,v2,v3;以v1和v2为端点的网格边SplitVertex变量值称为SplitVertex1,以v1和v3为端点的网格边SplitVertex变量值称为SplitVertex2
连接SplitVertex1和SplitVertex1,构成第一条新网格边;连接SplitVertex1和v2,构成第二条新网格边;该面片被分割为三个新面片;
②标记新面片的颜色属性;将该顶点的一阶领域三角面片标记为Whiteface;该顶点的二阶领域三角面片标记为母面片颜色属性;
(2.5)(2.1)-(2.4)的迭代
清除网格顶点,边,面片的边缘属性,迭代进行(2.1)-(2.4),直至所有网格顶点都满足:以该顶点为端点的所有网格边中,有不超过2条被标记为Boundaryedge
(2.6)浮雕边缘网格和表面网格的重构
第一步,根据被标记为Boundaryvertex生成新的网格顶点;具体步骤如下:
1)建立集合BoundarySetvertex;将
Figure FDA0002931520400000091
中,被标记为Boundaryvertex的顶点插入BoundarySetvertex;其中cnv4随网格顶点索引最大值变化而变化,值始终与当前网格顶点索引最大值相等;
2)生成新的网格顶点;依次遍历BoundarySetvertex中顶点元素,对于每个网格顶点,根据该顶点几何信息,生成新的网格顶点vnewe,其中,newe为生成新顶点后网格顶点最大索引值,vnewe的几何信息计算过程如下:
Figure FDA0002931520400000092
Figure FDA0002931520400000093
其中,其中
Figure FDA0002931520400000094
分别为vnewe的模型坐标和UV坐标;
Figure FDA0002931520400000095
分别为该顶点的模型坐标和UV坐标;
Figure FDA0002931520400000096
为该顶点的归一化法线坐标;εrelief在网格归一化的情况下取0.1;为该顶点引入变量Above,并将vnewe赋值予Above;
3)根据网格顶点,建立拓扑信息;具体步骤如下:
①建立浮雕边缘拓扑信息;首先建立BoundarySetedge;依次遍历
Figure FDA0002931520400000098
其中cne4随网格边索引最大值变化而变化,值始终与当前网格边索引最大值相等;对于每一条网格边,如果该网格边被标记为Boundaryedge,将该网格边插入集合BoundarySetedge
依次遍历BoundarySetedge中网格边元素,对于每一条网格边,暂称以该网格边为边并且颜色属性为Blackface的三角面片为fB,以fB中非该网格边端点的顶点为起点,逆时针遍历,先遍历到的顶点(不包含起点)称为ev1,后遍历到的称为ev2
新建面片
Figure FDA0002931520400000097
fnew1的顶点为Above1,ev1,Abov2;fnew2的顶点为Above2,ev1,ev2;其中,Above1,Above2分别为ev1,ev2的Above值;new1,new2分别为生成新面片后网格面片最大索引值;
②创建浮雕表面拓扑信息;首先,创建集合reliefface;依次遍历
Figure FDA0002931520400000101
其中,cnf4为当前网格面片最大索引值;将被标记为BoundaryInface和Boundaryface的面片插入reliefface;接着,依次遍历reliefface中的面片元素,对于每个面片,依次遍历该面片的顶点,如果顶点有变量Above且Above不为空值,则用Above值替代该顶点成为新的顶点,所有顶点更改后构成新面片,删除原面片;
(2.7)网格顶点位置的调整
依次遍历所有没有被标记为Boundaryvertex且颜色属性为Blackvertex的网格顶点,对于每个顶点,该顶点新的模型坐标vnewpos计算过程如下:
vnewpos=vposrelief*vnormal (2.3)
其中,vpos为该顶点未调整前的模型坐标;vnormal为该顶点的归一化法线坐标;εrelief在网格归一化的情况下取0.1就得到凸出明显的浮雕。
CN202110148219.6A 2021-02-03 2021-02-03 一种适用于纹理贴图的浮雕网格重构方法 Active CN112767526B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110148219.6A CN112767526B (zh) 2021-02-03 2021-02-03 一种适用于纹理贴图的浮雕网格重构方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110148219.6A CN112767526B (zh) 2021-02-03 2021-02-03 一种适用于纹理贴图的浮雕网格重构方法

Publications (2)

Publication Number Publication Date
CN112767526A CN112767526A (zh) 2021-05-07
CN112767526B true CN112767526B (zh) 2022-09-20

Family

ID=75704800

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110148219.6A Active CN112767526B (zh) 2021-02-03 2021-02-03 一种适用于纹理贴图的浮雕网格重构方法

Country Status (1)

Country Link
CN (1) CN112767526B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113592994B (zh) * 2021-09-27 2021-12-07 贝壳技术有限公司 用于纹理贴图的方法、装置和存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106875495A (zh) * 2016-12-23 2017-06-20 合肥阿巴赛信息科技有限公司 一种基于凹凸贴图的浮雕网格表示及3d打印切片方法和系统
CN111369681A (zh) * 2020-03-02 2020-07-03 腾讯科技(深圳)有限公司 三维模型的重构方法、装置、设备及存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10269148B2 (en) * 2017-05-01 2019-04-23 Lockheed Martin Corporation Real-time image undistortion for incremental 3D reconstruction

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106875495A (zh) * 2016-12-23 2017-06-20 合肥阿巴赛信息科技有限公司 一种基于凹凸贴图的浮雕网格表示及3d打印切片方法和系统
CN111369681A (zh) * 2020-03-02 2020-07-03 腾讯科技(深圳)有限公司 三维模型的重构方法、装置、设备及存储介质

Also Published As

Publication number Publication date
CN112767526A (zh) 2021-05-07

Similar Documents

Publication Publication Date Title
US10504284B2 (en) Method for automatic modeling of complex buildings with high accuracy
CN103617603B (zh) 一种三维数字几何网格模型结构的自动修复方法
CN103559374B (zh) 一种多子网格模型上进行面分裂型曲面细分的方法
CN111581776B (zh) 一种基于几何重建模型的等几何分析方法
CN109472870B (zh) 一种基于网格重构和多影响域修正的模型匹配方法
CN105046735A (zh) 一种基于基元分布的三维表面纹理合成方法
CN108230452B (zh) 一种基于纹理合成的模型补洞方法
Zhang et al. Dual contouring for domains with topology ambiguity
CN114611359B (zh) 一种网格-参数混合模型建模方法和系统
CN112767526B (zh) 一种适用于纹理贴图的浮雕网格重构方法
CN114529633A (zh) 一种支持gis线对象和面对象连续lod绘制的方法
CN111028349B (zh) 一种适用于海量三维实景数据快速可视化的层级构建方法
CN112685935A (zh) 一种二维多块结构化网格拓扑划分方法
CN116843861A (zh) 一种三维模型简化方法
Sun et al. Automatic quadrilateral mesh generation and quality improvement techniques for an improved combination method
KR20010046823A (ko) 정렬되지 않은 3차원 거리 데이터로부터 캐드모델 생성 방법
CN111047687B (zh) 一种基于三维t样条的异质材料实体建模方法
CN112989679A (zh) 一种结构引导的六面体网格几何优化方法
CN112364504B (zh) 基于CT扫描技术和Gabriel图的非均质多孔介质模型构建方法
CN116563490B (zh) 一种基于刚性映射的全自动四边形附面层网格生成方法
Stoddart et al. Reconstruction of smooth surfaces with arbitrary topology adaptive splines
CN117934751B (zh) 一种三维隧道模型的构建方法、装置、设备及介质
CN114419055B (zh) 一种基于高斯像的可展面分割-拟合方法
CN117593485B (zh) 基于豪斯多夫距离感知的三维模型简化方法及系统
CN116416387B (zh) Osgb三维模型快速顶层重建方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant