基于OpenGL的三维真实感地形的实现
2013-04-25廖宏刚
廖宏刚,刘 荣
(桂林电子科技大学 电子工程与自动化学院,广西 桂林541004)
“数字地球”的概念在1998年美国副总统戈尔在加利福尼亚科学中心发表的“数字地球:21世纪认识地球的方式”[1]报告中被提出,引起了各国的广泛关注。1998年我国召开了第一届“数字地球”国际会议,数字地球的构建受到高度重视。数字地球的核心思想是用数字化手段来处理整个地球的自然和社会活动等方面的问题,最大限度利用资源,并使普通百姓能够通过一定方式方便获得他们所想了解的有关地球的信息,它的特点是嵌入海量地理数据,实现多分辨率、对地球进行三维的描述,即“虚拟地球”。
总之,地理信息系统的普及加快了数字地球的高速发展,在国家空间数据基础设施(NSDI)中,数字地形模拟的相关研究成果已成为其基本内容,并植入到数字化空间框架中,进行集约化、规模化生产,试图将其打造成为独立的标准产品[2]。因此三维真实感地形图的生成是当前研究的热点。
1 OpenGL简介
OpenGL被定义为“图形硬件的一种软件接口”,是一个3D图形和模型库,具有高度的可移植性,除了可以在Windows系统中进行应用,还可以在Unix/Linux等其它系统甚至各种大型计算机中进行使用,做到了与硬件甚至与平台无关[2]。OpenGL是一个工业标准,可以创建优雅漂亮的3D图形,并且具有出色的视觉质量,如今显卡厂商均支持OpenGL,激烈的竞争使OpenGL的性能保持领先。OpenGL不是一种编程语言,而是一些C函数。
2 MFC与OpenGL相结合
在MFC下编程需要以下几个步骤:(1)创建工程,把OpenGL文件和库加入到工程,用AppWizard建立一个单文档的应用程序,链接opengl32.lib、glu32.lib两文件,在视类里添加OpenGL所需要包含的头文件。(2)通过PreCreateWindow函数定义窗口的风格。(3)添加消息响应函数WM_CREATE,在函数里获取DC、设置像素的格式、创建RC。(4)添加消息响应处理函数WM_SIZE,建立视点、开启透视变换和建立视景体。(5)添加消息响应函数WM_ERASEBKGND,使得该函数不执行,返回TRUE,这样才消除重绘引起的闪烁。(6)添加响应WM_DESTROY,释放RC和D。(7)在OnDraw函数里绘制想绘的图形。(8)编译运行程序。
3 数字高程模型的生成
高低起伏的地球表面其曲面不能用平面地图表示。所以用数字高程模型的方法来表示,这种方法已被广泛使用[3]。数字高程模型,用来表示地形特征空间分布的模型,它是按照一定的结构以数字形式组织在一起,是地形起伏和形状大小的一种数字描述。
数字高程模型有3种主要模型:规则格网模型、等高线模型和不规则三角网。规则格网模型有较多不足,比如在地形平坦地方,存在大量数据冗余,难以表达出复杂地形突变现象。在数字地形建模中,不规则三角网(TIN)表现的最优秀,它可以减少规则格网带来的数据冗余问题,在计算坡度效率方面又优于基于等高线的方法,它通过用一系列互不交叉也互不重叠的连接在一起的三角面片来逼近地形表面。不规则三角网可以由于地形的复杂性而通过改变采样点的密度以及决定采样点的位置,从而能够避免地形平坦时的数据冗余。三角形在形状、大小方面有较大灵活性,它能很好地拟合地形,同时又比较容易地融合断裂线、生成线,所以基于三角形的这种方法,在地形表面建模中应用越来越多,成为表面建模的主要方法。
4 纹理映射
物体的表面通常都有纹理,采用纹理映射给计算机所绘制的物体加上纹理,使得物体更加三维逼真,视觉效果会更好。没有采用纹理贴图的地形模型只有光照的明暗效果,无法重现地表的真实面貌[4]。
地形的纹理映射贴图的过程就是把纹理图像贴到三维模型上。要注意实现DEM和影像的正确匹配,使得DEM网格点与影像的位置形成一一对应的关系。
纹理贴图需要以下几个基本步骤:(1)纹理的定义。纹理贴图的过程中,对纹理图像的尺寸是有要求的,它必须是2的N次方,N为>0的整数,图像尺寸应>1 024。它需要定义指向具体哪个纹理的数据指针,还有纹理大小,纹理的类别等,这些都通过调用glTexImage2D()函数来确定。(2)纹理控制。说明所使用的纹理是以哪种方式映射到三维物体表面上。(3)纹理映射方式说明。纹理可以用来替代地形模型的颜色,也可以将纹理与所绘制的地形颜色进行融合。这是通过调用glTexParameterf()函数来实现的。(4)纹理的启用。在地形的绘制前必须先调用开启纹理函数glEnable(GL_TEXTURE_2D)。(5)纹理坐标与几何坐标的对应。几何坐标决定了将地形在显示器屏幕上的显示位置,通过调用函数glVertex*()来确定;纹理坐标决定了纹理图像中的哪个纹理单元赋予这个顶点,通过调用实现的函数是glTexCoord*(),它们必须匹配,才能有良好的视觉效果。
5 人机交互动态显示地形三维效果
为使三维效果更加的逼真,可以通过在MFC的OpenGL绘图框架里添加消息响应通过glScale(),glTranslate*(),glRotate*()函数分别实现地形的放大、缩小、旋转,平移等功能,达到不同的三维视觉效果[5]。
6 三维真实感地形生成实例
本实例在Windows7系统上,以Visual C++和Opengl为开发平台,用上述方法,生成了一个真实感三维地形。其三维地形模型如图所示。
图1为由原始点云生成的灰度图像,它是一幅平面图像,没有立体效果。其灰度信息是根据整个场景的高程信息来赋值,最低点到最高点分别对应灰度值的0和255,即灰度值根据高程信息做0~255的线性拉伸。
图1 二维灰度图象
图2为由原始点云生成数字高程模型后进行纹理映射得到的整个真实感场景效果图,在这个图中可以明显地看出立体效果。通过此界面可以看出,这是在MFC下实现的OpenGL绘图显示,可以通过菜单选项里的图形变化方便地对图像操作,实现放大缩小、选择、平移,并可以从各个视角去观看。
图2 三维真实感地形整个场景图
图3为图2的局部放大图,三维立体感明显,具有良好的3D视觉效果。
图3 三维真实感地形场景局部放大图
7 结束语
文中通过对地形的三维可视化的实现表明基于MFC和OpenGL相结合再使用纹理映射能更好地实现地形的动态三维模拟。
[1]AL GORE.The digital earth:understanding our planet in the 21st century[M].Given at the California Science Center,Los Angeles,California,1998.
[2] 李志林,朱庆.数字高程模型[M].武汉:武汉大学出版社,2001.
[3] 刘少华,程朋根,陈斐,等.TIN构建算法的研究及OpenGL下三维可视化[J].计算机工程与应用,2003(18):72-74.
[4]DAVE S.OpenGL Programming Guide[M].李军,徐波,译.北京:机械工业出版社,2010.
[5] 田红鹏,马苗.OpenGL及其基于VC++6.0的开发[J].西安科技学院学报,2001(4):365-368.