当前位置:文档之家› GIS系统三维地景仿真设计教程

GIS系统三维地景仿真设计教程

GIS系统三维地景仿真设计教程
GIS系统三维地景仿真设计教程

OpenGL基本程序框架的搭建

引言

GIS(地理信息系统)、GPS(全球定位系统)和RS(卫星遥感技术)三大空间科学技术并称为"3S"技术,被认为是21世纪信息科学技术发展的重要前沿技术。特别是进入新世纪,GIS 已经列为我国信息产业中的支柱产业之一。在各种地形数字仿真应用系统中,核心应用系统无一不是高度依赖空间数据,无一不是基于GIS技术平台。GIS是一个知识面非常宽的应用技术学科,本系列文章将从三维地景仿真的角度对其进行介绍,其间将对DEM数字高程模型和OpenGL等主要技术进行介绍。

此类GIS应用软件通常多建立在OpenGL平台之上,本系统也不例外。在实现其他特殊功能之前,必须首先正确配置、安装好OpenGL环境,然后才能进行各种实用功能的开发。下面将对OpenGL做一个简短的介绍,并开始OpenGL应用程序框架的搭

建工作。

OpenGL概述

OpenGL是一种到图形硬件的软件接口。从本质上说,它是一个完全可移植并且速度很快的3D图形和建模库。通过使用

OpenGL,可以创建视觉质量接近射线跟踪程序的精致漂亮的3D 图形。但是它在执行速度上要比射线跟踪程序快好几个数量级。OpenGL使用的是由Silicon Graphcs(SGI)公司精心开发的优化算法,这家公司在计算机图形和动画领域是公认的业界领袖。开发者可以利用OpenGL提供的150多个图形函数轻松建立三维模型并进行三维实时交互。这些函数并不要求开发者将三维物体模型的数据写成固定的数据格式,这样一来开发者就不仅可以直接使用自己的数据,而且还可以利用其他格式的数据源,能在很大程

度上缩短软件的开发周期。

OpenGL不仅可对整个三维模型进行渲染并绘制出逼真的三维景象,而且还可以进行三维交互、动作模拟等处理。其提供的基本功能具体包含以下几方面的内容:

(1)模型绘制。在OpenGL中通过对点、线和多边形等基本形体的绘制可以构造出非常复杂的三维模型。OpenGL经常通过使用模型的多边形及其顶点来描述三维模型。

(2)模型观察。在建立了三维模型后,可以通过OpenGL 的描述来观察此模型。此观察过程是通过一系列的坐标变换来实现的。这种变换使得观察者能够在视点位置得到与之相适应的三维模型场景。投影变换的类型对模型的观察有很大的影响,在不

同投影变换下得到的三维模型场景也是不同的。在模型观察过程的最后还要对场景进行裁剪和缩放,以决定整个三维模型场景在

屏幕上的显示。

(3)颜色模式的指定。在OpenGL中可以指定模型的颜色模式(RGBA模式和颜色表模式)。除此之外,还可以通过选择模型的着色方式(平面着色和光滑着色)来对整个三维场景进行

着色处理。

(4)光照效果。为使OpenGL绘制的三维模型更加逼真还必须增加光照效果。目前OpenGL仅提供了对辐射光、环境光、镜面光和漫反射光的管理方法,另外还可以指定模型表面的反射

特性。

(5)图象效果增强。在增强三维场景图象效果方面,OpenGL 也提供了一系列相关函数。这些函数通过反走样、混合和雾化等处理来增强图象效果。其中,反走样用于改善图象中线形图形的锯齿使其更平滑;混合用于处理模型的半透明效果;雾化使场景图象从视点到远处逐渐褪色,使其更接近现实情况。

(6)位图和图象处理。OpenGL提供有专门进行位图和图

象处理的函数。

(7)纹理映射。真实物体的表面普遍存在纹理,如果建立的三维模型场景缺少此细节将显得不够真实,为更逼真地表现三维场景,OpenGL提供了纹理映射的功能。OpenGL提供的纹理映射函数可以很方便地把纹理图象贴到场景多边形上。

(8)双缓存技术。OpenGL提供的双缓存技术主要用于实时动画,为获得平滑的动画效果,需要先在内存中生成下一帧图象,然后再将其从内存拷贝到屏幕。

(9)人机交互。OpenGL提供了方便的三维图形人机交互接口,通过此接口用户可以选择修改三维景观中的物体。

OpenGL应用程序框架的建立

首先建立一个单文档应用程序,并将需要用到的头文件和导入库添加到工程,以便能够顺利通过编译。在VC++中,OpenGL 的头文件一般是存放在系统头文件目录的子目录GL中,所以在指定包含的时候要指定一下相对路径:

这里的gl.h是基本头文件,glu.h是应用头文件,大多数应用程序都需要同时包含这两个头文件,glaux.h是辅助头文件,只在需要使用的情况下包含。接下来调出"Project Settings"对话框并在"Link"选项页中添加glu32.lib、glaux.lib和OpenGL win32实现的标准导入库opengl32.lib到工程。

接下来初始化OpenGL,这也是本文最重要的部分。先大致讲一下基本步骤:首先获取需要在上面绘图的设备环境(DC)并为该设备环境设置像素格式,然后创建基于该设备环境的OpenGL设备。最后,初始化OpenGL绘制场景及状态设置。前三步的实现过程在SetOpenGLInterface()函数中实现:

这里首先对描述像素存储格式的PIXELFORMATDESCRIPTOR结构变量进行了填充,在得到设备环境句柄后调用ChoosePixelFormat()和SetPixelFormat()函数以返回并设置最佳匹配的像素格式。最后调用wglCreateContext()创建一个渲染上下文RC并将其作为参数通过wglMakeCurrent ()来建立一个当前的绘图描述表,并在绘制完毕后(通常在WM_DESTORY消息发出后执行)将其释放:

经过上面的处理OpenGL就已经初始化完毕了,但为了达到逼真的视觉效果还有必要进一步设置一下场景,这在InitOpenGL ()函数中完成。具体的工作包括对光源的各种定义:

以及各项相关功能的使能设置:

通常,SetOpenGLInterface()和InitOpenGL()在WM_CREATE消息发出后即被执行,以确保在程序启动之初完成对OpenGL的环境设置。在视图初始化更新完毕后,还要进行最后的处理--进行视口的定义,下面给出的这段InitViewPort()

函数实现代码将完成此功能:

这里完成的主要工作有对投影模式的设置与对投影矩阵的建立以及对视口的重定等。其中,控制变量m_nViewMode的取值决定了投影模式(透视投影还是正射投影),并根据不同的投影模式调用函数gluPerspective()或glOrtho()建立相应的投影矩阵。函数gluPerspective()用于创建一个对称透视视景体,第一个参数定义了视野在X-Z平面的角度,取值范围为[0.0, 180.0];第二个参数是投影平面宽度与高度的比率;后两个参数分别为远近裁剪面沿Z负轴到视点的距离,总为正值。glOrtho ()用于创建一个平行视景体(实际是创建一个正射投影矩阵,并以此矩阵乘以当前矩阵)。其近裁剪、远裁剪平面均为矩形,近裁剪矩形左下角点和右上角点的三维空间坐标分别为(left,bottom,-near)和(right,top,-near);远裁剪平面的相应空间坐标分别为(left,bottom,-far)和(right,top,-far)。这里所有的near、far值同时为正或同时为负。若未进行其他变换,正射投影的方向将平行于Z轴、视点朝向Z负轴。

视口确定之后就可以着手对场景的绘制了。这主要在ReDraw()中完成,并在OnSize()、OnDraw()等需要重绘的地方被调用。由于这部分不属于OpenGL框架搭建的内容,因此该函数的实现将在后续的文章中进行详细介绍,这里不再赘述。

小结

本文主要介绍了OpenGL程序框架的一般搭建方法,为三维地景仿真处理系统的进一部开发提供了基本的OpenGL环境。读者需要注意的知识点有:对OpenGL的初始化处理;光源的设置;视口的设置等。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。

GIS三维地景仿真设计之数字高程模型

引言

在上一篇文章中建立了OpenGL应用程序框架,为场景的绘制提供了环境支持。要绘制某一区域场地的场景自然需要通过对该区域各点坐标数据的建模来实现。由于这些点的坐标取值描述了该区域的基本地貌特征,因此建模后的场景能够无失真的再现该区域从而达到仿真的目的。但是在实际操作时不可能取该区域的全部点进行建模,无论是数据量还是运算速度都是不允许的。

一般的做法是进行网格抽取,可以在该区域纵横方向各每隔1米、10米、100米或是1千米取一个点,以这些点的坐标值来模拟真实场景,网络抽取间隔应以抽取后的网格足够描述原区域地貌特征为准。由于网格间隔固定,因此网格的平面坐标能够很容易的推算出来而无须记录,真正有价值的是各点的高程数据,这种由高程数据组成的均匀间隔网格模型在GIS中通称为数字高程模型(DEM)。本文将就DEM数据的读取和生成进行重点介

绍。

DEM数据结构的定义

DEM数据并没有统一的标准格式,常用的标准有美国地理DEM数据标准和日本DEM数据标准等多种,这类DEM数据定义的信息较多,而这里只使用了高程数据,如果使用上述格式标准则信息利用率太低。因此,这里将建立自己的DEM数据格式,并以此来存储某一区域的地景特征数据。如果要满足在引言中提到的DEM数据定义标准,至少需要定义网格的长、宽节点数、网格间隔以及各节点的高程数据。其中,各节点的高程数据以整型点阵数据方式存储记录,其余各参数可以作为文件头进行定义。由此可以定义数据结构DEMFILEHEADER来描述DEM文件头,该文件头除了定义上述几个必须字段外,还定义了一些保

留字段以备将来扩展使用:

DEM数据文件的生成

DEM数据文件的生成主要包括两部分:文件头的生成和网格数据的生成。如果数据量不大,可以用手工填表的方式将采集到的网格化高程数据写入到DEM数据文件。但在实际使用时,数据量往往是比较巨大的。应当采取某种自动化处理措施使其实用化。这里采取从位图导入高程数据的方式,通过前期处理将通过卫星遥感手段得到的某一地区的高程数据作为图象颜色值而以位图的形式给出,这样一来,只需要读取该位图信息,图象的宽度和高度就是DEM文件的X方向和Y方向的网格节点数,图象颜色值为高程数据,用户只需手工输入根据比例换算而来的网格间隔即可。下面这段代码是实现这部分功能的主要代码:

其中,set.m_nXPoint、set.m_nYPoint和set.m_nInterval分别为从图象获取得到的网格节点数和用户输入的网格间隔。这几

个参数填充到DEMFILEHEADER 结构对象DemHeader中后将作为DEM文件头保存到新创建的DEM数据。set.m_pData指向的缓冲区保存有以RGB颜色值方式给出的各节点高程数据,经过换算后保存到DEM数据文件。

DEM数据文件的读取与保存

既然已经清楚DEM数据文件的存储格式,数据的读取就不是一件困难的事情了。下面先给出执行函数ReadDEM(CString

sDemFile)的实现过程:

至此,已经取出DEM文件头信息和高程点阵数据。这只是原始信息,为了能够在后面将要进行的场景绘制中以此来建模,还要标定格网点的X、Y坐标并将坐标原点移动到地形的中心:

至此,已经从DEM文件恢复出各节点的坐标参数(X,Y,Z坐标数据分别存放在m_pDemX、m_pDemY和m_pDemH指

向的缓冲区中)。

如果需要将当前正在显示的地景仿真数据保存,只需简单的将DEMFILEHEADER 结构对象DemHeader中的数据保存到DEM文件头、将整型数组m_pDemH中的数据保存到DEM文件

高程点阵即可:

小结

本文主要介绍了对DEM数字高程模型数据的一般使用方法,为三维地景仿真处理系统的场景绘制提供了基本的数据来源。读者需要掌握的技术主要有对DEM文件的创建和对DEM 文件的读写访问等。本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译通过。

GIS三维地景仿真设计之建模及场景渲染

引言

在上一篇文章中已经实现了对数字高程模型(DEM)的文件创建与数据读取。本文将根据已经读取的DEM数据完成建模及对场景的绘制渲染。主要的设计步骤为:首先通过计算获取法线向量,然后对地景的材质进行定义并初始化地景列表,最后对

地景的不同建模方式进行介绍。

法线向量的计算

本系统的实现目标是通过计算机真实的再现指定真实场景的视觉效果。这显然要考虑到光照的影响,而一般的场景通常都是存在不同程度的起伏,通过抽取出来的DEM网格数据表现为大量不同朝向的小网格平面。由于这些网格平面的朝向不同,当

同一光源发出的光线照到场景上时,反射出来的光线将反射到四面八方。仿真的一个重要思想就是在算法中应用真实世界中客观存在的物理定律、现象以及规律等。只有这样,才能制作出与逼真的效果。为了描述光线的反射方向,必须首先确定各网格平面的法线方向,在程序实现中通过法线向量来表示:

相关主题
相关文档 最新文档