基于改进四叉树分割和结点存储的 LOD 算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
—202
—
基于改进四叉树分割和结点存储的LOD 算法
罗景馨,唐 琎
(中南大学信息科学与工程学院,长沙 410075)
摘 要:多层次细节(LOD)算法作为目前使用最多的地形数据简化算法,对提升渲染速度加快场景可视化有着重要作用,而其中以基于四叉树的LOD 算法应用最为广泛。
通过对以往算法的研究,提出一种对四叉树的分割和结点存储结构同时进行改进的LOD 算法。
该算法通过减少误差判断次数加快了四叉树的生成速度,同时改变传统的结点存储方式,降低了数据的冗余存储。
关键词:数字高程模型;多层次细节;四叉树;多分辨率
LOD Algorithm Based on Improved Quadtree-split and Node Storage
LUO Jing-xin, TANG Jin
(School of Information Science and Engineering, Central South University, Changsha 410075)
【Abstract 】At present, as the most widely used in terrain data segmentation, Level Of Detail(LOD) plays an important role to increase the speed of terrain rendering and scene visualization. Applying the most comprehensive LOD algorithm is based on quadtree. By the study of existing algorithm, this paper introduces a LOD algorithm based on improved quadtree-split and node storage. In order to expedite the speed of quadtree generation, the times of error judgment is dwindled down. And at the same time, a new node storage structure means much less redundant data stored than traditional way.
【Key words 】Digital Elevation Model(DEM); Level Of Detail(LOD); quadtrees; multi-resolution
计 算 机 工 程 Computer Engineering 第35卷 第20期 Vol.35 No.20 2009年10月October 2009
·图形图像处理·
文章编号:1000—3428(2009)20—0202—03
文献标识码:A
中图分类号:TP391.41
1 概述
随着计算机图形学的快速发展,三维可视化作为一个重
要的分支,已越来越广泛地应用于虚拟场景显示及交互操作(如模拟驾驶训练、网络游戏、虚拟战场)和地理信息系统(GIS)等领域。
但由于区域地形的数字表示,即DEM 数字高程模型的数据集庞大,若直接使用原始数据进行可视化,则需要绘制的三角形达到上百万个。
因此,为了防止显示滞后,必须对复杂地形数据进行简化处理。
目前,在场景简化技术中,多层次细节(Level Of Detail, LOD)是研究最多也最行之有效的算法。
采用LOD 技术对场景进行简化的应用主要可分为2类:(1)基于不规则三角网的细节层次模型,是直接用满足误差条件的顶点生成网格,代表算法是Hoppe [1],另外文献[2]在此基础上提出了基于三角形折叠操作的视相关LOD 模型简化算法。
(2)基于规则格网的细节层次模型,则是从DEM 栅格数据出发按四叉分割或者二叉分割的方式生成规整的三角形网格,文献[3]是最经典的算法,国内外其他基于规则格网的LOD 算法都是从这2个算法发展改进而来的,如文献[4]则是基于四叉树的数据结构,自顶向下进行处理。
在实际应用中,由于基于不规则三角网的多层次细节地表格网模型生成算法,处理时需要占用较大内存、计算量较大、效率较低,而且不具有运行时的自适应能力,难以用来直接生成多层次细节信息的地表模型。
在基于规则格网模型中,ROAM 算法虽然效率高但算法复杂。
针对以上情况,本文以规则格网为研究对象,提出了一种基于改进四叉树分割和结点存储结构的多分辨率细节层次模型算法。
2 改进四叉树分割和存储结构LOD 算法
2.1 多分辨率LOD 的基本原理
首先将DEM 数据划分成大小相等的块,每块的大小需为(2n
+1)×(2n +1)个数据点,并对每块建立一棵相应的四叉树,在建树同时计算和保存结点对应地形的粗糙度值,并根据粗糙度值和可能的最小视距来判断结点是否需要继续分割。
这种方式不同于传统算法中构建一个完全四叉树,而是建立一个可能需要的具有最高分辨率的不完全四叉树。
为了避免每次调入同一地形时都要进行一次四叉树划分,在开始构建四叉树时把地形一次性划分,并预先将计算好的四叉树信息封装存储,作为对地形的预处理。
之后每次渲染时就可以方便地读取四叉树信息,避免了递归的多次使用。
渲染时则根据结点评价函数(由结点的误差加上当前的视距等因素生成),读取需要的四叉树结点,生成连续的多分辨率简化网格。
2.2 算法具体描述
以往,对于DEM 数据,用自顶向下的方式,构建多分辨率空间数据的四叉树结构模型的基本思想是:根据四叉树结构
的要求,DEM 数据行列的取样数目需(2n
+1)×(2n +1)(这样保证最多可分割成2n ×2n 个网格),由此对原始模型进行分割。
首先,把整个地形作为根结点,然后从根结点出发判断其是
基金项目:国家自然科学基金资助项目“NSFC 重大专项——高速公路车辆智能驾驶中的关键科学问题研究”(90820302)
作者简介:罗景馨(1982-),女,硕士研究生,主研方向:计算机视觉,机器人;唐 琎,教授
收稿日期:2009-03-12 E-mail :binglin0716@
—203—
否满足某种分割条件,若不满足则不分割并作为叶子结点保存;否则把根结点递归地不断分割成相等的4个子结点区域,直到不能再分割为止,最后将所有叶子结点绘制渲染形成简化结果。
分割的深度越大,得到的分辨率就越高,分割时使用结点评价函数对每个行结点进行评价,如果该点精度已经符合结点评价函数的要求,则不再进行分割,否则继续分割直到该结点符合结点评价函数的要求为止,如图1所示。
此处结点表示1个矩形的地形块,并记录了9个地形数据,分别为中心点、4个角点和4个边线中点。
图1 传统的四叉树分层结构
改进的算法分析:传统四叉树中一个结点表示当前层 一个最小地形块,加上其3个兄弟结点,各结点的数据都分别存储。
明显的,由于这些兄弟结点的物理位置关系,结点之间有部分相同的数据被重复存储。
因为每个结点需保存本结点对应地形区域的中心点、边界中点、角点等9个点的信息,对有相同父结点的4个结点则有8个点被重复存储1次,1个点被重复存储3次,如图2所示。
为了减少数据存储冗余,本文将这样的4个兄弟结点整合成一个结点进行存储,包括根结点也是如此,即四叉树开始构建时的根结点就是一个隐含4个区域的结点,在叶子结点绘制渲染时则需均匀分解为4个不同部分,按从西向东、从北向南的方向进行绘制渲染。
图2 结点中被重复存储的点
根据这种存储结构,在开始判断是否对根结点进行分割时,实际上需要对根结点隐含的4个区域(以下称隐含结点)分别做4次判断,判断顺序同样按从西向东、从北向南的方向进行。
本文为了对结点区域地形起伏程度偏大和偏小的情况做不同对待,在用结点评价函数f 对结点是否分割进行判断时,将函数中的细节调节参数λ取2个不同的值big λ和small λ,而视距取可能的最小距离min L 。
跟据下文中的评价函
数,结点粗糙度的值diff 符合min big /diff L λ<时表示该结点已不需要再往下分割;min small /diff L λ>则连续对该区域进行 2次分割,然后再对2次分割后的新结点区域进行判断分割,直到符合评价系统的要求为止;对于min big min small //L diff L λλ<<的情况,则按传统算法对结点进行分割一次,然后再往下判断子结点。
对于一个结点的4个区
域,很可能存在部分需要分割而另一部分不需要分割的情况,为了保证非叶结点有4个子结点,将不需要分割的区域用空结点代替,如图3所示。
图3 改进的四叉树分层结构
2.3 改进的四叉树建立过程
针对文中提出的分割方法和特殊的四叉树结点存储方式,结点数据结构和具体的四叉树建立过程如下:
typedef struct quadtreeNODE//结点数据结构 {
quadtreeNODE *Child[4];//子结点指针 quadtreeNODE *Parent;//四叉树父结点指针 unsigned short Vertex[25]; //结点内25个点的高程数据
float Error[4];//结点4个隐含结点粗糙度值 int ix,iy; //结点中心在结点中的位置 int width;//当前结点大小,即边长 …
}quadtreeNODE;
void CDEM::setup_quadtree(…)//构建四叉树 {
…//定义标志位
//看一个结点的分割是否需要通过判断 for(…) //分别处理4个隐含结点 {
if(…)//若判断标志为真 {
…//计算相应隐含结点粗糙度值
if(…)//若误差diff<L min <λbig //或已为最小地形块 {
…//此隐含结点块不需再分割 //返回判断其他隐含结点 }
else//结点需要分割的情况 {
if(…)// diff<L min <λsmall ,分割2次 {
…//判断标志取反 …//setup_quadtree(…); //递归分割此隐含结点块 }
else// L min /λbig < diff< L min <λsmall {
//注:标志位不取反
…//setup_quadtree(…);递归分割隐含结点
—204
— } } }
else//若判断标志为假,表示不判断的分割 {
…//判断标志取反 …//setup_quadtree(…);
//不判断直接分割结点,4次递归调用 } } }
3 结点评价函数
由第2节算法分析可知,结点评价函数是创建四叉树时
对结点进行分割的标准,从而决定地形浏览过程中分辨率的高低。
评价函数的选取和具体的应用环境有关,通常主要考虑2个方面因素:(1)地形起伏变化程度;(2)视点距离结点区域的位置。
实际上为2个误差判断,即与视点相关的误差判断和与地形本身粗糙程度相关的误差判断。
与视点相关,主要考虑视距,即离观察者近的地方细节尽量多,反之则尽量少。
地形的粗糙程度判断则是指地形起伏较大的地方需要较多的细节。
通过对近年来的各类结点评价函数进行研究,综合考虑其科学性及简单易理解等因素,本文对文献[5]提出的结点评价函数稍作修改,作为适合本文的评价标准。
该结点评价函数如下:
max 2tan(/2)k l L e e d λ
αε
×××=
⋅××× (1) 后简化为
max e d λ×> (2) 其中,k 为一可变系数,可以通过它对系统性能进行调整;L 为结点覆盖区域的边长;λ为物体空间中的单位长度在投影平面上的像素数;d 为视点到地形结点中心点的距离;α为视角;ε为用户容许像素误差;e max 为四叉树结点单元精度变化时产生的最大误差。
式(1)中由于e max 和d 随着视点的变化会随时改变,而在特定的屏幕投影误差下,其他参数则可以视为常量,因此本文同样采用简化式作为判断标准。
另外,考虑绘制结点时采用三角形扇的方式,即一个叶结点会被绘制成4个三角形,那么不管结点是否被再分割,结点中心点都会被绘制而不会产生高度误差值。
所以考虑一个结点分割与否引起的误差时,可以排除中心点。
为了精确起见,在式(1)取4个边点产生的对象空间误差进行比较的基础上,本文再加入4个子结点中心所产生的高度变化。
最后取这8个高度差中的最大值128max(,,,)diff h h h =∆∆∆",作为这个结点粗糙度的评价值。
由上所述,本文采用的结点评价函数如下:
diff f L
λ×= (3)
其中,L 为结点中心到视点的距离;λ为细节调节参数,当取合适的值时,f>1的情况下结点需被分割。
此处需要注意的是,由于本文算法中对四叉树结点的分割方式是根据细节调节参数λ的不同取值为标准来判断结点是分割1次还是 2次,据式(3)可知,控制分割2次的常数λ的取值肯定得比传统经验值小。
另外,在实际应用中,为了加快计算结点中心()111,,x y z 到视点()222,,x y z 的距离,避免开方运算,笔者采
用了一个大约的距离计算121212L x x y y z z =−+−+−作为 两点的欧氏距离。
4 算法性能分析
对于庞大的DEM 地形数据,特别是大规模地形的数据而言,按结点评价函数中结点粗糙度的计算方法,计算这么多结点的粗糙度值无疑是个庞大的工作量。
本文中初始建立四叉树时采用根据不同的调节参数值确定结点分割次数的方法,对于地形起伏较大导致相应四叉树构建时结点粗糙度较大的地形来说,出现“一次判断两次分割”的情况会较多,这无疑可以在建树时减少结点粗糙度计算和判断的工作量,同时也加快了四叉树的分割速度。
为比较的方便,文中以一平坦地形为研究对象,即根据高程数据将生成一棵完全四叉树。
在同一块大小为(2n +1)× (2n +1)的DEM 地形中,n 为常数即数据点一定的情况下,按传统方式存储结点和按本文的方式存储结点分别建立一棵可达到同一采样精度的完全四叉树,发现2棵完全四叉树层次刚好相差一层。
在程序中用sizeof 分别计算出2种存储方式中结点结构体所占字节数,并根据DEM 数据点的增加计算了各自所占字节数,如表1所示。
由表可知其节省的存储空间比例,随地形DEM 数据点的增多逐渐趋近于常数,约 为46%。
表1 所占空间对比
四叉树层次 传统字节数 改进字节数 节省空间/(%)
1 190 8
2 56.84
3 3 230 1 722 46.69 5 51 870 27 962 46.09 7 830 110 4
4 7802 46.0
5 9 13 281 950 7 165 242 46.05 11 212 511 390 114 644 282 46.05 13 3 400 182 430 1 834 308 922 46.05 … … … …
5 结束语
在实验过程中,为了更精确地评判四叉树的构建以及多
分辨率模型生成的速度,笔者对整个渲染过程进行了分步实验。
结果表明,相对改进前存储空间的占用和模型生成速度都有明显改善。
但同时发现地形的背面不可见部分也生成了网格,则对起伏度较大的地形在绘制时增加了许多不需要绘制的网格。
接下来的工作将考虑在本文算法基础上加背面剔除的思想,将不可见部分的网格去除掉,以减少需要绘制的网格,加快绘制速度。
参考文献
[1] Hoppe H. Smooth View-dependent Level-of-detail Control and Its
Application to Terrain Rendering[C]//Proc. of IEEE Visualization’ 98. [S. 1.]: IEEE Press, 1998: 35-42.
[2] 赵争鸣, 顾耀林. 基于三角形折叠的视相关多层次细节模型[J].
计算机工程, 2007, 33(4): 277-279.
[3] Lindstrom P, Koller D, Ribarsky, et al. Real-time, Continuous Level
of Detail Rendering of Height Fields[C]//Proc. of ACM SIGGRAPH’96. [S. 1.]: ACM Press, 1996: 109-118.
[4] Rottger S, Heidrich W, Slusalleck P, et al. Real-time Generation of
Continuous Levels of Detail for Height Fields[C]//Proc. of WSCG’98. [S. 1.]: ACM Press, 1998: 315-322.
[5] 芮小平. 一种基于不完全四叉树的LOD 生成算法[J]. 中国图象
图形学报, 2005, 10(9): 1152-1160.
编辑 顾逸斐。