三维地形漫游系统地OPENGL实现.docx
《三维地形漫游系统地OPENGL实现.docx》由会员分享,可在线阅读,更多相关《三维地形漫游系统地OPENGL实现.docx(14页珍藏版)》请在冰豆网上搜索。
三维地形漫游系统地OPENGL实现
三维地形漫游系统的OPENGL实现
引言
本系统是基于OpenGL的三维地形漫游,系统主要包括三个方面:
地形数据的采集与计算,由于本系统是采用随机中点位移法得到地形高度图数据。
采用Diamond一Square算法得到原始数据。
地形渲染,采用基于OpenGL的环境,在地形中加入光照,雾,天空,以及纹理等效果对地形进行模拟,使其更接近真实。
采用LOD技术对地形进行简化和管理。
1地形可视化的概念:
地理信息系统技术从60年代以来,经过40多年的发展,现逐步向三维化、可视化和网络化等方面发展,GIS软件平台不断推陈出新。
传统的2D-GIS软件通过矢量或栅格的方法完成二维地表的成图和分析,多年来,一直用二维地图产品表示三维地物,包括地质图、横断面图、示意图以及专门的几何结构图如立体网等。
但在某些领域,人们需要分析具有三维坐标的地表面以下的状况,这种空间关系时常为判断和评价矿产资源、石油资源和污染状况提供重要的信息。
因此人们在2D-GIS软件的基础上研究和开发了一些适合实际需要的3D-GIS产品。
“数字地球”强调对地球的真三维的描述,中国政府将“数字地球”列为21世纪的战略目标之一,使得3D-GIS的理论研究和软件开发又掀起了一次高峰。
所有的GIS系统都带有包括空间数据、拓扑关系及属性数据在内的地理数据库,或者能与外部数据库管理系统直接进行连接。
GIS所处理的空间数据按其处理方式不同,可分为:
栅格数据、2D拓扑矢量数据、数字高程模型(DEM)、三角形不规则网格(TIN)、三维模型、时间模型等,而所有这些都是以2D或2.5D(准三维)为主的。
2D-GIS用点、线和面来表示地理实体,许多3D地理实体被简化为2D形式,得到的是二维地图、图像产品,其分析功能也是在二维基础上进行的。
2.5D或称准3D意思是它不具备真正的Z坐标,而是将Z值作为某一位置上的属性变量,它并不是空间坐标值。
在真3D-GIS中,可用表达式a=f(x,y,z)来表示,a为点(x,y,z)对应的属性值,z是独立于x,y的自变量,即三维空间中的z坐标值。
3D-GIS具有连续的数据结构和与之相应的分析功能,由此带来的好处是可以从空间的角度分析和显示物体。
地形的可视化是一门以研究数字地面模型(DigitalTerrainModel,DTM)或数字高程域(DigitalHeightField)的显示、简化、仿真为内容的学科,它属于计算机图形学的一个分支。
除了计算机图形学之外,计算几何也是它的重要基础知识。
它的应用涉及地理信息系统(GIS)、虚拟现实(VR)技术、战场环境仿真、娱乐与游戏、飞行穿越(Flythrough)、土地管理与利用、气象数据的可视化等各个领域。
常用的地形可视化方法大致有写景法、等高线法、分层设色法、晕渲法、拍摄实地景观照片、建立三维几何相似的实物模型、产生三维线框透视投影图和逼真地形显示等多种方法。
随着光栅图形显示硬件的发展,以真实感图形为代表的光栅图形技术日益成为计算机图形发展的主流,基于计算机图形学理论的三维地形逼真显示逐渐成为地形可视化发展的主流。
产生逼真地形显示的方法主要有两种:
一是将航空像片或卫星影像数据映射到数字地面模型上,另一种是基于分形模型的地面模拟。
随着计算机视觉、科学计算可视化、遥感技术、计算机图形学等相关学科的发展,由航空航天摄影测量获取的地形数据来生成具有高度细节层次的三维地形模型已经十分普遍。
这些由上百万或者更多的三角形面片表示的各种地形模型,满足了人们对地形真实性所提出的越来越高的要求,但由于这些数据很少从绘制效率方面考虑进行优化,因此对计算机性能又提出了新的挑战。
2三维地形的生成技术:
2.1基于真实数据的地形生成
根据真实地形数据进行地形生成是实际工作中使用最多的一类,目前大多采用数字地面模型(DigitalTerrainModel,DTM)来生成,DTM数据由在规则网格地形图上采样所得的高程值构成,与飞机或卫星上所拍摄的遥感纹理图像数据相对应,这些纹理图像在重构地形表面时被映射到相应的部位。
简单的地形渲染算法,是将相邻的4个网格点定义的DTM单元变换成2个三维空间的三角形,然后将视锥体内部区域的所有这样的三角形送入图形流水线进行绘制。
这种算法还可将图像纹理数据以它的最高分辨率映射到对应的多边形上,但这是一个效率很低的方法,因为在一般情况下,三角形和遥感图像纹理像素的数量非常大,而每一个独立的三角形投影到图像空间后则很小,并且很多纹理像素可能被压缩到一个图像像素中,以至于对图像的影响可以忽略不计。
因此,如果用DTM直接生成地形,即使在高性能的图形硬件平台上,要进行实时渲染,也几乎是不可能的,通常要对DTM数据进行一定的简化。
地形简化方法将在下一章进行详细介绍。
2.2基于分形技术的地形生成
二十世纪七十年代美籍法国数学家Mnedelbot为研究自然界中复杂极不规则的几何现象创立了分形几何学[34〕,此后,分形理论得到了广泛关注和蓬勃发展。
分形(rfactal)的两个重要特征是自相似性和分数维。
现在,随着计算机图形图像处理技术的发展应用,用分形几何来表达千差万别的自然现象产生了许多传统方法无法达到的美妙结果。
而基于分形原理来研究地形场景(包括地形表面、地形纹理、蓝天白云、地貌植被等)的生成和多分辨率表达是分形几何极为重要的应用领域,也是三维地形可视化的一个重要l”[l’811’9]。
国内外一些学者从不同的角度、不同的侧面进行了持续而深入方面究,但普遍而言缺乏系统性、比较性、实践性。
英国植物学家Brwon在1827年注意到浮在液面上的微粒极不规则的运动,空气中的烟尘粒子也具有相似的现象,后来解释为由液体的分子撞击所引起,称这一现象为布朗运动。
假设一个随机过程X(t)是实变量t的函数,对每一个给定的时刻t,X(t)是一个随机变量,则两个时刻的函数差:
x(I2)一X(t!
)(6一l)
也是一个随机变量,称为“函数增量”。
因此,对这个增量的描述通常要随机变量的统计特征来表示。
在自然界中呈现出来的许多现象大多数服从高斯分布,他们的均方增量正比于时间差,这一正比关系说明了时间间隔越大,x(t2)和x〔,)相差越大,相关性越小。
记t1=t0,t2=t0+△t,当△t扩大r倍时可表示为以下关系:
这意味着当△t扩大r倍时,函数增量减少1/√r倍后,与(X(t0+r△t)-x(t0))具有统计自相似性。
为了讨论方便,当t0=0时,令x(t0)=0,时间间隔变量τ表示,则:
X(τ)∝1/√rX(rτ);
关系式中的τ和函数值在不同尺度比例下保持不变,这种比例关系称“非一致比例变换”,这种性质称为“自放射形”。
分布性布朗运动从随即分形生成逼真景物的数学模型,他能有效的表达自然界中许多非线形现象,也是迄今为止能够描述真实地形的最好随即过程。
他是布朗运动的一个推广。
其生成算法是:
基于随机分形的地形生成技术将分形几何与FMB相结合,常采用的方法有泊淞阶跃法(poissonfaulting)、傅立叶滤波法(fourierfiltersng)、中点位移法(midpointdisplaeement)、逐次随机增加法(Suc。
essiverandomadditions)和带限噪声积累法(summingbandlimit。
dnoises)等五类。
其中,随机中点位移法是最简单和经典的方法,是对FBM的直接应用。
一维随机中点位移法的思想是:
针对一己知端点高程(或属性)的线段,其线段中点的高程(或属性)为其两端点高程(或属性)的平均值再加一随机位移量,位移后的两线段再进行上述中点细分并位移,递归知道满足所需要的分辨率为止。
将其推广到二维,依据表面构网方式的不同,其模拟可分为三角形格网模拟法、矩形(正方形)格网模拟法、钻石方块格网模拟法、参数方块格网模拟法等方法,其实现思想与一维类似。
下面以正方形格网为例,着重研究二维随机中点位移法的实现过程。
2.3Diamond一Square算法:
二维随机重点位移法实现的方案很多,难点是需要消除曲面生成过程中可能产生的裂缝和皱折,“Diamond-Square”算法是三维分形地形生成的经典算法。
1>根据二维分形布朗运动思想,首先构造一个维数是2的空二维数组,可以把这个数组看成是一个正方形,然后将四个角的高程初始化为相同的值。
如(a)中的方形黑点。
2>Diamond过程
取正方形的四个顶点,在其中点位置(两对角线交点)生成一个随机值,这一随机值是通过平均四个顶点的值再加上一个随机量而生成的。
这样用直线连接每四个点就形成一个棱锥。
如图6.1(b)所示,新的点显示为方形黑点,已经存在的值显示为圆形黑点。
3>Square过程
在正方形每条边的中点上,即每四个点形成的棱锥的中心位置生成一个随机值,它是通过平均棱锥的四个顶点值再加上与Diamnod过程相同的随机值而生成。
这样在原来正方形的基础上又生成了一系列正方形。
如图C所示,新的点显示为方形黑点,己经存在的值显示为圆形黑点。
4>重复迭代2、3两个步骤,最终把先前建立的二维数组填充满,从而获得了生成三维分形地形所需要的高度值。
如图(d)和(e)所示。
这样,如果己经生成了一个种子正方形并经过单独一次细分过程将得到四个正方形,第二次经过该过程得到16个方形,增长的很快,方形数目等于2的(2+i)次方,其中i为递归经过细分过程的次数。
5>算法的伪代码:
当正方形(Suqare)边长大于K(K是常数,一般取2的幂,其大小决定了迭代次数的多少)时
{
遍历数组,对每个正方形表达执行Diamond步;
遍历数组,对每个棱形表达执行Square步;
减小随机数范围;
}
3基于OpenGL的地形渲染:
OpenGL即开放性图形库(OpenGraphicLibrary),是由SGI开发的一套高性能图形软件处理系统,是图形硬件的软件界面[21]。
OpenGL作为一个性能优越的图形应用程序设计界面(API),适用于广泛的计算机环境。
从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。
3.1:
OpenGL的基本操作
OpenGL把所有的几何图形单元都用顶点来描述,运算器针对每个顶点进行计算和操作,进行光栅化形成图形碎片;对于像素数据,将结果存储在纹理组装用的内存中,几何顶点操作一样光栅化形成图形片元。
最后,图形片元都要进行一系列的逐个片元操作,最后的像素值被送入帧缓冲器实现图形的显示。
OpenGL的工作原理主要有以下几个步骤:
1.构造几何要素(点、线、面、位图),创建对象的数学描述。
2.计算模型的颜色,确定光照、纹理等。
3.光栅化操作,将对象的数学描述和颜色信息转化到屏幕的像素。
OpenGL整个流程如图2.2所示:
在真实世界里,所有物体都是三维的。
但是,这些三维物体在计算机中却
必须以二维平面物体的形式表现出来。
这些物体从三维变换到二维是采用相机
(Camera)模拟的方式,如图2.2所示。
从三维空间到二维平面,就如同用相机拍照一样,通常都要经历以下几个步骤(括号内表示的是相应的图形学概念)
第一步,将相机置于三角架上,让它对准三维景物(视点变换,ViewingTransformation)。
第二步,将三维物体放在适当的位置(模型变换,ModelingTransformation)a
第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,ProjectionTransformation)。
第四步,决定二维相片的大小(视口变换ViewportTransformation)。
这样,一个三维空间里的物体就可以用相应的二维平面物体表示了,也就能在二维的电脑屏幕上正确显示了。
有时为了突出图形的一部分,只把图形的某一部分显示出来,这时可以定义一个三维视景体(ViewingVolume)。
只有视景体内的物体能被投影在显示平面上,其他部分则不能。
在屏幕窗口内可以定义一个矩形,称为视口(Viewport)视景体投影后的图形就在视口内显示为了使显示的物体能以合适的位置、大小和方向显示出来,必须要通过投影。
投影变换定义视图体,以确定物体如何投影到屏幕上来,在试图外面的物体或物体的一部分将被裁剪掉。
投影的方法有两种,即正射投影和透视投影,透视投影如图3.3所示。
本文正是采用透视投影的方法来确定视景体的大小的。
为了适应物理设备坐标和视口所在坐标的差别,还要作一些适应物理坐标的变换。
经过坐标变换以后显示出三维图形,三维图形的显示流程应如图2.3所示:
4三维地形的简化技术:
4.1四叉树的LOD简化算法
在大规模的虚拟地形中,直接用原始数据进行可视化显然不现实。
通过对LOD算法的分析和研究,结合大规模复杂场景的简化要求,认为如何有效地管理大量的地形数据,高效地生成与视点相关的动态网格是实现大规模地形LOD算法的关键。
为此,笔者提出了一种基于四叉树的多分辨率模型存储方式和实时优化算法。
该方法首先对地形数据进行分块分层,把四叉树信息保存在一个数组中。
同时使用两个简化队列来生成四叉树,只需按广度优先的原则遍历四叉树一次,从而大大提高了渲染速度。
2>算法原理
本论文采用规则格网(RgeularSquareGrid,RsG)来代表完整的地形模型,所以构成地形模型的顶点所在的平面坐标是方格的水平线和垂直线交点,如图a是地形模型的基本网格(PrimtiiveMesh),由3x3维度的顶点所组成。
图(b)和图(c)分别是群组2x2阵列与4X4阵列的基本网格所构成的地形模型。
利用群组2的幂次方xZ的幂次方阵列的方法,就可以建构更大范围区域的地形模型。
但由于采用规则格网来建构地形型的缘故,顶点的数量必须是(2n+1)(2n+1).
树结构是地学领域经常采用的数据结构,二叉树和四叉树都曾被用作表示地形。
本文采用四叉树来构造多分辨率地形模型,是因为四叉树在地形可视化方面有不少优势。
首先,四叉树结构与地理信息在坐标系统方面有天然的统一。
第二,由于地形可视化要涉及大规模的纹理信息,为了减轻图形系统的负担,常常采用纹理镶嵌技术降低纹理大小;四叉树结构非常便于把纹理镶嵌技术集成进地形可视化系统中来。
第三,采用四叉树结构,能够降低选择地形表示的时间,加速地形简化算法,非常利于实时交互。
用四叉树结构对地形表示时,先对DEM数据作不同精度的等间距格网采样,采样结果构成四叉树的一层节点,对于树中任意相邻层,上一层的采样精度都是下一层的一半,因而对于树中的任意一个非终结节点,都有4个子节点,而且子节点的采样区域恰好将父节点四等分。
基于地形四叉树的地形绘制就是在满足给定误差闭值的基础上动态地选择地形节点,从而实现地形模型的连续多分辨率表示。
图3.2表示了节点分割的过程。
在误差阂值的计算上,为了保证场景的真实感,采用一个与视点和视向相关的公式作为度量标准,来判定一个节点何时需要被继续分割,何时被直接丢弃(当
这个节点不能被观察者看到的时候,节点将被直接丢弃)。
如果一个节点没有被丢弃,也不需要继续分割,那么这个节点将被送入渲染API进行图元渲染。
4.2自适应实时网格优化算法(ROAM)
Duchaineau提出了一种在所需的帧速率下,通过保持动态视相关的三角形网格和纹理映射来生成高质量图象的方法。
该方法采用优化灵活的视相关误差来度量生成的三角形网格,以产生确定的误差边界,由于该算法基于三角形数目来对场景进行简化,并考虑了帧间的相关性,因而可以获得很大的帧速率显示。
与前面两种算法不同,ROAM算法采用二叉树方法来表示场景,当增加和移去顶点时,即可通过分裂和融合三角形二叉树结构的方法来生成连续的LOD场景。
此外,还可采用双队列的方法来对算法进行优化,并驱动分裂和融合操作,以保持网格的连续性。
(由于本系统并没有采用这种算法,所以具体的实现略)
5三维地形的漫游系统:
5.1各个类之间的类视图,如图所示:
5.2各个类的具体实现:
5.2.1数据采集和处理
classCSdmap{
public:
CSdmap();
voidCreatMap(intx1,inty1,
intx2,inty2,
intx3,inty3,
intx4,inty4,
intdistanse,
floatscale);
floatGetData(inti,intj){returnmapData[i][j];}
floatGetNewData(inti,intj){returnmapNewData[i][j];}
intGetSize(){returnMSIZE;}
intGetNewDataSize(){returnMSIZE*2;}
floatRandumf(floatmax,floatmin);
voidinitial();
floatgetMaxHeight();
floatgetMinHeight();
voidcaculateMapData();
private:
floatmapData[MSIZE][MSIZE];
floatmapNewData[MSIZE*2][MSIZE*2];
floatdepth;
floatscale;
floatratio;
floath;
};
5.2.2Lod类,封装LOD技术
classCLod{
//Widget*widget;
intlocation[3];
public:
CLod();
BOOLm_bFlag;
voidreset_quad_tree(void);
voiddraw(intx,intz,intwidth,intdirection);
voidsetup_quadtree(intx,inty,intwidth);
voiddraw_point(intx,intz,intwidth,intdirection);
voidtriangle1(intx1,intz1,intx2,intz2,intx3,intz3);
voidtriangle2(intx1,intz1,intx2,intz2,intx3,intz3);
voidsetColor(intx,intz);
voidsetVertex(intx,intz);
voidtriangle2(intx1,intz1,intx2,intz2,intx3,intz3);
voidsetLocation(floatx,floaty,floatz);
};
5.3系统实现
系统采用的是Diamond一Square算法生成了最初的地形源高数据,然后采用LOD的方法对图形进行数据管理实验结果: