背景技术
大规模地形绘制是虚拟城市的重要组成部分,利用数字高程模型(DEM)结合高清晰卫星或航拍图生成三维虚拟地形是现在比较常用的实现方式。然而对于海量地形,由于硬件限制,不能将所有的数据一起导入内存进行实时绘制,因此需要采用合理的地形数据组织方式和有效的加速算法。采用多分辨的金字塔模型[1]来组织地形,被证明是一种合理有效的实现方法。
采用金字塔模型(multi-resolution hierarchy)来绘制地形,需要把地形的网格数据分为很多块,然后根据视点的位置选择合适的数据进行拼合。渲染时,不可避免的会因为块内或块间相邻节点的分辨率不同而产生大量的网格裂缝,影响仿真效果。
针对网格裂缝问题,目前已有多种解决办法:(1)限制四叉树法[2];(2)有向无环图(directed acyclicgraphic,DAG)法[3];(3)垂直边缘填充方法[4]。其中,限制四叉树法是在构造四叉树的过程中给每个顶点设立约束关系,从而在绘制每个树节点时依据约束关系来激活相应的顶点,该约束关系保证相邻节点之间级数差不超过1。但该方法适用于单块地形的绘制,并不适用于地块的动态拼合;基于ROAM算法,依据顶点引入次序地有向无环图中的依赖关系来消除裂缝,可以拼合许多地形块。但是,该方法无法解决不同分辨率下的地形块间的拼合问题;而垂直边缘填充方法,则易造成接缝处陡峭的现象。
【参考文献】
[1]DU Ying,WU Yu-guo,WANG Xiao-ming,YOU Xiong.Research on Pyramid Model for GlobalMulti-resolutionVirtual Terrain Environment[J].Journal of System Simulation,2006,18(4):955-958.[杜莹,玉国,王晓明,游雄.全球多分辨率虚拟地形环境的金字塔模型研究[J].系统仿真学,2006,18(4):955-958.]
[2]YIN Hong,XU Ji-heng,ZHOU Liang-wei,LIU Shi-bing,HUANG Da-jie.Technology of ProgressiveMeshes for Large Scale Terrain Based on Restricted Quadtree[J].Application Research of Computers,2006,5:151-153.[殷宏,许继恒,周良伟,刘世彬,黄大节.基于限制四叉树的大规模地形可视化及其实现[J].计算机应用研究,2006,5:151-153.]
[3]Yin Yuan,Chen Guojun,Wu Wei.An Algorithm of Avoiding Crack for Rendering Parting Terrain[J].Journalof Computer-aided Design and Computer Graphics,2006,18(10):1557-1562.[殷媛,陈国军,吴威.地形分块绘制中的边界裂缝处理算法[J].计算机辅助设计与图形学学报,2006,18(10):1557-1562.]
[4]Ulrich T.Rendering massive terrains using chunked level of detail control[C].Computer GraphicsProceedings,Annual Conference Series,ACM SIGGRAPH,San Antonio,Texas,2002:Course Notes#35.
具体实施方式
下面结合说明书附图给出本发明的具体实施方式。
1基于金字塔模型的海量地形绘制
1.1金字塔模型
金字塔模型是一种多分辨率层次模型,其组织的地形网格数一般满足(2n+1)*(2n+1)。在构建金字塔时采用倍率方法构建,地形网格数据与影像数据形成多个分辨率层次,但表示的范围不变。地形绘制时,无需进行实时重采样,直接动态选择不同分辨率的数字高程模型数据和纹理影像数据。
1.2基于外存(out-of-core)的地形组织过程
金字塔模型由四叉树索引数据。该发明中将此索引金字塔的四叉树称为主干四叉树。主干四叉树中的每个节点所对应的地形面积可能不同,但网格数一致。为了更好的实现动态LOD,每个地块节点的数据再用四叉树组织起来。以下将该四叉树称为子四叉树。
基于外存(out-of-core)的地形组织过程中,用一个线程索引主干四叉树,依据视点位置预先载入一组地块数据。如图1所示,粗线以内表示预读数据范围,细线以内表示视景体的张角范围。绘制每一帧时,根据视点位置,找到需要绘制的地形块,然后根据各地形块的子四叉树找到需要绘制的网格,实现动态LOD,提高绘制速度。
1.3金字塔模型中的网格裂缝问题
定义1:每帧渲染中,块内或块间地理位置相邻的两子四叉树节点称为地理相邻子节点。地理相邻子节点对应网格的分辨率的倍率可用节点深度差来表示,比如两地理相邻子节点的分辨率倍率为22,则称节点深度差为2。
裂缝产生的根本原因是采用动态LOD渲染地形时,自适应选择主干四叉树与子四叉树的节点,造成地理相邻子节点深度不同。裂缝的产生可分为以下两种情况:
(1)渲染某一地块时,动态选择该块地形的子四叉树,不能保证地理相邻子节点的深度相同,造成地块内网格裂缝。
(2)动态拼合地形时,在拼合处会产生裂缝。
与其他数据组织方式相比,金字塔模型存在一个特有的网格裂缝问题,即由不同分辨率的两地形数据块拼合所导致的裂缝。
2利用分裂标记表消除网格裂缝
分裂标记表即一组分裂标记的集合。地形中的每个顶点对应表中唯一的分裂标记,每个分裂标记设定三个状态:初始状态、分裂状态、绘制状态。
利用分裂标记表从整体上建立块内或块间各节点的约束关系,不仅可以消除块内的网格裂缝,而且可以方便的解决地块拼合时所产生的块与块之间的网格裂缝。
其主要思想是保证在渲染过程中地理相邻子节点的深度差不超过1。首先控制相邻地块在主干四叉树中的深度差不超过1,而后控制块内的深度差不超过1,从而消除网格裂缝。
渲染子四叉树节点时,采用GL_TRIANGLE_FAN的绘制方式。当地理相邻子节点的深度差为1时,通过加线的方法来消除裂缝。如图2中的粗线所示。
2.1分裂标记的调整过程
当相邻地块在主干四叉树中的深度差超过1时,首先将最大深度差调整为1。2.3中讲述了具体的实现方法。当相邻地块在主干四叉树中的深度差不超过1时,各节点分裂标记的调整过程可以分为以下三个步骤:
(1)初始化。将表中的分裂标记置为初始状态;
(2)在需要渲染的子四叉树中,根据分裂判定函数来确定该节点是否需要分裂。如果需要分裂,将节点的中心点所对应的分裂标记置为分裂状态,如果需要绘制将其置为绘制状态;
(3)遍历子四叉树,调整分裂标记保证地理相邻子节点的深度差不超过1。
如图3所示:(1)节点将会绘制,其中心顶点对应的分裂标记置为绘制状态,同样(2)节点的中心顶点对应的分裂标记也为绘制状态,其父节点对应的中心顶点,及其祖父节点对应的中心顶点的分裂标记都应为分裂状态。从下往上的递归遍历过程中,所有深度差大于1的地理相邻子节点,都可以通过递归转化为深度差为2的情况。在遍历过程中对每个遍历到的节点都要做出图4所示的调整。
经过以上处理,保证地理相邻子节点的最大深度差不超过1,最终状态如图5所示。
2.2通过分裂标记消除裂缝
调整好分裂标记以后,地理相邻子节点的最大深度差不超过1。如图2所示,可加线来消除裂缝。构造该类连线时,两地理相邻子节点可能位于主干四叉树不同深度的两块地形中。对于粗线所处地块因分辨率过低而不存在边界端点数据的情况,需在高分辨率的相邻地块中找到对应的顶点。
如图2所示,若需要添加连线(1),而该连线的边界端点的数据未保存在该块地形的地形数据中,则需要查找右边更高分辨率的对应的顶点。假设该块地形对应主干四叉树的节点为第L层,第i行,第j列,该节点对应子四叉树的中心点坐标为(cx,cy),其中cx表示行数,cy表示列数。在做连线(1)时,对应的地理相邻子节点的寻找算法如图6所示。
2.3调整相邻地块的深度差
在主干四叉树中选择节点时,判定规则为(1/d<C)。其中1为节点的中心位置到视点的距离,d为节点的大小,C为一个可以调节的因子,C越大,地形细节越多,反之则细节越少。当满足该规则时,该节点需要继续分割。
经过以上选择基本保证在远处选择低分辨率的节点,近处选择高分辨率的节点。然后借鉴以上做法,为主干四叉树配置一个分裂标记表,并通过相同的调整方法来使相邻的节点的深度不超过1。
至此,完成了基于金字塔模型的海量地形绘制网格裂缝消除算法。
3实验结果
实验采用Intel P IV 3.0GHz,ATI X550显卡,1.00GB RAM的PC机。操作系统是Windows XP,开发软件是VC 6.0和OpenGL。实验使用的原始数据是四川省乐山市乐山大佛风景区16平方公里的DEM数据。网格数为2049*2049。金字塔主干四叉树中每个节点的网格数为65*65。图7为裂缝消除前后的光滑阴影图对比,图8为消除裂缝以后整个地形的网格与面片的渲染效果。
图9中列出了不同视点消除裂缝前后的网格数与帧速。从表中数据可以得出:采用分裂标记表来消除裂缝时增加的三角面片数并不多,对绘制速度的影响也不大。