三维地形漫游系统OPENGL实现.docx
《三维地形漫游系统OPENGL实现.docx》由会员分享,可在线阅读,更多相关《三维地形漫游系统OPENGL实现.docx(11页珍藏版)》请在冰豆网上搜索。
![三维地形漫游系统OPENGL实现.docx](https://file1.bdocx.com/fileroot1/2022-12/12/e674185c-f7de-4375-b900-6d3d7c9cab1b/e674185c-f7de-4375-b900-6d3d7c9cab1b1.gif)
三维地形漫游系统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或(准三维)为主的。
2D-GIS用点、线和面来表示地理实体,许多3D地理实体被简化为2D形式,取得的是二维地图、图像产品,其分析功能也是在二维基础上进行的。
或称准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的直接应用。
一维随机中点位移法的思想是:
针对一己知端点高程(或属性)的线段,其线段中点的高程(或属性)为其两头点高程(或属性)的平均值再加一随机位移量,位移后的两线段再进行上述中点细分并位移,递归明白知足所需要的分辨率为止。
将其推行到二维,依据表面构网方式的不同,其模拟可分为三角形格网模拟法、矩形(正方形)格网模拟法、钻石方块格网模拟法、参数方块格网模拟法等方式,其实现思想与一维类似。
下面以正方形格网为例,着重研究二维随机中点位移法的实现进程。
Diamond一Square算法:
二维随机重点位移法实现的方案很多,难点是需要排除曲面生成进程中可能产生的裂痕和皱折,“Diamond-Square”算法是三维分形地形生成的经典算法。
1>依照二维分形布朗运动思想,第一构造一个维数是2的空二维数组,能够把那个数组看成是一个正方形,然后将四个角的高程初始化为相同的值。
如(a)中的方形黑点。
2>Diamond进程
取正方形的四个极点,在其中点位置(两对角线交点)生成一个随机值,这一随机值是通过平均四个极点的值再加上一个随机量而生成的。
如此用直线连接每四个点就形成一个棱锥。
如图(b)所示,新的点显示为方形黑点,已经存在的值显示为圆形黑点。
3>Square进程
在正方形每条边的中点上,即每四个点形成的棱锥的中心位置生成一个随机值,它是通过平均棱锥的四个极点值再加上与Diamnod进程相同的随机值而生成。
如此在原先正方形的基础上又生成了一系列正方形。
如图C所示,新的点显示为方形黑点,己经存在的值显示为圆形黑点。
4>重复迭代二、3两个步骤,最终把先前成立的二维数组填充满,从而取得了生成三维分形地形所需要的高度值。
如图(d)和(e)所示。
如此,若是己经生成了一个种子正方形并通过单唯一次细分进程将取得四个正方形,第二次通过该进程取得16个方形,增加的专门快,方形数量等于2的(2+i)次方,其中i为递归通过细分进程的次数。
5>算法的伪代码:
当正方形(Suqare)边长大于K(K是常数,一样取2的幂,其大小决定了迭代次数的多少)时
{
遍历数组,对每一个正方形表达执行Diamond步;
遍历数组,对每一个棱形表达执行Square步;
减小随机数范围;
}
3基于OpenGL的地形渲染:
OpenGL即开放性图形库(OpenGraphicLibrary),是由SGI开发的一套高性能图形软件处置系统,是图形硬件的软件界面[21]。
OpenGL作为一个性能优越的图形应用程序设计界面(API),适用于普遍的运算机环境。
从个人运算机到工作站和超级运算机,OpenGL都能实现高性能的三维图形功能。
:
OpenGL的大体操作
OpenGL把所有的几何图形单元都用极点来描述,运算器针对每一个极点进行计算和操作,进行光栅化形成图形碎片;关于像素数据,将结果存储在纹理组装用的内存中,几何极点操作一样光栅化形成图形片元。
最后,图形片元都要进行一系列的逐个片元操作,最后的像素值被送入帧缓冲器实现图形的显示。
OpenGL的工作原理要紧有以下几个步骤:
1.构造几何要素(点、线、面、位图),创建对象的数学描述。
2.计算模型的颜色,确信光照、纹理等。
3.光栅化操作,将对象的数学描述和颜色信息转化到屏幕的像素。
OpenGL整个流程如下图:
在真实世界里,所有物体都是三维的。
可是,这些三维物体在运算机中却
必需以二维平面物体的形式表现出来。
这些物体从三维变换到二维是采纳相机
(Camera)模拟的方式,如下图。
从三维空间到二维平面,就犹如用相机拍照一样,通常都要经历以下几个步骤(括号内表示的是相应的图形学概念)
第一步,将相机置于三角架上,让它对准三维景物(视点变换,ViewingTransformation)。
第二步,将三维物体放在适当的位置(模型变换,ModelingTransformation)a
第三步,选择相机镜头并调焦,使三维物体投影在二维胶片上(投影变换,ProjectionTransformation)。
第四步,决定二维相片的大小(视口变换ViewportTransformation)。
如此,一个三维空间里的物体就能够够用相应的二维平面物体表示了,也就能够在二维的电脑屏幕上正确显示了。
有时为了突出图形的一部份,只把图形的某一部份显示出来,这时能够概念一个三维视景体(ViewingVolume)。
只有视景体内的物体能被投影在显示平面上,其他部份那么不能。
在屏幕窗口内能够概念一个矩形,称为视口(Viewport)视景体投影后的图形就在视口内显示为了使显示的物体能以适合的位置、大小和方向显示出来,必需要通过投影。
投影变换概念视图体,以确信物体如何投影到屏幕上来,在试图外面的物体或物体的一部份将被裁剪掉。
投影的方式有两种,即正射投影和透视投影,透视投影如下图。
本文正是采纳透视投影的方式来确信视景体的大小的。
为了适应物理设备坐标和视口所在座标的不同,还要作一些适应物理坐标的变换。
通过坐标变换以后显示出三维图形,三维图形的显示流程应如图所示:
4三维地形的简化技术:
四叉树的LOD简化算法
在大规模的虚拟地形中,直接用原始数据进行可视化显然不现实。
通过对LOD算法的分析和研究,结合大规模复杂场景的简化要求,以为如何有效地治理大量的地形数据,高效地生成与视点相关的动态网格是实现大规模地形LOD算法的关键。
为此,笔者提出了一种基于四叉树的多分辨率模型存储方式和实时优化算法。
该方式第一对地形数据进行分块分层,把四叉树信息保留在一个数组中。
同时利用两个简化队列来生成四叉树,只需按广度优先的原那么遍历四叉树一次,从而大大提高了渲染速度。
2>算法原理
本论文采纳规那么格网(RgeularSquareGrid,RsG)来代表完整的地形模型,因此组成地形模型的极点所在的平面坐标是方格的水平线和垂直线交点,如图a是地形模型的大体网格(PrimtiiveMesh),由3x3维度的极点所组成。
图(b)和图(c)别离是群组2x2阵列与4X4阵列的大体网格所组成的地形模型。
利用群组2的幂次方xZ的幂次方阵列的方式,就能够够建构更大范围区域的地形模型。
但由于采纳规那么格网来建构地形型的缘故,极点的数量必需是(2n+1)(2n+1).
树结构是地学领域常常采纳的数据结构,二叉树和四叉树都曾被用作表示地形。
本文采纳四叉树来构造多分辨率地形模型,是因为四叉树在地形可视化方面有很多优势。
第一,四叉树结构与地理信息在座标系统方面有天然的统一。
第二,由于地形可视化要涉及大规模的纹理信息,为了减轻图形系统的负担,常常采纳纹理镶嵌技术降低纹理大小;四叉树结构超级便于把纹理镶嵌技术集成进地形可视化系统中来。
第三,采纳四叉树结构,能够降低选择地形表示的时刻,加速地形简化算法,超级利于实时交互。
用四叉树结构对地形表示时,先对DEM数据作不同精度的等间距格网采样,采样结果组成四叉树的一层节点,关于树中任意相邻层,上一层的采样精度都是下一层的一半,因此关于树中的任意一个非终结节点,都有4个子节点,而且子节点的采样区域恰好将父节点四等分。
基于地形四叉树的地形绘制确实是在知足给定误差闭值的基础上动态地选择地形节点,从而实现地形模型的持续多分辨率表示。
图表示了节点分割的进程。
在误差阂值的计算上,为了保证场景的真实感,采纳一个与视点和视向相关的公式作为气宇标准,来判定一个节点何时需要被继续分割,何时被直接抛弃(当
那个节点不能被观看者看到的时候,节点将被直接抛弃)。
若是一个节点没有被抛弃,也不需要继续分割,那么那个节点将被送入渲染API进行图元渲染。
自适应实时网格优化算法(ROAM)
Duchaineau提出了一种在所需的帧速度下,通过维持动态视相关的三角形网格和纹理映射来生成高质量图象的方式。
该方式采纳优化灵活的视相关误差来气宇生成的三角形网格,以产生确信的误差边界,由于该算法基于三角形数量来对场景进行简化,并考虑了帧间的相关性,因此能够取得专门大的帧速度显示。
与前面两种算法不同,ROAM算法采纳二叉树方式来表示场景,当增加和移去极点时,即可通过割裂和融合三角形二叉树结构的方式来生成持续的LOD场景。
另外,还可采纳双队列的方式来对算法进行优化,并驱动割裂和融合操作,以维持网格的持续性。
(由于本系统并无采纳这种算法,因此具体的实现略)
5三维地形的漫游系统:
5.1各个类之间的类视图,如下图:
各个类的具体实现:
.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;
};
Lod类,封装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);
};
系统实现
系统采纳的是Diamond一Square算法生成了最初的地形源高数据,然后采纳LOD的方式对图形进行数据治理实验结果: