近几年来,随着计算机技术,特别是计算机图形学、网络、多媒体、三维仿真技术、虚拟现实技术的快速发展,给二维电子地图注入了新的活力,基于三维虚拟场景的三维电子地图正成为电子地图发展的一个重要方向。但是三维电子地图的基本模型必须从三维地形模型制作出发,三维地形模型就是把数字形式的地形数据转换成三维仿真的地形模型,它的制作也是电子游戏、电子沙盘和虚拟现实以及三维地理信息系统应用的基础,其制作的精度直接影响着整个应用的视觉效果。本文介绍在VC开发平台上基于OpenGL的三维地形动态模型的建立及其应用。 OpenGL的工作原理整个OpenGL的基本工作原理流程图如图1所示。 图1OpenGL基本工作原理流程 由于三维地形模型是三维地理信息系统(3D2GIS)最基本的地形模型,因此它的建立和应用是国内外地理信息系统界研究的一个热门课题,也是多年来一直在不断完善和更新的一个难点问题。三维地形模型是关于三维空间数据组织的概念和方法,它反映了现实世界中仿真的地形曲面。对三维空间数据模型的认识和研究在很大程度上决定着三维GIS的发展和应用的成败。很多学者为此进行了大量的探索和研究工作,然而,由于三维空间数据的庞大和复杂多样性,至今人们对三维数据地形模型问题还远远没有达到共识。 1、用OpenGL建立三维地形模型 在VC开发平台下利用OpenGL图形开发库函数,可以利用原始的地形数据构造三维地形模型,其原始的地形数据包括地理坐标(X,Y)和高程值(H)。OpenGL共包括100多个功能强大的图形函数,开发人员可以利用这些函数来建立三维模型和进行三维实时交互。这些函数分属于三个基本图形库,即基础库、实用库和辅助库。OpenGL的基本功能包括:模型绘制、模型观察、颜色模式的指定、光照应用、图像效果增强、位图及图像处理、纹理映射、多缓存应用、实时动画、交互技术等。 1)采集数据 首先利用二维的平面电子地图采集生成三维地形模型所需的数据,主要包括三维地形模型所在区域离散点的平面地理坐标(X,Y)和高程值(H),根据坡度和地形起伏变化控制离散点的稀密状况,如果地形起伏比较大则数据点的采集也要相应的密度大一点,否则可以减小离散点的采集密度以减小数据量。 2)构造三角网 计算机图形学中的所有光滑曲面最终都是由多边形(主要是三角形)无限逼近得到的,因此建立曲面模型的实质是构造用来逼近该曲面的空间三角网。利用采集到的离散点根据Delaunay三角网的够网规则生成三角网。为了动态更新地形模型数据,我们将数据存放为文本文件(其后缀为。txt),以便随时调用和更新。文件中的第一个整数是三角网的采样点个数,接下来的浮点数是采样点的地形特征数据,其排列方式为从左到右(Xi,Yi,Hi),其间用逗号隔开,每一行的数据个数为一个。 3)利用地形数据建立地形模型 以VisualC6。0为开发平台时调用OpenGL库函数一般要进行如下设置,选择Project菜单下的Setting选项,在弹出的对话框Link栏的Lib输入框中添加openg132。lib,glu32。lib及glaux。lib。在程序中包含以下头文件: includeglgl。h includeglglu。h includeglglaux。h 并且调用以下函数进行窗口的初始化: auxInitDisplayMode(AUXSINGLEAUXRGBAAUXDEPTH); 窗口显示单缓存和RGB(彩色)模式 auxInitPosition(0,0,500,500); 大小x500,y500(0,0)是屏幕左上点 auxInitWindow(三维地形模型); 窗口初始化,参数是标题glClearColor(0。0,0。0,0。0,0。0); 将窗口清为黑色glClear(GLCOLORBUFFERBIT); 将颜色缓存清为glClearColor命令所设置的颜色 即背景色调用以下函数绘制具有颜色设置的三角形并且建成三维的地形模型表面: glBegin(GLTRIANGLE);glColor3f(R,G,B); 颜色设置glVertex3f(x1,y1,h1); glVertex3f((x2,y2,h2); glVertex3f((x3,y3,h3); glVertex3f(xi,yi,hi); glEnd(); 然后可以调用下列函数对地形模型进行光照和材质的处理: voidglLight{if}〔v〕(GLenumlight,GLenumpname,TYPEparam); voidglMaterial{if}〔v〕(GLenumface,GLenumpname,TYPEparam); 2、基于OpenGL的三维真实感地形的生成 用OpenGL生成三维真实感地形的基本过程如图2所示: 图2用OpenGL构造三维地形景观流程图 1)数据准备 用于构造三维真实感地形的数据包括DEM数据和纹理数据。相关区域的DEM的获取有实地采集法、摄影测量法、现有图数字化法。DEM一般采用格网点格式。DEM数据的处理包括不同格式DEM间的转化、DEM数据简化、格网DEM与TIN间的相互转化等;纹理数据的处理包括图像格式转化、图像裁切等。由于OpenGL所处理的影像纹理大小必须为2m2n(m,n为整数),则必须对正射影像进行分块或重采样处理,以满足OpenGL纹理映射的需要。 2)设置各项基本参数 在用OpenGL绘制三维真实感地形模型和进行纹理映射前,需要设置相关的景观参数值。首先应对图形操作描述表(RendingContext)以及像素格式(PixelFormat)进行创建和设置;其次对光源性质(镜面反射光、漫射光、环境光)、光源方位(距离和方向)、颜色模式(索引模式或RGBA模式)、明暗处理方式(平滑处理或平面处理)、消隐模式、纹理映射方式等;也可根据相关函数设置三维真实感地形模型的颜色值和对光照的反射特性。除此之外还需设定视点位置和视线方向。这些参数设置都可以通过对OpenGL的相关函数的参数选择来实现。 3)构造三维真实感地形模型 OpenGL的基本几何对象都是围绕顶点来建立的,而对顶点来说最重要的信息是由glVertex3()命令提供的坐标。值得注意的是,在OpenGL中几何对象顶点的坐标值、法线、纹理坐标和颜色等都必须包含在glBegin()和glEnd()函数对之间,否则就不会有任何绘制出现。三维真实感地形模型的基本构造通常是以三角面为单元的。三角面的明亮程度除取决于光源和明暗处理方式外,还受到点与面的法向量的影响。一般点的法向量取值为其周围面法向量的均值。这样三维模型的构造可由下列程序给出: glBegin(GLTRIANGLESTRIP); glNormal3fv(N0);设置顶点法向量 glVertex3f(v0);设置顶点坐标 glNormal3fv(N1);设置顶点法向量 glVertex3f(v1);设置顶点坐标glEnd(); 构造模型的同时,还可以对模型进行平移、旋转将其移至三维空间的适当位置,通过适当的缩放使三维真实感地形与三维空间景物的比例相协调。 4)投影和视区变换 投影变换一般分为透视投影变换和正交投影变换两类。投影方式的选择取决于显示的内容和用途。由于透视投影类似于人眼对客观世界的观察方式,因而广泛应用于三维地形模拟、飞行仿真、步行穿越仿真等模拟人眼视觉效果的研究领域。正交投影的物体或场景的几何属性不变,视点位置不影响投影的结果,如果需要观察模型某一个侧面不带有形变的景观,则更多采用正交投影方式,如制作地形晕渲图则一般采用正射投影方式。本文选择透视投影,函数为gluPerspective(),OpenGL只绘制位于视景体内的对象,所以在设置gluPer2spective的参数时,应充分考虑地形范围的大小以便选择合适的视景体范围。视区是指计算机屏幕中用来绘图一个矩形区域,缺省的视区与窗口一样大,它用窗口坐标来度量,反映了屏幕上的像素位置。视区相对于窗口的左下角。视区变换就是将视图体最后三维空间坐标映射为计算机屏幕上的二维平面坐标。视区变换用函数glViewport(0,0,cx,cy)实现,视区的宽高比通常等于视景体的宽高比,否则视区内显示的图形将会发生形变。根据视区变换后视区内每一点的Z坐标值,OpenGL可以自动判断点的前后实现消隐功能,使得靠近视点的目标能够遮挡视区同一位置远离视点的目标。 5)纹理映射 自然界中的物体表面很少是光滑和单调的,往往具有各种纹理,在计算机图形学中是采用纹理映射的方法给计算机生成的物体图像加上纹理的。纹理映射是建立逼真三维地形景观的重要手段,不采用纹理映射所得到的地形模型仅仅是具有明暗效果的光照模型,光照模型可以按照高程值进行过渡着色或分层设色。它能够直观地反映地表起伏状况,但不能重现地表的真实面貌。一般纹理映射的思路是把纹理图像贴到由DEM数据所构成的三维模型上。其关键是实现影像与DEM之间的正确匹配,使每个DEM格网点与其所在的图像位置一一对应。为提高纹理映射的运算效率,通常采用预处理好的与DEM坐标相对应的图像作为纹理以免除纹理坐标的计算。用OpenGL函数进行纹理映射的基本步骤为:纹理定义:OpenGL要求纹理图像的尺寸必须是2的幂,且不能大于1024字节。用glTexIm2age2D()函数说明所映射的纹理内容。其中包括纹理数据的指针、纹理的大小、纹理的类别(灰度或彩色)等。如果没有原地形的正射影像,用户也可根据地形特点设计自己的纹理图像。纹理控制:说明纹理以何种方式映射到三维模型表面上。OpenGL提供了多种映射方式,其中包括纹理滤波、重复与伸缩,其函数为glTexPa2rameterf()。纹理映射方式说明:在纹理映射过程中,可以用纹理来调整三维模型的颜色或者将纹理与三维模型原来的颜色进行融合,其调用函数为glTex2Envf()。启动关闭纹理映射:在绘制某一个场景前必须调用glEnable(GLTEXTURE2D)来启动纹理映射,结束时调用glDisable(GLTEXTURE2D)。三维地形模型顶点的纹理坐标与几何坐标定义及场景绘制:几何坐标决定了顶点在屏幕上的绘制位置,其调用函数为glVertex3();纹理坐标决定纹理图像中哪一个纹理单元赋予该顶点,其调用函数为glTexCoord3(),几何坐标和纹理坐标必须匹配。 6)三维地形交互式动态显示 按照人们的视觉习惯,总是希望在原点(或其他方便位置)处构造所需画面,然后从一个较佳的位置观看该画面。OpenGL自带的实用库函数gluLookAt()正是为这个目的而设计的,故可以采用此库函数来实现虚拟场景的观察变换。glu2LookAt()库函数的原型如下: voidgluLookAt(GLdoubleeyex,GLdoubleeyey,GLdoubleeyez,GLdoublecenterx,Gldoublecentery,GLdou2blecenterz,GLdoubleupx,GLdoubleupy,GLdoubleupz)其中:前三个参数eyex、eyxy、eyez指定视点(眼睛)的位置;中间三个centerx,centery,centerz指定沿着所需视线上的任一点(参考点)的位置;upx,upy,upz指定向上的矢量方向(观察向量)。地形透视图形成后,可为应用程序加入鼠标和键盘的消息响应函数,并将视点、视角、模型旋转角度等设为变量作为消息响应函数中的控制参数,从而可以交互式地从不同角度观察三维地形,来实现三维真实感地形场景的漫游效果。 随着计算机及图形处理设备性能的不断提高,地形三维可视化技术正向着实时动态显示、交互式控制、具有高度真实感的场景画面显示方向发展,利用OPENGL强大的图形功能,可以轻松地实现逼真的动态地形图。在此基础上,运用VisualC的MFC应用程序模式,可对OPENGL产生的模型进行更进一步的控制和变化。试验结果说明利用VC6。0和OpenGL作为开发工具来进行三维地形图的开发非常方便快捷,是一条切实有效的途径。