专利名称:一种基于Octree的三维模型压缩编/解码方法
技术领域:
本发明属于计算机图形学技术领域,具体地说,是一种基于Octree的三维模型压缩编/解码方法,应用于各种三维模型的网络发布。
背景技术:
当前各种高级造型工具的不断涌现和三维外形扫描数据技术的日益成熟使得人们对几何数据的精度和细节都提出了更高的要求,这同时也导致了三维几何数据的规模和复杂程度急剧增长,庞大的几何数据量对现有的三维图形引擎的处理能力和速度提出了巨大的挑战。另一方面,Internet的迅猛发展也使得三维几何数据的应用越来越广泛。但是网络带宽的限制严重阻碍了这种媒体的传播。如果仅仅依靠增加硬件设备的投入是不足以解决这一问题的,需要人们研究针对三维几何数据的压缩编码技术。
当前对拓扑的压缩已接近理论极限,而几何压缩正在成为研究的热点,并且几何信息在三维模型文件中占据的空间是最大的,相对拓扑压缩来说,几何压缩还有很大的研究空间。另外,大多数人的方法是以拓扑压缩算法为主导,几何顶点位置往往依附于模型的拓扑关系来编码,这在很大程度上制约了几何信息可压缩的空间。因此目前国际上的研究热点转为以几何信息的压缩为主导,并以几何压缩驱动拓扑信息的压缩,这样总体上能达到更高的压缩收益。
在已有的几何驱动编码中,频域编码虽然有很高的编码效率,但是它们只适合于流形网格,计算开销很大,在压缩比比较大时失真严重,而且是一种有损压缩。由于本项研究需要到达无损压缩的效果,所以不考虑频域的方法。在空间域方法中,Kdtree和Octree等空间划分的方法逐渐成为压缩编码领域的研究热点,一方面这种树形结构能很好的重新组织几何数据,另一方面只要划分足够精细就能够做到无损压缩。所以这一类压缩方法能够满足人们的需求。
最新的文献J.Peng,C.-C.J.Kuo,Geometry-guided progressivelossless 3D mesh coding with octree(OT)decomposition.ACM Transactionson Graphics,vol.24,no.3,pp.609-616,2005.表示Octree压缩方法比Kdtree压缩方法能达到更低的压缩比特率。目前为止有以下几篇文献使用到Octree(1)J.Peng,C.-C.J.Kuo,Geometry-guided progressive Iossless 3D meshcoding with octree(OT)decomposition.ACM Transactions on Graphics,vol.24,no.3,pp.609-616,2005.;(2)D.Saupe,J.-P.Kuska,Compression ofisosurfaces for structured volumes.In Proceedings of Vision,Modeling andVisualization,pp.333-340,2001;(3)M.Botsch,A.Wiratanaya,and L.Kobbelt.Efficient high quality rendering of point sampled geometry.InEGRW’02Proceedings of the 13th Eurographics workshop on Rendering,pp.53-64,2002.;(4)D.Laney,M.Bertram,M.Duchaineau,and N.Max.Multiresolution distance volumes for progressive surface compression.InProceedings of the First International Symposium on 3D Data Processing,Visualization,and Transmission,pp.470-479,2002.。
文献2、3是针对isosurface的,这类模型不太常见;文献4的方法使用的是判断子树是否非空来编码,但是其缺点是编码没有优化,而且在点采样网格中没有必要使用拓扑编码;文献1的Peng的OT Compression方法目前来说是最好的,但是该方法在递进显示过程中缺乏优化操作,即他采用固定的顺序或者说无序的方式进行恢复操作,在网格恢复的过程中不能保证以较佳的效果呈现在用户面前。另外该方法只完成了几何、拓扑信息的编码,并没有对属性信息进行递进压缩编码。
发明内容
本发明的技术解决问题克服现有技术的不足,提供一种基于Octree的三维模型压缩编/解码方法,该方法压缩比很高,并且适合网络递进传输,满足了当前大数据量的三维数据存储及网络传输的需求。
本发明的技术解决方案基于Octree的三维网格模型编/解码方法,其特征在于包括以下步骤(1)对三维网格模型的顶点信息重新进行Octree空间划分,统计分析其中各种不同类型的节点,找出占总节点数目比例最多的一类或几类节点,单独对其使用较少的比特位进行几何信息编码;(2)根据几何信息的传输顺序,重新排列拓扑信息和属性信息并编码;(3)设置单独的递进文件用来控制几何信息传输、显示以及解码时拓扑、属性信息的同步映射。
在所述步骤(1)中的几何信息编码方法为对得到的Octree中子节点中只有一个非空的节点单独使用3位记录,其他类型的节点使用8位来记录,依此原则对Octree进行广度优先策略遍历记录数据流,并对得到的数据流进行二次熵编码。
在所述步骤(2)中在对拓扑和属性信息编码之前按照Octree中叶节点从左到右的顺序,对其中的顶点索引重新排列得到新的顶点序列,并且根据新顶点序列更新原始拓扑、属性信息中顶点索引值。
在所述步骤(3)中采用的递进文件生成方法为只编码Octree中每个非空节点所包含顶点的个数。
在所述步骤(3)中所采取的递进显示策略为在客户端模型更新显示的次数等于Octree的深度,即只在Octree每一层数据传输结束时更新显示。
本发明与现有技术相比的有益效果(1)Octree子分过程能产生丰富的信息,而且空间划分效率较高,收敛速度快,客户端响应等待时间短并能控制对模型解码的精细程度,能更有效的进行几何和拓扑编码。
(2)压缩程度可以进行有效控制,一般能达到无损压缩程度,如果设置较小的Octree深度值也能得到更大压缩比率的有损压缩。
(3)设计了优化的递进显示策略,使得客户端图形界面不仅很快就能得到图形显示,并且所展示的图形恢复过程比较合乎人眼的视觉习惯。
图1为本发明基于Octree的三维网格模型编/解码方法中几何数据编解/码流程图;图2为本发明的Octree构造过程(为作图方便,使用四叉树代替Octree,每一次划分得到的四个子空间中左上角序号为1,右上角序号为2,左下角序号为3,右下角序号为4);图3为本发明的几何文件的编码格式;图4为本发明的递进文件的编码格式;图5为本发明的无纹理的Bunny模型在客户端的递进显示过程;图6为本发明的有纹理的兵马俑模型在客户端的递进显示过程。
具体实施例方式
本发明采用如下步骤(1)几何信息压缩编码如图1所示,本发明的基于Octree的三维网格模型压缩编/解码中的几何信息压缩编/解码的流程图。首先对输入的三维网格模型中的顶点集合进行Octree分解,得到含有顶点的Octree数据结构,然后对该Octree进行编码得到bit流A,这个流中含有冗余数据,必须对其进行再次编码压缩,本发明选择接近熵编码理论极限的算术编码对其压缩,得到bit流B。bit流B可结合拓扑及属性数据在Internet上发布后,客户端一旦得到bit流数据,就对其进行解码,得到bit流A’,然后恢复出Octree并计算顶点的坐标。解码是编码的逆过程,其方法与编码相似。
如图2所示,为Octree的构造过程。为了作图方便,这里使用四叉树代替Octree,每一次划分得到的四个子空间中左上角序号为1,右上角序号为2,左下角序号为3,右下角序号为4。假设每个节点中含有n个非空子节点,其子节点分布情况的种数为C8n。进一步分析Octree节点类型,发现在所有的节点中,只有1个子节点非空的节点特别多。将这些占总节点数较多的节点挑选出来单独编码,可进一步节省存储空间。对于只有1个子节点非空的节点(以下简称M节点),只有C81种不同的情况,那么只需要3位(bit)即可对该类型节点编码。下面进行收益分析。
不考虑统计特性,每个子节点均用8bits编码。若使用上述改进编码,需增加1bit的判断位(实际操作中不需要增加判断位,见(3)(C)所述方法),如判断位为0表示当前节点是M节点,用3bits表示;判断位为1代表当前节点是非M节点,用8bits表示。假设M节点在所有节点中的概率为P,则使用改进编码平均每个节点所需位数为(1+3)×P+(1+8)×(1-P)=9-5P若要使改进编码比原编码短,即9-5P<8,P>20%。实际对于一般模型在子树划分过程中,M节点很多,通常都大大超过20%,如bunny模型,其M节点占总节点数的75%,这样的收益是很大的。在本方法中采用M节点3bits、非M节点8bits来编码几何数据。对于M节点,3bits所表示的十进制值为m,则表示该M节点8个子节点中第m个子节点非空;对于非M节点,8bits中为1的子节点表示非空,为0的子节点为空。
几何文件格式如图3所示。几何文件后缀名为.geo,除几何信息主体外,还包含72bytes的文件头信息,和一个文件结尾标志符。其中文件头中包含模型顶点数目、面片数目、模型中心点坐标、初始包围盒大小以及Octree每一层的节点个数。
(2)拓扑数据和属性数据递进编码在上述第一步建立Octree的过程中,每个节点包含一个顶点集合,设为SVertPerNode,该集合中实际记录的是顶点的原始索引值,拓扑数据和属性数据中对应的顶点也是按照原始的顶点索引值记录的。但是.geo编码文件并不按照原始顶点索引顺序编码,而是按照Octree广度优先遍历递进编码的,所以在几何数据递进编码的情况下,拓扑数据和属性数据无法与之对应。这里采用的方法是在编码之前就对顶点索引进行重排,即按照Octree中叶节点从左到右的顺序,对其中的顶点索引重新排列得到新的顶点序列,并且根据新顶点序列更新原始拓扑、属性信息中顶点索引值。
当客户端对几何数据进行递进解码时,三维网格模型中的原始拓扑数据的排列顺序不能与几何数据流同步显示。为解决这一问题,可对照原始拓扑信息,找出SVertPerNode中哪些顶点能够成一个三角面片。每个节点有一个域值记录了这些三角面片的索引集合,设为STriPerNode,其中每个元素为一个三元组[a,b,c],a,b,c为顶点索引。在对Octree进行广度优先遍历的时候,后面节点的STriPerNode中会出现重复的三角形索引。本方法设置了一个数组DirtyFlag可跳过重复三角形索引,DirtyFlag的元素个数与三角面片个数相同,它用来记录当前三角面片是否已经被记录,如果当前面片尚未记录,则加入递进显示的面片列表,如果已经记录了,则不加入。假设当前节点的非空子节点为ChildNodek(0≤k≤8),a属于ChildNodeka,b属于ChildNodekb,c属于ChildNodekc,递进显示的面集合为Lprogress,下面算法为构造Lprogress的过程loop每一个节点Nodeloop STriPerNode中每一个元素if(ka!=kb)且(kb!=kc)且(ka!=kc)if DirtyFlag[STriPerNode[i]]==falseDirtyFlag[STriPerNode[i]]=trueAdd STriPerNode[i]to Lprogress遍历所有节点后,Lprogress中的面片排列顺序即为递进显示的拓扑顺序。最终生成的拓扑文件后缀名为.con,其记录了熵编码后递进显示的拓扑信息。
属性信息包含法向量,纹理等。法向量信息通过客户端解码实时计算产生,不需要额外的编码文件。纹理信息包含二维纹理坐标、三维纹理坐标索引和纹理图片三部分信息,其中前两者采用和拓扑信息递进类似的方法递进编码,纹理图片则预先一次性传输到客户端。最终生成的属性文件后缀名为.nor,其记录了熵编码后递进显示的二维纹理坐标和三维纹理坐标索引信息。
(3)递进数据
Octree的子分结果将几何数据分为不同的层次,这将产生不同分辨率的几何图形。在几何编码时并不需要编码每个非空节点所包含的顶点索引值,而只需编码每个非空节点所包含顶点的个数。其作用主要有三个(A)记录顶点个数足以确定顶点序号。在(2)中按照Octree中叶节点从左到右的顺序,对其中的顶点索引重新排列得到新的顶点序列。记录当前节点所含顶点的个数,再结合同一层前面节点所含顶点个数,即能确定当前顶点的索引。假设当前层第一个节点所含顶点个数为n1,第m个节点所含顶点个数为nm,第m个节点所含顶点的索引起始值为indexmStart,最后一个索引为indexmEnd,并假设顶点索引从“1”开始,则indexmStart=(Σi=1m-1ni)+1,indexmEnd=(Σi=1m-1ni)+nm]]>(B)不需额外标志位判断是否一层已遍历完。假设模型顶点总数为nv,Octree每一层所有节点所包含的顶点个数和都等于nv。根据这一原则设置一个计数器counter就能在几何数据流读取过程中自行判断当前层的节点是否读完Counter=0loop读取节点信息if counter<nvcounter=counter+当前节点包含的顶点个数else一层已遍历完counter=0通过设置计数器减少了几何文件中设置判断位的存储开销。
(C)不需额外标志位判断当前节点是哪一种节点。在(1)中将节点分为两类M节点和非M节点,并采用1bit来判断当前节点属哪一类。在递进文件中使用一个整型数据记录当前节点所包含的顶点个数,通过设定该整型值的正负来判断节点类型,正数表示M节点,负数表示非M节点。这样减少了几何文件中设置判断位的存储开销。
最终生成的递进文件后缀名为.pro,其记录了熵编码后上述递进显示信息,如图4所示。
(4)多分辨率显示策略客户端解码显示图形时,并不是接收一个节点信息即刷新显示。通过判断Octree一层是否已遍历完,来决定是否更新显示。即判断接受数据流中当前已传输过来的节点所包含的顶点个数,如果其顶点个数达到nv,则表明Octree一层结束,即将开始下一层节点传输,此时在客户端刷新显示。若Octree共有12层,则客户端只需刷新显示12次即可。这种显示策略节省了客户端的计算开销,并且避免了显示时模型某些地方精细、某些地方粗糙的现象。
图5所示为bunny模型经过压缩编码之后通过网络传输,客户端对其解码的情况。随着后台数据流的不断传输,客户端逐渐显示出逼近原始模型形状的三维模型。(a)、(b)、(c)、(d)、(e)、(f)6幅小图为Octree在不同层次解码完毕时所显示的图形。在数据传输期间用户就可对模型进行交互操作,并可随时中止数据流的传输。
本方法也支持带纹理的模型递进传输。图6所示为带纹理的兵马俑模型经过压缩编码之后通过网络传输,客户端对其解码的情况。
权利要求
1.一种基于Octree的三维模型压缩编/解码方法,其特征在于包括以下步骤(1)对三维网格模型的顶点信息重新进行Octree空间划分,统计分析其中各种不同类型的节点,找出占总节点数目比例最多的一类或几类节点,单独对其使用较少的比特位进行几何信息编码;(2)根据几何信息的传输顺序,重新排列拓扑信息和属性信息并编码;(3)设置单独的递进文件用来控制几何信息传输、显示以及解码时拓扑、属性信息的同步映射。
2.根据权利要求1所述的一种基于Octree的三维模型压缩编/解码方法,其特征在于在所述步骤(1)中的几何信息编码方法为对得到的Octree中子节点中只有一个非空的节点单独使用3位记录,其他类型的节点使用8位来记录,依此原则对Octree进行广度优先策略遍历记录数据流,并对得到的数据流进行二次熵编码。
3.根据权利要求1所述的一种基于Octree的三维模型压缩编/解码方法,其特征在于在所述步骤(2)中在对拓扑和属性信息编码之前按照Octree中叶节点从左到右的顺序,对其中的顶点索引重新排列得到新的顶点序列,并且根据新顶点序列更新原始拓扑、属性信息中顶点索引值。
4.根据权利要求1所述的一种基于Octree的三维模型压缩编/解码方法,其特征在于在所述步骤(3)中采用的递进文件生成方法为只编码Octree中每个非空节点所包含顶点的个数。
5.根据权利要求1所述的一种基于Octree的三维模型压缩编/解码方法,其特征在于在所述步骤(3)中所采取的递进显示策略为在客户端模型更新显示的次数等于Octree的深度,即只在Octree每一层数据传输结束时更新显示。
全文摘要
本发明是一种基于Octree的三维模型压缩编/解码方法。当前庞大的三维数据对现有图形引擎的处理能力和处理速度提出了巨大的挑战,而Internet的迅猛发展也使得三维数据的应用越来越广泛。本发明对三维网格模型的顶点信息重新进行Octree空间划分,统计分析其中各种不同类型的节点,找出占总节点数目比例最多的一类或几类节点,单独对其使用较少的比特位编码。根据几何信息的传输顺序,重新排列拓扑信息和属性信息并编码。设置单独的递进文件用来控制几何信息传输、显示以及解码时拓扑、属性信息的同步映射。本压缩编/解码方法空间划分效率高,收敛速度快,客户端响应等待时间短并能控制对模型解码的精细程度。
文档编号G06T9/40GK1946180SQ200610114098
公开日2007年4月11日 申请日期2006年10月27日 优先权日2006年10月27日
发明者赵沁平, 齐越, 沈旭昆, 蔡苏 申请人:北京航空航天大学