一种基于vtk处理obj文件的方法与流程

文档序号:12675803阅读:1092来源:国知局
一种基于vtk处理obj文件的方法与流程

本发明属于计算机图形学领域,尤其涉及一种基于vtk处理obj文件的方法。



背景技术:

三维模型是物体的多边形表示,通常用计算机或者其它视频设备进行显示。显示的物体可以是现实世界的实体,也可以是虚构的物体。任何物理自然界存在的东西都可以用三维模型表示。

对于表情光滑的物体,所需要的多边形数量就越多,如果数量不足就会使得构建处理的三维模型不够平滑,此时就需要应用曲面细分算法来自动的增加面片数量,使得模型平滑,然而曲面细分算法所要求的输入面面是连续的,离散面片构造的曲面直接应用细分算法将会产生很多空洞。对于多边形的顶点,可能会对于多个纹理坐标,然而在vtk(视觉化工具函式库,Visualization Toolkit)中一个顶点id(身份证,identification)只能与一个纹理坐标id相对应,这就使得一个顶点不够用,需要增加新的位置一样的。



技术实现要素:

发明目的:对于纹理坐标不一样的顶点,为了应用曲面细分算法,还要保证面片之间的连通性,本发明提出了一个在不改变模型的基础上,合理增加面片以保证所有面片是连通的方法。

针对vtk内置类vtkObjReader(vtk工具库自带的.obj格式文件处理类)存在不足的情况下,本发明提供了一种处理obj文件的方法。

本发明具体包括如下步骤:

步骤1:面片读取。读取obj文件三维模型里的面片,构造倒排索引表。

步骤2:寻找共享顶点:面片顶点的标识符为<顶点id,纹理坐标k>,id表示顶点的标识号,由于一个顶点对应着多个纹理坐标(三维模型顶点规定着模型的空间位置关系,顶点所对应的纹理坐标规定着模型表面的图案,即贴图)。所以这样的顶点需要产生多个复制。读取第n个面片顶点时,则该面片顶点的标识符为<顶点idn,纹理坐标kn>,idn表示第n个面片顶点的标识号,kn表示第n个面片顶点的纹理坐标,n取值为自然数,若该面片顶点的复制中存在映射到纹理坐标kn的映射关系,且面片仍存在其它未读取的顶点,转步骤2;其它情况转步骤3;

步骤3:产生新的顶点。如果寻找到了共享顶点,则更新构建面片顶点id,转步骤5。如果没有找到,则产生和顶点idn位置一样的顶点,转步骤4;

步骤4:增加面片:增加一个连接新旧顶点的面片,并将新顶点加入顶点集,所述顶点集为已读取的所有面片顶点的集合;

步骤5:如果面片仍有后续顶点未处理,转步骤2;如果三维模型还有后续面片,转步骤1;其它情况转步骤6;

步骤6:三角面片化,由于整个模型包含许多面片,面片的顶点数不一,为了简化计算纹理坐标时的插值运算,以及后续在模型上能够运行曲面细分算法,该步骤将所有面片拆分为三角面片组成。

步骤7:曲面平滑。运用loop曲面细分算法,平滑模型。

步骤1中,为了确定面片的处理顺序,针对一整块连通的三维面,规定,面的构造过程是连续的,即当前面为连续的,当添加新的面片后,所得的三维面依然是连通的,所有新选取的面一定和当前面有共享的变,所以构造倒排索引表,索引项为边,值为面片。

步骤2中,对模型增加面片的过程中,已构成的面由许多多面片组成的,为了保持面的流形结构,面片内部的顶点不能用于共享。所以本发明中寻找的共享顶点应处于面边缘,一个顶点是否处于面边缘等价于这个顶点周围是否都被面片所占据,以该顶点为中心,将其邻域360等分,一份表示一度,形成的空间称为360度空间,(对模型增加面片的过程中,已构成的面由许多多面片组成的,为了保持面的流形结构。面片内部的顶点不能用于共享。所以寻找的共享顶点应处于面边缘,三维模型的面是由许许多多的面片拼接而成,顶点分为两类,一类在面内部,一类处于面边缘)为了加快查找速度,将当前面的边缘点都保存在一个队列中,当新加了面片之后,实时更新这个队列,更新规则如下:

针对该面片上的每一个顶点:

(1)寻找到的能够共享的顶点从队列中删除(步骤4增加的面片会使得顶点处于面内部);

(2)对于不能共享的顶点处理如下:将在当前面片中的角增加到该点所对应的360度空间中,如果360度空间被填满,则删除该点,否则仅仅更新该点所对应的360度空间。例子:初始时,顶点(o)所对应的360度空间为空,a增加角aob(a,o,b均为顶点表示)360度空间中增加(a,b);b增加角(boc),360度空间中增加(b,c);

此时合并(a,b),(b,c)为(a,c);c增加角(coa),360度空间中增加(c,a),此时合并(a,c)(c,a)为(a,a)此时在队列中删除o点,此时o点变为内部节点,而非边缘节点。

寻找到共享顶点之后,如果能够共享,继续处理面片下一个顶点。否则,转步骤3。

步骤3中,根据建立的倒排索引表,每次取得的是有相连边的面片,该面片一定和当前生成的面有边的连接,利用该信息可以获悉步骤3中增加的面片属于360度空间哪一快扇形空白区域,将这扇形空白区域的两边端点取出记作A,B,记共享顶点为X,为了保持面的流行特性和纹理的正确性。采用以下规则产生新的跟X位置一样的顶点Y:

Y1=α*X1+β*A1+γ*B1

其中,Y1表示顶点Y的坐标,A1和B1分别表示点A的坐标和点B的坐标,α+β+γ=1且α,β,γ>0,α,β,γ顶点比重系数(一般取值分别为0.9,0.05,0.05),顶点Y对应的纹理坐标Yt为:Yt=α*Xt+β*At+γ*Bt,

其中,At和Bt分别为点A对应的纹理坐标和点B对应的纹理坐标,然后交换X与Y,即将顶点id所对应的内容互换。

以下证明该种变换不改变纹理的表示(以直线AB为例)B’为B点按照上述产生的新顶点,以下证明AB’与B’B之间点的插值结果一样(c,β)表示(AC/AB,AB’/AB):

B’=β*B+(1-β)*A,C=c*B+(1-c)*A;

(1)C为AB’之间(c<β)C=c/β*B’+(1-c/β)*A=c*B+(1-c)*A

(2)C为B’B之间(c>β)C=(c-β)/(1-β)*B+(1-c)/(1-β)*B’=c*B+(1-c)*A

步骤4中,为了保持面的流形特征,所增加的面片不与原有的面重叠,而且为了在后续曲面平滑步骤中,保持面原有的网状结果。并且所增加面片的(AXBY),(BXAY)两者法向量方向的选择基于相邻面片法向量基本一致的原则,面片法向量由右手定则确定。

所述后续顶点与后续面片步骤阶段,起着阶段转移,控制程序执行的作用。

所述三角面片化过程中,由于整个模型包含许多面片,面片的顶点数不一,为了简化计算纹理坐标时的插值运算,以及后续在模型上能够运行曲面细分算法,该步骤将所有面片拆分为三角面片组成。

所述曲面平滑中,面片的不平滑是由于面片过大导致的,该步通过loop曲面细分,增加面片数,平滑模型。

有益效果:本发明解决了现有技术中的问题:1)针对顶点:如果两个面片包含同一个顶点坐标而且顶点坐标所对应的纹理坐标一样。此时这两个面共享改顶点id,如果顶点坐标所对应的纹理坐标不同,该顶点才会创建自身的复制。减少了要所需要存储的顶点对象;2)针对面片:当顶点产生自身复制时,需要增加过渡面片,以保证整个曲面的连续性。

附图说明

下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变得更加清楚。

图1a为当前O点360度空间被占有情况。

图1b为插入新的角AOE后360度空间变化情况。

图1c为当O点不被共享时O点及O’点360度空间示意图。

图2为vtk内置类vtkObjReader处理obj格式文件效果。

图3为应用loop曲面细分算法效果。

图4和图5为应用本发明提出的方法的效果。

图6是本发明流程图。

具体实施方式

下面结合附图及实施例对本发明做进一步说明。

本发明适用于当obj文件里面面片的数量不够,不足以产生一个平滑模型的情形,此时内置类vtkObjReader独立的处理每一个小面片。本发明提出了新的处理obj格式文件的方法。1)在处理面片时,考虑顶点的共享,使得能够共享同一个顶点的面片确实共享的是顶点集中的同一个顶点(顶点能够共享指的是顶点的坐标位置以及对于的纹理坐标位置相同),共享顶点至少可以将顶点集减少一半。2)在需要产生一个新的顶点时,新顶点与原始顶点虽然位置相同,但是在曲面细化阶段,由于细化是一个近似算法,所以顶点的位置可能将会偏移,新顶点与原始顶点可能就会分开。使得三维模型产生很多空洞。提出了在新顶点与原始顶点之间过渡面片,保证连续性。3)在产生的连续面片上面运用loop曲面细分算法,平滑模型。如图6所示,本发明包括如下步骤:

步骤1:面片读取。读取obj文件三维模型里的面片,构造倒排索引表。

步骤2:寻找共享顶点:由于一个顶点对应着多个纹理坐标(三维模型顶点规定着模型的空间位置关系,顶点所对应的纹理坐标规定着模型表面的图案,即贴图)。所以这样的顶点需要产生多个复制。面片顶点的标识符为<顶点id,纹理坐标k>,id表示顶点的标识号,读取第n个面片顶点时,则该面片顶点的标识符为<顶点idn,纹理坐标kn>,idn表示第n个面片顶点的标识号,kn表示第n个面片顶点的纹理坐标,n取值为自然数,若该面片顶点的复制中存在映射到纹理坐标kn的映射关系,且面片仍存在其它未读取的顶点,转步骤2;其它情况转步骤3;

步骤3:产生新的顶点。如果寻找到了共享顶点,则更新构建面片顶点id,转步骤5。如果没有找到,则产生和顶点idn位置一样的顶点,转步骤4;

步骤4:增加面片:增加一个连接新旧顶点的面片,并将新顶点加入顶点集,所述顶点集为已读取的所有面片顶点的集合;

步骤5:如果面片仍有后续顶点未处理,转步骤2;如果三维模型还有后续面片,转步骤1;其它情况转步骤6;

步骤6:三角面片化,由于整个模型包含许多面片,面片的顶点数不一,为了简化计算纹理坐标时的插值运算,以及后续在模型上能够运行曲面细分算法,该步骤将所有面片拆分为三角面片组成。

步骤7:曲面平滑。运用loop曲面细分算法,平滑模型。

步骤1中,为了确定面片的处理顺序,针对一整块连通的三维面,规定,面的构造过程是连续的,即当前面为连续的,当添加新的面片后,所得的三维面依然是连通的,所有新选取的面一定和当前面有共享的变,所以构造倒排索引表,索引项为边,值为面片。

步骤2中,对模型增加面片的过程中,已构成的面由许多多面片组成的,为了保持面的流形结构,面片内部的顶点不能用于共享。所以本发明中寻找的共享顶点应处于面边缘,一个顶点是否处于面边缘等价于这个顶点360度是否被四周面片所占据,为了加快查找速度,将当前面的边缘点都保存在一个队列中,当新加了面片之后,实时更新这个队列,更新规则如下:

针对每一个受影响的顶点:

(1)寻找到的可以共享的顶点从队列中删除(步骤4增加的面片会使得顶点处于面内部);

(2)其他顶点处理如下:将在当前面片中的角增加到该点所对应的360度空间中,如果360度空间被填满,则删除该点,否则仅仅更新该点所对应的360度空间。例子:初始时,顶点(o)所对应的360度空间为空,a增加角aob(a,o,b均为顶点表示)360度空间中增加(a,b);b增加角(boc),360度空间中增加(b,c);

此时合并(a,b),(b,c)为(a,c);c增加角(coa),360度空间中增加(c,a),此时合并(a,c)(c,a)为(a,a)此时在队列中删除o点,此时o点变为内部节点,而非边缘节点。

寻找到共享顶点之后,如果可以共享,继续处理面片下一个顶点。否则,转步骤3。

步骤3中,根据建立的倒排索引表,每次取得的是有相连边的面片,该面片一定和当前生成的面有边的连接,利用该信息可以获悉步骤3中增加的面片属于360度空间哪一快空白区域,将这扇形空白区域的两边端点取出记作A,B,记共享顶点为X,为了保持面的流行特性和纹理的正确性。采用以下规则产生新的跟X位置一样的顶点Y:

Y1=α*X1+β*A1+γ*B1

其中,Y1表示顶点Y的坐标,A1和B1分别表示点A的坐标和点B的坐标,α+β+γ=1且α,β,γ>0,α,β,γ顶点比重系数,顶点Y对应的纹理坐标Yt为:Yt=α*Xt+β*At+γ*Bt,

其中,At和Bt分别为点A对应的纹理坐标和点B对应的纹理坐标,然后交换X与Y,即将顶点id所对应的内容互换。

以下证明该种变换不改变纹理的表示(以直线AB为例)B’为B点按照上述产生的新顶点,以下证明AB’与B’B之间点的插值结果一样(c,β)表示(AC/AB,AB’/AB):

B’=β*B+(1-β)*A,C=c*B+(1-c)*A

(1)C为AB’之间(c<β)C=c/β*B’+(1-c/β)*A=c*B+(1-c)*A

(2)C为B’B之间(c>β)C=(c-β)/(1-β)*B+(1-c)/(1-β)*B’=c*B+(1-c)*A

步骤4中,为了保持面的流形特征,所增加的面片不与原有的面重叠,而且为了在后续曲面平滑步骤中,保持面原有的网状结果。所有选择增加面片(AXBY),(BXAY)方向的选择基于保持面片法向量基本一致的原则。面片法向量由右手定则确定。

所述后续顶点与后续面片步骤阶段,起着阶段转移,控制程序执行的作用。

所述三角面片化过程中,由于整个模型包含许多面片,面片的顶点数不一,为了简化计算纹理坐标时的插值运算,以及后续在模型上能够运行曲面细分算法,该步骤将所有面片拆分为三角面片组成。

所述曲面平滑中,面片的不平滑是由于面片过大导致的,该步通过loop曲面细分,增加面片数,平滑模型。

实施例:

本发明采用上述方案,实现了在vtk中重现了由faceGen导出的人脸。

具体实现如下:Loop细分是一种三角形网格的细分法则,它按照1-4三角形分裂,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。

步骤1:建立倒排索引表,采用的数据结构为字典<key为边,value为面片集合>;当读取到一个面片时,将该面片加入到以该面片边为key的value集合中。最终返回这个倒排索引表。

步骤2:对模型增加面片的过程中,已构成的面由许多多面片组成的,为了保持面的流形结构。面片内部的顶点不能用于共享。所以我们寻找的共享顶点应处于面边缘,一个顶点是否处于面边缘等价于这个顶点360度是否被四周面片所占据。并更新。本次采用的一个长度为360的线段循环数组。首先在下标项中查找A,B,如果找不到,任意选取两索引值a,b代表A与B。并将A与B之间置1.选取的a到b之间应该全文0。当将长度为360的线段全都置一之后,对应的顶点从边缘顶点表中移除,如图1a~图1c所示,图1a为当已插入面片AOB与面片COD时点O对应的360度空间的占用情况(黑色表示已经被占用,空白区域表示未占用),图1b在图1a的基础上,插入面片AOE,此时AOE中顶点O与图1a顶点O三维坐标一样,而且对应的纹理坐标id一样,此时顶点O两者共享,O点360度空间占用情况(黑色表示被占用,空白区域表示未占用)如图1b所示。图1c在图1a的基础上,插入面片AOE,此时AOE中顶点O与图1a顶点O三维坐标一样,但是对应的纹理坐标id不一样,此时顶点O两者不能共享。原图1a中顶点O位移到O’,并且增加平滑面AOCO’,此时O与O’点360度空间占用情况(黑色表示被占用,空白区域表示未占用)如图1c所示。

步骤3:指定参数α=0.9,β=0.05,γ=0.05,在面片内部产生新的顶点Y,并将Y与旧顶点X内容呼唤。

步骤4:产生新的面片。从步骤2中面片过程中需要注意面片顶点之间排列的顺序,如图1所示,因为共享边在相邻面中排序不同,所有根据该信息确定增加面片顶点流向。

步骤5:起到转移控制作用;

步骤6,7采用的是vtk内置类vtkTriangleFilter(vtk工具库中自带的将三维模型所有面片三角化的处理类)和vtkLoopSubdivisionFilter(vtk工具库中loop曲面细分算法的实现类)实现。图2为vtk(The Visualization Toolkit)内置处理类vtkObjReader处理三维人脸模型的效果图,面片与面片之间的过度不平滑。图3为在vtk(The Visualization Toolkit)内置处理类vtkObjReader处理三维人脸模型结果的基础上运用曲面细分算法平滑模型的效果图,面片平滑,但是面片之间不连续。图4和图5为应用本发明提出的增加过渡面片法,连接面片的三维人脸模型的平滑显示效果图。

本发明提供了一种基于vtk处理obj文件的方法,具体实现该技术方案的方法和途径很多,以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。

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