一种去LoD层级约束的三维地形裂缝消除方法与流程

文档序号:14774953发布日期:2018-06-23 02:53阅读:593来源:国知局
一种去LoD层级约束的三维地形裂缝消除方法与流程

本发明涉及一种裂缝消除方法,尤其涉及一种去LoD层级约束的三维地形裂缝消除方法,属于地理信息技术领域。



背景技术:

随着遥感测绘数据采集、数据存储技术的发展,地形数据规模越来越大,数据精度越来越高,地形之上承载的建筑物模型、视频、管线等数据日益丰富。对于大范围、大场景下的地形特征来说,一方面要对其丰富的细节进行逼真的显示,另一方面又要有较高的显示效率,即使在目前硬件技术高速发展的情况下,也难以满足这两方面的要求。因此,海量三维地形的实时渲染技术一直是三维可视化领域的核心技术和难点之一。当前,国内外主要采取视相关的连续LoD(Level of Detail)技术对地形数据进行简化,即随着视点的移动,采用不同细节层次对地形进行表达。然而,由于LoD技术中存在的细节层次差异,不同层级的相邻地形网格边界上网格点的高程值并不完全一致,导致现有的地形裂缝消除方法在实现海量三维地形数据实时渲染时,通常会存在节点层次跨度小、渲染效率低、运算量大、出现地形裂缝等问题,严重影响到地形实时渲染效果。



技术实现要素:

为了解决上述技术所存在的不足之处,本发明提供了一种去LoD层级约束的三维地形裂缝消除方法。

为了解决以上技术问题,本发明采用的技术方案是:一种去LoD层级约束的三维地形裂缝消除方法,其整体步骤如下:

步骤一、采用四叉树地形多分辨率表达结构对三维地形的DEM数据进行格网划分;

步骤二、建立地形四叉树格网节点,将其划分为根节点、父节点、子节点和叶节点;

步骤三、对地形四叉树格网节点的邻居关系进行识别及判断,将每一个格网节点与其周围节点的邻居关系划分为边邻居、角邻居两大类,并对节点的各个边、角方位邻居信息设置Dirty,Dirty为更新标识,具有休眠及激活两种状态;

步骤四、根据视点相关的LoD控制规则,对四叉树叶节点进行合并与分裂,动态更新地形四叉树;

步骤五、判断对格网节点所需完成的处理,并对不同处理情况下的格网节点之间的邻居关系进行状态判断;

步骤六、判断遍历节点是否为新增节点:对于属于叶节点的新增节点,确认其邻居节点及其Dirty状态,若Dirty为激活状态则表明该节点存在裂缝可能,建立补缝集合对这些节点进行存储;

步骤七、对补缝集合中的节点进行裂缝消除运算:以单个节点为处理单元,顺序对节点的四条边和四个角进行计算,通过线性插值方法使处在不同层级的邻近节点的节点高程值与处理单元节点的高程值保持一致,实现节点裂缝消除。

步骤五中对格网节点之间的邻居关系进行状态判断的方式如下:

若需格网节点进行裂分生成新的子节点,则判断裂分叶节点位于父节点的方位,根据所在方位及空间位置关系,识别该节点的邻居信息,判断并记录各边邻居和角邻居的Dirty状态;

若需将格网节点合并生成父节点,则依次更新待合并为父节点的四个子节点的邻居节点邻居信息,判断并记录各边邻居和角邻居的Dirty状态。

步骤一中采用四叉树地形多分辨率表达结构对三维地形的DEM数据进行格网划分的方法为:用四叉树将已知范围的地形空间等分为四个相等的地形网格,并递归下去,将地形数据采样为分辨率递增的若干层级,对于树中的任意相邻层,下一层的采样精度都是上一层的2倍。

步骤四中视点相关的LoD控制规则为:

I、基于层次包围球的视景体裁剪:将视景体视角范围外的地形网格全部裁剪掉;

II、计算视点与地形网格中心点之间的距离:设坐标原点0,0,0,同时假设视点V的空间坐标为Vx,Vy,Vz,目标地形网格的中心点P的空间坐标为Px,Py,Pz,则视点与地形网格中心点的距离distance通过公式一计算得出:

III、在不影响地形真实感的前提下,为了使地形网格裂分的速率不至于太快,而加重渲染和调度的负担,在公式一中增加一个调节因子α将公式一变形为公式二:

IV、为每个地形网格设置阈值MaxLength;当distance≤MaxLength时,当前的地形细节层次为要显示的节点;当distance>MaxLength,则当前的地形细节层次节点应被置为合并状态,且要显示的是其父一级的地形细节层次节点;以此类推,或者地形网格裂分到最精细一级的细节层次节点,或者地形网格合并到最粗糙一级的细节层次节点。

本发明不仅节点层次跨度小、渲染效率高,而且运算量大,同时裂缝消除效率高,具有广泛的适用性。

附图说明

图1为本发明四叉树地形多分辨率表达结构示意图。

图2为地形格网节点的邻居关系约定示意图。

图3为视点相关的LoD控制规则示意图。

图4为视点在地形左上部分的地形四叉树动态更新示意图。

图5为视点在地形左下部分的地形四叉树动态更新示意图。

图6为实施例一中LoD层级相等的裂缝消除运算结果示意图。

图7为实施例一中LoD层级相差为1的裂缝消除运算结果示意图。

图8为实施例一中LoD层级相差为2的裂缝消除运算结果示意图。

具体实施方式

下面结合附图和具体实施方式对本发明作进一步详细的说明。

本发明的整体步骤如下:

步骤一、采用四叉树地形多分辨率表达结构对三维地形的DEM数据进行格网划分;其方法为:用四叉树将已知范围的地形空间等分为四个相等的地形网格,并递归下去,将地形数据采样为分辨率递增的若干层级,对于树中的任意相邻层,下一层的采样精度都是上一层的2倍。为保证能够对DEM数据进行多层次的等间距网格重采样,地形网格中的顶点数必须为(2n+1)×(2n+1)(n=0,1,2,…),若地形网格顶点数不满足此要求,可以对地形进行补充以满足条件。基于四叉树地形结构的地形可视化是动态地选择地形节点的过程,如图1所示,A1-An为按照四叉树地形网格数据划分,C1-Cn则是对应的四叉树索引节点树状结构表达,而集合T1中所有节点的集合实现了地形的连续多分辨率表示。

步骤二、建立地形四叉树格网节点,将其划分为根节点、父节点、子节点和叶节点;

步骤三、对地形四叉树格网节点的邻居关系进行识别及判断,将每一个格网节点与其周围节点的邻居关系划分为边邻居、角邻居两大类,并对节点的各个边、角方位邻居信息设置Dirty,Dirty为更新标识,具有休眠及激活两种状态;

结合图1和图2,对地形四叉树格网节点间的邻居关系进行说明。

地形四叉树格网节点中,没有父亲的节点称为根节点,如图1中的节点C1,没有孩子的节点称为叶节点,如图1中的节点C2,C6,C7等;

如图2所示,以格网中心的节点O为例,将其周围节点划分为边邻居、角邻居两大类。其中边邻居类可分为:左边邻居LN(图2中的LN1和LN2)、上边邻居UN(图2种的UN1和UN2)、右边邻居RN、下边邻居DN。角邻居类可分为:左上角邻居LUN、右上角邻居RUN、右下角邻居RDN、左下角邻居LDN。

四叉树格网中,依据父亲节点和孩子节点之间的空间关系,将位于父亲节点左上角的孩子节点命名为LUChild、右上角的孩子节点命名为RUChild、右下角孩子节点命名为RDChild、左下角孩子节点命名为LDChild。

步骤四、根据视点相关的LoD控制规则,对四叉树叶节点进行合并与分裂,动态更新地形四叉树;

在渲染地形时根据观察者的可视范围和距离,选择合适的地形区域和多分辨率的细节层次节点进行绘制。根据人类的视觉特点,通常采用基于坐标的LoD层级评估办法,结合视景体裁剪及视点与地形网格中心点距离实现对LoD显示层级的控制。如图3所示,具体步骤如下:

I、基于层次包围球的视景体裁剪:将视景体视角范围外的地形网格全部裁剪掉;

II、计算视点与地形网格中心点之间的距离:设坐标原点0,0,0,同时假设视点V的空间坐标为Vx,Vy,Vz,目标地形网格的中心点P的空间坐标为Px,Py,Pz,则视点与地形网格中心点的距离distance通过公式一计算得出:

III、在不影响地形真实感的前提下,为了使地形网格裂分的速率不至于太快,而加重渲染和调度的负担,在公式一中增加一个调节因子α将公式一变形为公式二:

IV、为每个地形网格设置阈值MaxLength;当distance≤MaxLength时,当前的地形细节层次为要显示的节点;当distance>MaxLength,则当前的地形细节层次节点应被置为合并状态,且要显示的是其父一级的地形细节层次节点;以此类推,或者地形网格裂分到最精细一级的细节层次节点,或者地形网格合并到最粗糙一级的细节层次节点。

如图3所示的视点相关的LoD控制规则,在三维地形场景渲染时,地形四叉树会进行动态更新,视点的变化会影响四叉树叶节点的合并与分裂。

图4是视点距离地形的左上部分比较近时,地形四叉树结构示意图;图5是视点从地形左上部分移动到左下部分时,地形四叉树结构示意图。从图4所示四叉树结构变成图5所示四叉树结构的这一过程中,图5中的节点LDChild1会裂分出四个子节点,同时图4中的LUChild2、RUChild2、RDChild2、LDChild2会被合并,其父节点LUChild1会被绘制。

经过图4所示的四叉树动态更新,四叉树节点会存在分裂和合并两种情况。但无论是裂分出新的孩子节点,还是因节点合并进而在地形场景中显示父亲节点,邻居信息的动态更新处理都是其中的关键步骤。根据叶节点自身特性,将邻居信息的动态更新处理分为裂分叶节点邻居信息处理算法和合并叶节点邻居信息处理算法两个模块:前者处于渲染帧的更新阶段,后者处于渲染帧的资源调出阶段。

由于地形裂缝仅出现在节点边界处,因此,裂缝消除的本质是保持节点的四条边、四个角与周围邻居节点的一致性。因此,首先需确定裂分叶节点、合并叶节点两个算法模块中节点的邻居信息。邻居信息的判断依赖于节点的空间位置关系,为便于计算,为节点的各个边、角方位邻居信息设置更新标识,Dirty具有休眠及激活两种状态。

如图4和图5所示:四叉树节点动态更新后,对邻居关系进行状态判断的步骤如下:

首先,裂分叶节点邻居信息及其状态确认。判断裂分叶节点位于父节点的方位,根据所在方位及空间位置关系,识别该节点的邻居信息。以左上角子节点(LUChild)为例进行说明:

I、边邻居及其状态确认。因裂分叶节点为左上角子节点,因此它的右边邻居和下边邻居和当前节点属于同一父节点,在同一层级LoD中分辨率相同,故将当前节点的右边、下边及其右边邻居的左边、下邻居的上边的裂缝消除Dirty标识设置为休眠状态;左边邻居和上边邻居与当前节点不属于同一父节点,则首先找到其父节点的左边邻居和上边邻居,进而计算当前节点的左边邻居和上边邻居,将关联节点相应边的裂缝消除Dirty标识设置为激活状态。

II、角邻居及其状态确认。与边邻居及其状态确认原理相似,因左上角子节点的右下角邻居和当前节点属于同一父节点,在同一层级LoD中分辨率相同,故将当前节点的右下角、右下角邻居的左上角裂缝消除Dirty标识设置为休眠状态;当前节点的左上角、右上角、左下角邻居因与当前节点不属于同一父节点,则首先找到父节点的左上角、右上角、左下角的邻居,进而计算当前节点的角邻居,将关联节点相应角点的裂缝消除Dirty标识设置为激活状态。

其次,合并叶节点邻居信息及其状态确认。因四个子节点要合并成一个父节点,则需依次更新四个孩子邻居节点的邻居信息。这里同样以左上角子节点(LUChild)为例进行说明:

I、边邻居及其状态确认。因右边和下边邻居和当前节点LUChild属于同一父节点,且三者被同时合并,所以这两个邻居节点的邻居信息不做处理;如果左边邻居(LN)、上边邻居(UN)存在且与当前节点的LoD层级相同,则四个子节点合并后,其LN、UN的邻居信息会发生变化,将LN的右边邻居、UN的下边邻居设置为LUChild的父节点,若LN、UN有子节点则需递归更新相关联的边邻居信息。同时,将相应边Dirty标识设为激活状态。

II、角点邻居及其状态确认。与边邻居及其状态确认原理相似,因右下角邻居与当前节点属于同一父节点,所以此邻居节点的邻居信息不做处理;根据空间位置关系,如果左上角邻居(LUN)存在且与当前节点的LoD层级相同,则应将LUN的右下角邻居设置为LUChild的父节点,若LUN有子节点则需递归更新相关联的角点邻居信息;如果右上角邻居(RUN)或左下角邻居(LDN)存在且与当前节点的LoD层级相同,因二者与LUChild的父节点在空间位置上并不是角点邻居关系,则二者需将相关联的角邻居设置为空,同样若RUN、LDN有子节点则需递归更新相关联的角点邻居信息。

步骤五、判断对格网节点所需完成的处理,并对不同处理情况下的格网节点之间的邻居关系进行状态判断;对格网节点之间的邻居关系进行状态判断的方式如下:

若需格网节点进行裂分生成新的子节点,则判断裂分叶节点位于父节点的方位,根据所在方位及空间位置关系,识别该节点的邻居信息,判断并记录各边邻居和角邻居的Dirty状态;

若需将格网节点合并生成父节点,则依次更新待合并为父节点的四个子节点的邻居节点邻居信息,判断并记录各边邻居和角邻居的Dirty状态。

步骤六、从根节点开始遍历地形四叉树上的每个节点节点,探索需要消除的节点范围。根据视点相关的LoD控制规则,遍历节点判断其是否为新增节点。对于属于叶节点的新增节点,确认其邻居节点及其Dirty状态,若Dirty为激活状态则表明该节点存在裂缝可能,建立补缝集合对这些节点进行存储。将需要显示的节点送入OpenGL渲染管线进行绘制之前,对补缝集合中的节点间进行裂缝消除运算。OpenGL用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。

步骤七、对补缝集合中的节点进行裂缝消除运算:以单个节点为处理单元,顺序对节点的四条边和四个角进行计算,通过线性插值方法使处在不同层级的邻近节点的节点高程值与处理单元节点的高程值保持一致,实现节点裂缝消除。

下面以某一节点的左边处理过程为例,对裂缝消除的具体步骤进行详细阐述,如图6~8所示:

实施例一:

首先,根据动态更新的节点邻居信息,探索当前节点的左边邻居节点(叶节点)。假设当前节点为N,节点N的左邻居信息数组为Lvec。为找出三维地形场景中节点N的左边邻居,遍历Lvec数组中的成员,判断每个成员是否有子节点,有则将该成员右上、右下两个子节点LChild1、LChild2赋给当前节点N,作为N的左邻居,同时继续按上述步骤进行递归处理LChild1、LChild2,直至到叶节点,将其记录至邻居数组LYvec。在设置了N的左邻居后,同时将该左邻居的右邻居设置为N。

其次,遍历左边邻居数组LYvec,进行消除运算。若LYvec中仅有1个节点,则表明左边邻居与当前节点N的LoD相等,二者在边界上的顶点关系是严格的一一对应的,如图6所示,则可直接遍历边界上的每一个顶点,判断二者的高程值是否相等,不相等则以节点N作为基准,将其顶点的高程值赋值给邻居对应的顶点;若LYvec中仅有2个节点,且节点N与邻居节点的LoD相差1,则二者在边界上的顶点关系如图7所示,邻居节点两个格网的长度与节点N的一个格网的长度相等,此时对节点N的顶点进行等距离线性插值运算,得到节点N边界上两节点的中点高程值,并将该高程值赋给邻居顶点;若LYvec有4个节点,且节点N与邻居节点的LoD相差n(n>1),则二者在边界上的顶点关系如图8所示,其中n=2,说明邻居节点两个格网的长度是节点N的一个格网的长度的1/n,此时计算出节点N中距离邻居节点最近的网格点,并将节点N的格网边上等距离分为2n个节点,利用线性插值算法得出每一个节点的高程,将该高程值赋给邻居顶点,至此完成裂缝的消除。

本发明不需任何额外的“补丁”,不仅节点层次跨度不受限制,而且运算量小,提高了裂缝消除效率,同时具有节点层次跨度大、渲染效率高的优点,能够在正确消除裂缝的前提下最大限度的再现三维地形地貌,适用于海量地形的可视化表达与分析。

上述实施方式并非是对本发明的限制,本发明也并不仅限于上述举例,本技术领域的技术人员在本发明的技术方案范围内所做出的变化、改型、添加或替换,也均属于本发明的保护范围。

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