基于OpenGL的三维地形可视化的研究与实现
2009-09-21
作者:刘 清 邢 航 黄 珍
摘 要:针对三维地形可视化开发中的几个关键技术进行了详细的研究和讨论,并以OpenGL开发语言为基础,分析了实现三维地形地貌可视化的基本步骤。
关键词:三维地形投影变换纹理映射 动态显示
随着计算机及图形图像技术的发展,地形可视化的应用越来越广泛。三维地形可视化是研究数字地形模型(Digital Terrain Model,DTM)或数字高程域(Digital Height Field)中显示、简化、仿真等内容的学科。常用的三维开发语言主要有OpenGL、Direct3D、VRML等。由于OpenGL与3DS、3Dmax相比具有可实时交互操作的优点,所以更适合于空间信息的三维构建,因此它的应用最为广泛。本文介绍在某一实时监控项目的开发中,基于OpenGL实现的三维地形地貌可视化的开发技术和实现方法。
1 三维地形建模
三维地形的建模是三维地形可视化的核心内容。本文首先探讨了三维地形可视化中地形建模的方法,然后讨论了三维可视化过程中的几个关键技术。
1.1 数字地面模型
数字地面模型DTM是在一定的地域范围内按一定的规则获取和记录一些点的高程而形成的用来描述地形的数字模型[2]。常用的地面取点方式有二种:一种是非等间隔取点,即根据地面的变化率决定取点的位置和疏密。在高度变化较缓的区域取点相对较少,反之较多;另一种是等间隔取点,即取点的行列间隔是固定不变的。在数据存储上,前者节约空间且获取的地形信息较多,但数据结构复杂,运算处理困难;后者虽然数据结构简单,特别是每个点有隐含坐标,使运算处理较为容易、编程实现比较方便,但容易丢失一些地形信息,有时存在冗余数据。
DTM数据实质上是空间离散点的集合,生成三维地形的过程就是用这些离散点逼近地形曲面的过程。目前三维地形模型大多采用数字地面模型生成。本文中DTM数据由等间隔取点所得到的高程值构成。
1.2 三维地形建模方法
计算机图形学中,利用多边形构造曲面时应考虑以下因素:
(1)保持多边形的方向一致性(通常每个多边形均取逆时针方向)。
(2)尽量选用三角形来逼近,这样可以保证多边形上的所有点共面。
(3)避免构造过程中出现T型点,因为T型点将导致绘制时出现裂痕。解决办法是增加一条指向T型点的边。
(4)避免使用狭长三角形,应尽量选用各边长度接近的三角型。狭长三角形会使绘制的结果颜色变化太尖锐。
(5)要正确处理好图像质量和绘制速度的矛盾,因此应选用适当的多边形数目。
由于OpenGL只能处理凸多边形,加上对上述因素的考虑,本文在设计开发过程中主要采用把整个地形曲面化分为多个小的三角曲面,然后由这些三角曲面拼接成整个地形曲面的方法。拼接方法如图1所示。
为了达到地形曲面的光滑,应使各三角曲面拼接处的法向量不产生突变。本方法的重点在于求各点的法向量。法向量同时还关系到每个顶点所能获得的光照量,从而影响整个场景的视觉效果。OpenGL本身并未提供计算法向量的函数,计算法向量的工作必须自己完成,这样就具有更大的灵活性。本文采用最常用的平均平面法向量法。
在三维视图中,每一个面都有二个方向,因此计算三角面法向量时必须按相同的顺序(顺时针或逆时针方向)从三角面取二条有向边,计算其叉积,然后将该叉积进行单位化,就得到该三角面的法向量。而求每个顶点的法向量时将顶点周围六个三角面的法向量的平均值作为该顶点的法向量即可。在OpenGL中再通过插值,可求得三角曲面上每一点的法相量,从而获得一块光滑的三角曲面。
2 三维地形的可视化
在OpenGL中实现三维地形可视化的基本过程如图2所示。其中,参数设置主要包括光源性质、光源方位、颜色模式、明暗处理方式、纹理映射方式的设置等。这些参数设置都可以通过OpenGL的相关函数来实现。视口变换就是将三维空间坐标映射为计算机屏幕上的二维平面坐标,用glViewport()实现。以下就其中的光照计算、投影变换和纹理映射技术进行重点分析。
2.1 光照计算
根据所求的顶点法向量,可以求出各个顶点处的光强值。假设地形表面为一个漫反射体,光源为无穷远处的点光源,根据朗伯余弦定理,任一地形点的光强为:
其中:L为点光源单位入射向量;N为所求点的法线向量;I0、Ie分别为环境光和入射光的光强;K0、Kd为环境和入射光的反射系数。
2.2 投影变换
在OpenGL中,投影变换分为正交投影和透视投影二种。二种投影变换的显著区别是视景体的不同。在透视投影中(如图3),视景体是一个棱锥的平截台体,即为一个被平行于地面的平面裁掉顶端的棱锥。同样一个物体,距离视点较近比远离视点时在视景体中占据更大的比例,因此在平截台体的粗端将显得大一些。由于这种投影方法类似于人眼的视觉机制,通常用于强调真实感的场合,所以在三维地形可视化中采用透视投影。
图3中近平面P1和远平面P2为矩形且互相平行。视点到近平面的距离为n,到远平面的距离为f。设近平面左下角点a1的三维空间坐标为(l,b,n),右上角点c1的三维空间坐标为(r,t,n),则透视投影变换可用下列矩阵P表示:
透视投影变换实际上就是用矩阵P乘三维空间点的坐标运算。
2.3 纹理映射
纹理映射是把纹理影像“贴”到由DTM数据所构成的三维模型上,它是建立具有真实感的三维地形地貌的重要手段。纹理映射的关键是实现影像与DTM之间的正确套合,使每个DTM网格点与其所在的影像位置一一对应,保证纹理在变换时与所附着的曲面保持适当的关系。对于原始影像,可以根据成像时的几何关系,利用共线方程解算出每一个DTM网格点所对应的像坐标,将其作为纹理映射时的纹理坐标依据。
纹理映射有二个问题需要重点考虑。①内存与速度之间的矛盾。由于加入了图像纹理,使得着色算法变得复杂化,明显影响了三维地形的显示速度。如果在三维地形多分辨率模型中加入多分辨率的纹理,即将图像分成多级分辨率,然后根据视点的变化来选择其中的分辨率,这就更增加了内存与速度之间的矛盾。②大尺寸图像的叠加问题。通常软件系统(如OpenGL)只支持1024×1024的图像尺寸。如果有一个高分辨率的图像,图像尺寸是4096×4096,则需要将大图像分成较小的尺寸(如512×512),同时将地形也相应分成较小的地形块,将图像块与地形块叠加后,再将它们拼接起来。为了防止拼接缝的产生,在设计分块时让块与块之间保留少量的重叠。纹理映射时,OpenGL会自动根据周围像点的像素值来决定拼接处像点的像素值,从而避免拼接缝的产生。OpenGL中纹理映射的基本操作步骤如下:
(1)定义纹理。用glTexImage2D()函数说明所映射的纹理内容,其中包括纹理数据的指针、纹理的大小、纹理的类别(灰度或色彩)等。简单的纹理是一个图像。
(2)纹理控制。用来说明纹理以何种方式映射到三维模型表面上,OpenGL提供的函数为glTexParameter*()。可以把纹理作为象素的最终颜色,用纹理覆盖原有的象素段;也可以把光照与纹理后的效果结合起来,调整或放大象素段的颜色。另外也可以用基于纹理值的一个固定颜色与象素段颜色混合。
(3)使用纹理映射。在绘制场景前,先调用glEnable(GL_TEXTURE_1D)或glEnable(GL_TEXTURE_2D)函数,允许使用一维和二维纹理映射。在纹理映射过程中,可以用纹理来调整三维模型的颜色或将纹理与三维模型原来的颜色进行融合,其调整函数为glTexEnv*()。
(4)绘制场景。定义三维模型顶点的纹理坐标与几何坐标。几何坐标决定了顶点在屏幕上的绘制位置,纹理坐标决定纹理图像中哪一个纹理单元赋予该顶点,其调整函数为glTexCoord*()。在曲面上只绘制一份纹理图案,则四个角坐标分别为(0,0)、(1,0)、(0,1)、(1,1)。
需要注意的是:纹理映射只能在RGBA模式下使用,不适用于颜色索引模式。计算纹理坐标必须准确,否则将导致纹理变形。
3 三维地形实时动态显示
三维地形仅仅静态显示还不够,它需要交互式地实时动态显示。除了必要的硬件之外,OpenGL所特有的显示列表和双缓存机制也为实现三维景观的实时动态提供了有力的保证。
显示列表是OpenGL为了提高程序的运行效率而引入的“批处理”技术,是预先存储的、用于稍后执行的一组OpenGL命令序列。激活一个显示列表后,就可按照显示列表中预先排好的次序执行其存储的命令。显示列表是不可修改的,一旦建立,OpenGL就将其处理成适合于图形硬件的格式,而且可以避免在绘图过程中因主机计算量过大而影响图形生成的速度,从而提高了效率。双缓存技术提供前后二个缓存,在显示前台缓存内容的一帧图像时,后台正在绘制下一帧的图像;后台绘制完成后,交换前后台缓存,不断地循环,实现地形的实时动态显示。OpenGL中双缓存是通过调用auxSwapBuffers()函数实现的。
地形实时动态显示一般有二种方式:一种是视点固定、目标移动,目标本身的变化包括目标的平移、旋转和缩放等。这种显示方式较容易实现,而且平行投影和透视投影二种投影方式都可以采用。另一种是目标固定、视点移动。这种显示方式实现起来较复杂,因为目标固定、视点沿路径运动,因此必须采用透视投影才能达到仿真效果。本文中三维地形的动态显示即采用第二种方式。
4 结束语
根据上文介绍的技术,在CPU为PⅢ800、内存为128MB、Windows2000环境下,以VC6.0为开发平台、OpenGL为工具,进行了水下三维地形的动态显示仿真。所绘制的某一水下地形显示地形地貌效果良好。本文的研究还很基础,对于三维数据的采集、压缩、插值、建模、显示速度等方面还有许多问题有待进一步研究。
参考文献
1 王永明.地形可视化.中国图像图形学报.2000;(6)
2 郭文普,孙继银.视景生成中的几个关键技术.系统仿真学报,2001;(11)
3 吴刚.ZZC02雷达装甲车系统软件的研制.成都:电子科技大学硕士学位论文,2001
4 柴小文,王金岩,田翼.三维数字地形图生成技术研究.航空电子技术,2002;(12)
5 戴晨光,朱述龙.利用OpenGL实现三维地形的快速动态显示.测绘通报.1998;(6)
6 高武俊,张继贤,张永红.基于OpenGL的三维地形可视化研究.测绘通报,2002(增刊)