发明内容
针对现有技术中存在的技术问题,本发明的目的在于提供一种基于块分解的彩色LOD模型自动生成方法,该方法LOD生成技术效率高、效果好、依赖少,只需要输入原始的彩色模型,就可以生成多层次的LOD,实现模型显示效果和计算机资源消耗的综合最优。
为实现上述目的,本发明提供了一种基于块分解的彩色LOD模型自动生成方法,包括如下步骤:
步骤一:输入彩色模型,分层简化带纹理的模型并获得多层次的简化彩色模型;
步骤二:利用步骤一获得的多层次的简化彩色模型生成彩色LOD模型。
进一步地,所述步骤一的具体操作包括:1)输入彩色模型并将其简化成不带纹理的白模;2)简化后的白模进行三角网格聚类并分Patch;3)给每个Patch 贴纹理;4)合并带纹理的Patch,形成一个层级的简化的带纹理的模型;5)重复上述1)、2)、3)、4)直到产生多层次的简化彩色模型。
更进一步地,所述步骤1)中采用基于QEM的半边折叠算法实现简化不带纹理的白模,以顶点到其所在周围拟合平面的距离平方作为误差测度,统计所有顶点的误差测度并排序,优先折叠误差小的顶点到它的邻近顶点,完成半边的折叠和简化三角网。
更进一步地,所述基于QEM的半边折叠算法简化的白模保留原彩色模型的边界轮廓。
更进一步地,所述步骤2)中采用区域增长算法进行网格模型分割,首先根据每个三角面与其邻接三角面法相之间的差异来确定种子点,优先使用差异较小的平坦区域的三角面作为种子点,遍历搜索种子点的邻接三角面,若邻接三角面与种子点法相一致,则将其加入到当前正在进行生长的网格块中;若邻接三角面与种子点法相不一致,则访问下一个邻接三角面,直至当前网格块不能添加新的三角面为止,则当前网格块的区域生长过程完成;然后选取另一个未访问过的种子点生长下一个网格块,当所有的网格三角面都访问完毕,则完成三角网格模型的分割。
更进一步地,所述步骤3)Patch贴纹理的方法为:首先依据Patch的顶点获取Patch在原模型中对应的区域,然后将三维的Patch二维参数化,获得Patch 未填充颜色的纹理和Patch上每三维顶点对应的二维纹理像素坐标;最后将Patch 纹理块中的像素进行颜色信息填充。
更进一步地,所述步骤4)合并带纹理的Patch的方法为:首先标记所有纹理块影像有效像素范围边界,并按照纹理块影像总像素的数量由大到小排序;然后统计当前未被摆放的所有纹理块影像的总像素数N,计算新纹理影像的边长 l,若l大于预先设定的最大单张纹理影像的大小,新建大小为l*l的纹理影像模板I;最后按照纹理块影像总像素的数量排序往影像模板I中逐个摆放纹理块影像Ii,直到所有的纹理块全部摆放完毕为止;根据每个纹理块在纹理影像中的摆放位置,更新所对应的Patch顶点的UV值。
进一步地,所述步骤二的具体操作包括:1)确定分层策略,构建LOD分割树;2)构建数据LOD树,输出osgb数据文件。
更进一步地,所述步骤1)中分层策略为Adaptive树的分割方式,原始的带纹理模型往下分裂的过程中,根据当前待分割节点模型的几何特点,动态地选择二叉树、四叉树、八叉树之一的分割方式,由输入数据信息从根节点开始进行向下分裂,直至节点不满足再分条件为止。
更进一步地,所述再分条件为当前节点的三角形个数,若该节点的三角形数目少于阈值就不再进行分割。
与现有技术相比,本发明的有益效果在于:
(1)本发明提供的一种基于块分解的彩色LOD模型自动生成方法使彩色 LOD模型生成技术效率高、效果好、依赖少,只需要输入原始的彩色模型,就可以生成多层次的LOD,实现模型显示效果和计算机资源消耗的综合最优。
(2)本发明的方法使用半边折叠算法来简化不带纹理的白模,该算法在保持模型视觉效果的基础上,既能较好地实现网格模型的简化,也可实现LOD多分辨率模型的建库。
(3)本发明的方法使用区域增长算法实现网格分割,该算法方法简单,容易理解和实现,没有费时的迭代过程,算法效率高。
(4)本发明的方法在构建LOD分割树时采用Adaptive树的分割方式,它在模型往下分裂的过程中,根据目前待分割节点模型的几何特点,动态地选择二叉树、四叉树、八叉树之一的分割方式,使同一层级每个节点的数据量接近一致,资源消耗上达到最优化配置。
具体实施方式
展示一下实例来具体说明本发明的某些实施例,且不应解释为限制本发明的范围。对本发明公开的内容可以同时从材料、方法和反应条件进行改进,所有这些改进,均应落入本发明的的精神和范围之内。
实施例
1.分层简化带纹理的模型
生成LOD需要建立一个如图1所示的层级模型,所以第一步需要输入原始带纹理的模型M得到多个不同简化层次的带纹理模型(M1,M2,M3……)。下面是实现这一过程的5个步骤:
(1)不带纹理的白模简化
白模在被简化的过程中需要保持模型特征,可以采用基于QEM的半边折叠算法,具体方法参见“熊仕勇,李沁翰,谢爱荣.基于半边折叠的LOD三维模型简化算法[J].计算机工程与设计,2016(3):655-659”。QEM半边折叠算法采用点到其所在周围拟合平面的距离平方作为误差测度,统计所有顶点的误差测度并排序,优先折叠误差小的顶点到它的邻近顶点,完成半边的折叠,实现三角网的简化。良好的半边折叠顺序可以保留原始模型中的拐点、尖锐边、折痕和角等重要几何细节特征,在满足视觉效果的同时简化网格数据。在模型简化的过程中,一定要保持模型的边界轮廓。所以需要一套判断机制,禁止破坏边界的半边折叠。这种半边主要是起点是边界点而终点是非边界点的半边。图2是半边折叠算法折叠过程示意图。
(2)简化后的白模进行三角网格聚类,分Patch
步骤(1)中完成模型M的几何简化之后,得到的是没有纹理的白模M′,接下来就是给白模贴上低精度的纹理,即纹理映射。由于纹理映射是要给三维的模型贴上二维的纹理,所以首先需要将三维网格模型二维化。下一步将三角网格分割展开成一系列平坦的块Patch(P1′,P2′,P3′……),实现三维网格模型的二维化。
网格分割是根据网格元素(三角面、顶点、边)的物理邻接性和几何信号相似性将三角网格分解为互不相交的区域。本实施例采用区域增长算法进行网格模型分割,具体分割方法参见“曹彩霞.三角网格模型分割及其简化应用.无锡:江南大学硕士学位论文,2008”,它的优点是方法简单,容易理解和实现,没有费时的迭代过程,算法效率通常特别高。该算法的主要思想是:根据每个三角面与其邻接三角面法相之间的差异来确定种子点,优先使用差异较小的平坦区域的三角面作为种子点,遍历搜索种子点的邻接三角面,如果邻接三角面与种子点的法相一致,则将其加入到当前正在进行生长的网格块中,否则访问下一个邻接三角面,直到当前网格块(Patch)不能添加新的三角面为止,则当前网格块的区域生长过程完成,再选取另一个未访问过的种子点生长下一个网格块,当所有的网格三角面都访问完毕,则三角网格模型的分割也就完成,图3 为一个分Patch的效果示意图。网格模型分割算法包括但不限于本实施例所采用的区域增长算法,还包括层次聚类算法、迭代算法、谱分析聚类、隐式方法等。
模型进行三角网格聚类以后,得到的是一系列近似平坦的Patch(P′1,P′2, P′3……),每个Patch由法向接近的连续的三角面构成,可拟合成一个平面。
(3)给每个简化后模型的Patch贴上纹理
模型在简化过程中,模型的整体轮廓和原模型的相比并没有发生大的变化。所以直观上,可以给每个Patch贴上其在原模型中相对应位置上的纹理。给每个简化后模型的Patch贴上纹理分为以下三步:
I.依据Patch的顶点,获取Patch在原模型中对应的区域
模型在简化的过程中,半边折叠操作并不会移动顶点和添加新的顶点,所以可以在简化之前给每个顶点添加一个索引标签,通过简化后的Patch上的每个点的索引标签,寻找其在原模型上的点,然后通过区域增长,搜索邻近的点,在原模型中找到一个能完全覆盖简化后Patch的最小三角网格区域。搜寻Patch 在原模型的对应区域的方法如图4所示。
图中A、B、C、D、E是简化后的一个Patch上的所有点,根据简化过程中顶点绑定的索引标签不变性,可以在原模型中找到对应的点A0、B0、C0、D0、 E0,然后通过区域增长找到点F和点G。在原模型中找到的7个面必须能覆盖 Patch的3个面,否则后续给Patch贴上纹理就会出现问题。另外因为还有两个三角面贴得很近但法向相反的情况,譬如牌子,所以在区域增长的过程中还必须考虑面的法向,在原模型寻找的三角面的法向要和Patch的法向接近。
II.将三维的Patch二维参数化,
为了在三维Patch的表面映射上二维的纹理,需要对三维的Patch进行二维参数化,即求Patch中每个三维顶点的二维纹理坐标。
由于在网格分割的过程中,尽量保证了相同的平坦区域被划分到同一个 Patch中,所以可以利用生成正射影像的思想对每个Patch进行二维参数化:首先对Patch进行平面拟合,求出三维Patch到拟合平面的仿射关系RT,本发明同样采用PCA算法;然后将Patch中的三维顶点坐标投影到拟合的平面上,这样就可以得到每个三维顶点的二维空间坐标;最后求取这些二维坐标的外包盒矩形,并根据预先设定的像素空间分辨率将外包盒矩形划分成许多个小正方形,即每个小正方形位置对应Patch纹理上一个像素坐标,也对应一个归一化的UV 值。这样就得到了Patch还未填充颜色的纹理和Patch上每三维顶点对应的二维纹理像素坐标。下一步就是要给Patch的纹理填充颜色值。
III.给Patch的纹理填充颜色。
二维参数化之后,每个Patch都会生成一个纹理块影像,同时可以得到Patch 中的顶点在纹理块影像上的二维像素坐标,所以需要将Patch纹理块中的像素进行颜色信息填充:
顺序取出Patch中的三角面fi(va,vb,vc),其三个顶点在Patch纹理上对应的二维像素坐标分别为(xa,ya)、(xb,yb)和(xc,yc),组成一个纹理三角形,从纹理三角形内顺序取出有效像素点p(xi,yi),根据p在纹理三角形内的位置计算其重心化坐标(wa,wb,wc),内插出p在Patch中的三维坐标vp=vawa+vbwb+vcwc。然后根据Patch 在原模型中对应的模型区域,求出vp在原模型中对应的三角面fi0(va0,vb0,vc0),三个顶点对应的二维像素坐标分别为ua0(xa0,ya0)、ub0(xb0,yb0)和uc0(xc0,yc0)。根据vp在原模型中对应的三角fi0(va0,vb0,vc0)的位置计算其重心化坐标(wa0,wb0,wc0),内插出 vp在原模型纹理空间的坐标p0=ua0wa0+ub0wb0+uc0wc0。根据原模型纹理像素坐标 p0和Patch的纹理像素坐标p的从二维到三维再到二维的对应关系,p0的颜色值赋给p。遍历Patch的每一个三角面,用上述方法就可以对Patch纹理块中的像素进行颜色信息填充。Patch纹理块像素颜色信息填充如图5所示。
对于生成的纹理块边界像素点可能会出现锯齿状,另一方面相邻的纹理块之间由于计算时的精度损失可能会出现纹理缝隙,所以需要对纹理块边缘像素点进行处理,这里采用扩散填补的方式,将边缘像素点向外扩充一定的范围。
(4)带纹理的Patch合并
每个Patch都有一张纹理块影像与之对应,所以在输出结果之前,需要将这些纹理块进行合并,然后摆放到标准大小(一般为2的n次方)的纹理影像上,从而达到节约存储空间的目的,本实施例使用的类似于贪心法则的摆放方法:
I.标记所有纹理块影像有效像素范围的边界ei(p1,p2,...,p3),按照纹理块影像总像素的数量由大到小的顺序进行排列;
II.统计当前还未被摆放的所有纹理块影像的总像素数N,利用公式
计算新纹理影像的边长l,如果l大于预先设定的最大单张纹理影像的大小l
max (默认值是8192),那么令l=l
max,新建大小为l*l的纹理影像模板I;
III.按照预先排列好的顺序往影像模板I中逐个摆放纹理块影像Ii:①以纹理块Ii最小边上的1/8为步长,从影像模板的I左上角往右下角方向遍历空白的区域;②如果纹理块Ii的边界ei中有任意一个顶点pi所在的模板像素位置已被填充,那么就需要根据设定的步长跳到下一个候选的摆放位置;③如果遍历完模板影像仍未找到合适的摆放位置,那么就跳过当前纹理块Ii,继续摆放下一个 Ii+1,否则将当前纹理块Ii放中的颜色信息填充到模板影像中并将对应的像素位置标记为已填充,记录当前纹理块的摆位置;
循环执行步骤II与III直到所有的纹理块全部摆放完毕为止,然后根据记录的每个纹理块在纹理影像中的摆放位置,更新所对应的Patch顶点的UV值。
至此,一个简化的带纹理模型已经生成。然后把它作为输入,重复上述四个步骤,就可以得到再下一层次的简化的带纹理模型。
2.利用分层简化的彩色模型生成LOD
根据如图1所示的LOD树结构示意可知,生成LOD必须先对所有不同层次的带纹理的模型进行切割,并且按树状结构组织起来。所以需要首先生成分割树然后生成LOD树,分割树是对LOD数据层级组织关系的表达,LOD树是依据分割树,生成无缝的层级LOD数据文件。
(1)确定分层策略,构建LOD分割树
分层策略涉及到两个方面,一是分割树的层数,二是分割树中从节点到其子节点的模型的分割方式。分割树的层数由两方面的因素决定,一是最原始层模型的地面分辨率,它决定了叶子节点所在的层数。二是所有Tile的数目,当加载所有的Tiles时候,要确保所有Tile都显示在视窗范围内,这就限定了每个Tile根节点的到屏幕投影的大小,从而决定了根节点所在的层数。以上两者就决定了分割树的层数。
分割树可以有多种分割方式:二叉树、四叉树、八叉树、R-树、K-D树、 Adaptive树等。树中每一个节点存储当前数据范围、分割类型、分割方法等。分割树从上置下(top-down)方式进行创建,由输入数据信息从根节点开始进行向下分裂,直至节点不满足再分条件为止。再分条件可以是当前节点的三角形的个数,一旦该节点的三角形数目少于一定的阈值就不再进行分割。
在本发明中使用的是Adaptive树的分割方式,它在模型往下分裂的过程中,根据目前待分割节点模型的几何特点,动态地选择二叉树、四叉树、八叉树之一的分割方式,该分割方式使同一层级每个节点的数据量接近一致,资源消耗上达到最优化配置。节点分割策略如表1所示。
表1节点分割策略表
图6为一个Adaptive分割树示意图,在本发明中,构建分割树的输入信息是最原始的带纹理的模型。从根节点开始向下分裂,同时记录节点当前分割类型、分割范围、节点名称等信息,直至节点不满足再分条件为止。这是因为:
(1)最原始模型是要分割成叶子节点的,最原始模型才能达到这个分割深度。
(2)由最原始模型简化而来的其它层次的带纹理模型,在整体轮廓结构上,都和最原始模型保持一致,所以其他层级的带纹理模型都可以使用这一套分割方式进行分割。
至此,分割树形成了LOD树的框架,LOD树每一个节点还没有被赋予实体数据。下面进一步做的就是根据分割树,切割各层次带纹理模型,构建数据LOD 树。
(2)构建数据LOD树,输出osgb数据文件
与分割树相反,LOD树的构建由下而上(Button-Up)进行处理。主要思路为:首先生成LOD树叶子节点的数据,然后通过将分割到子节点的数据进行合并的方式,生成LOD树中其他不同层级的非叶子节点的数据,进而构建完整的 LOD树。
在LOD树的输出格式osg中主要涉及到GeoNode,PagedLOD和Group三种数据结构:GeoNode为树的叶子节点;Group为有多个子节点的非叶子节; PagedLOD为只有一个子节点的非叶子节点。下面详细介绍叶子节点和非叶子节点的定义方式及输出格式。
叶子节点:将最原始带纹理模型,从根节点开始,按照分割树中定义好的分割类型及分割范围,分割到叶子节点所在的这一层。每个叶子节点都用osg 中的osg::GeoNode数据格式组织起来。
非叶子节点:将该层级的带纹理模型,从根节点开始,按照分割树中定义好的分割类型及分割范围,分割到该层级的下一层,然后将分割到子节点的数据进行合并。当该节点只有一个子节点时,该节点用osg::PagedLOD的数据格式组织其唯一子节点的数据。当该节点有多个子节点时,该节点用osg::Group 的数据节点组织起来:首先用osg::PagedLOD的数据格式组织其每一个子节点的数据,然后用osg::Group将所有的osg::PagedLOD合并起来。
每一个osg::PagedLOD数据要设置一个最大视距(数据包围球到屏幕的最大投影直径)参数Dmax,一旦节点的这一部分模型数据的包围球到屏幕的投影大于Dmax,该节点被隐藏,显示更精细的子节点。至此,一个完整的LOD数据树已经形成。图7为一个LOD数据树的结构示意图,从图中可看出,本实施例的方法可以实现根据节点模型到屏幕的距离,计算机在当前节点与子节点或父节点之间动态地切换显示和加载模型。在子节点数目大于1情况下,当前节点作为一个整体osg::Group和父节点进行切换,同时当前节点又可以分成多个部分osg::PagedLOD,各个部分和相应的子节点进行切换。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,根据本发明的技术方案及其发明构思加以等同替换或改变,都应涵盖在本发明的保护范围之内。