纹理映射在飞行仿真系统中的应用

2018-02-25 14:27李静
电子技术与软件工程 2018年12期

李静

摘要 本文结合飞行仿真系统的开发应用,系统地介绍了纹理映射技术的基本概念,深入剖析了纹理映射的应用方法和技术特点。纹理映射技术在虚拟现实( VR)场景模拟中有着非常重要的作用,采用OpenGL编程接口,能够增强三维场景绘制的真实性,提高了仿真图形的逼真度。

【关键词】飞行仿真 纹理映射 OpenGL

飞行仿真系统的开发应用非常广泛,其中主要用到虚拟现实技术,它是计算机图形学研究中最重要的内容之,计算机图形学一个主要目的就是利用计算机产生真实感图形。在飞行仿真系统的开发中,三维飞行场景的建立是非常重要的。纹理映射技术是OpenGL中广泛应用的一项重要技术,能够极大地提高虚拟场景的真实感,在三维及虚拟空间中是一项基本技术。它利用纹理图像可以模拟几何物体表面的纹理细节,描述三维场景表面的属性特征。为此,我们需要建立虚拟场景中的三维物体模型,如天空环境、地形、飞机跑道、光照环境和雾环境等场景。

1 纹理映射技术

1.1 纹理的基本概念

OpenGL的纹理映射技术指的是把纹理图像映射到物体表面,即在一个平面区域(纹理空间)上预定义出纹理图案,然后建立物体表面空间和纹理图案坐标之间的映射关系,当物体表面的可见点确定后,就可以根据纹理空间对应点的值将纹理图案附到物体的表面上。

纹理映射的过程:把T中的纹素映射到几何对象的每个点上,几何对象上的每个点又映射到屏幕坐标进行显示。

OpenGL的基本工作流程,如图1所示。

1.2 纹理的映射方式

二维纹理映射的基本方法:

(1)线性纹理映射;

(2)使用两步映射:首先把纹理映射到一个简单的三维中间表面(球面、圆柱面或立方体)上,然后把带有映射纹理的中间表面映射到需要绘制的对象表面。

1.2.1 线性纹理映射

大部分曲面都是用参数表示的,曲面上任一点P是参数u和v的函数。

如果已知参数曲面,线性映射关系如图2所示。

物空间向像空间的映射由观察和投影变换来完成,然而,从纹理空间向像素空间的映射有一个不利因素,即选中的纹理面片常常与像素边界不匹配,通常需要计算像素的覆盖率。因此,我们最常用的纹理映射方法是由像素空间向纹理空间映射,它避免了像素分割计算,并能简化反走样操作。

1.2.2 两步纹理映射

首先,把纹理映射到简单的中介曲面,称为s-映射;再将它从中介曲面映射到最终几何物体表面,称为o-映射。其中,中介表面通常可以为任意方向的平面,圆柱面、立方体表面和球面(当中介表面越能接近景物表面时,纹理图案的变形就越小)。

1.3 纹理映射的基本步骤

1.3.1 纹理的定义

纹理通常可以是一维、二维,在一些应用上也可使用三维纹理进行图形绘制,但程序中常见的是二维纹理。OpenGL中纹理定义可用函数glTexImage2D()指定目标纹理、纹理尺寸、边界宽度等。

1.3.2 纹理的滤波控制

控制滤波可用函数glTexParameterf()来实现。控制滤波是因为当纹理图像是方形,而被映射物体是异型时,图像上的像素不能与屏幕上的像素一一对应,因此局部放大或缩小时,就要定义合适的滤波方式,来适当的控制图形。

(1)缩小或放大滤波。通常纹理图形为正方形或矩形,但当映射到曲面上或变换为屏幕坐标后,纹理的单个像素可能很难与屏幕上像素对应,这样屏幕上的单个像素可能对应于纹理中单个元素的一部分(放大滤波)或对应于纹理中多个元素(缩小滤波)。

(2)纹理的重复和缩限。纹理坐标一般定义在[O,11范围内,如果超出这个范围,纹理映射可以在坐标s,t方向上进行重复(GLREPEAT)和缩限(GL_CLAMP )。

1.3.3 纹理的映射方式

指定纹理映射方式可用函数gITexEnv*()来实现,纹理在像素上的应用方式主要包括贴花方式(GL DECAL):在物体上覆盖纹理图像,不让其下任何物体颜色透过;调制方式(GL__ MODULATE):图像以透明方式贴在物体表面;颜色混合模式(GL BLEND):使用一个RGBA常量来融合物体原色和纹理图像的颜色。但是在光照下纹理处理效果必须采用调制方式。

1.3.4 绘制场景,指定纹理坐标

确定物体和纹理坐标以及建立两者的对应关系是纹理映射的关键,纹理坐标(s,t)可以利用函数glTexCoord()来定义,也可以利用计算机自动形成。对于二维纹理图像来说,其纹理坐标沿两个方向的变化范围均为0.0至1.0,物体坐标则可以取任意值,当纹理坐标对应于物体四角的几何坐标时,纹理图像恰好覆盖整个物体表面。但当物体太大时,一般来说,需要在物体表面进行纹理缠绕以覆盖整个表面。此时,需要注意的是物体纹理图像的左右边缘和上下边缘应能够自然相接,这样才能使物体表面的纹理表现比较自然。

纹理映射的基本步骤如图3所示。

2 不同纹理图片格式的加载

2.1 加载TGA格式的纹理图片

TGA格式图像一般有压缩和非压缩两种格式,分别介绍:

(1)非压缩格式前面标记的绿色部分(共12个字节)表示对于所有的非压缩TGA格式图像值都是相同的,通常用于在读取数据时鉴别是否为TGA图像。

例如:绘制一个立方体,并进行纹理贴图。

需要注意的是:TGA图像中数据存放的顺序是BGR(A),而在OPENGL中顺序是RGB(A),所以在进行纹理生成时必须先进行格式转换。在OpenGL中只能加载24位或32位的TGA图像生成纹理。

(2)壓缩纹理。TGA的压缩算法采用了RLE算法,RLE算法的基本思想是将数据分为两大类:

A:连续的不重复字节

B:连续的重复字节

RLE算法应用于RGB格式的图片压缩中,则把数据分为:

A:连续的不重复像素颜色值

B:连续的重复像素颜色值

然后将数据按这两类数据分成若干长度不相等的数据块,每个数据块的开始都是一个1字节长度的header(RLE在纯数据压缩中header是2个字节16位),后面紧跟着data数据块,如下:

Header(l个字节)

Data(变长)

读取其像素数据部分需要注意一下,需要分情况讨论看是A类数据还是B类数据。2.2加载BMP格式的纹理图片

BMP位图文件由四部分组成:位图文件头结构、位图信息头结构、调色板和位图像素数据,如表l所示。

表1:BMP位图文件结构

位图文件头信息结构BITMAPFILEHEADER

位图信息头结构BITMAPINFOHEADER

调色板Palette

位图像素数据DIB Pixel

一个完整的BMP位图文件,可以分为文件信息头,位图信息头和RGB颜色阵列三个部分。

(1)文件信息头主要包含“是否是BMP文件”,文件的大小等信息。

(2)位图信息头则主要包括BMP文件的位图宽度、高度、位平面、通道数等信息。

(3) RGB颜色阵列,里面包含我们所需的BMP位图的像素数据,BMP位图的颜色阵列部分,像素数据的存储是以左下角为原点。

3 三维视景仿真环境的纹理映射

3.1 自然环境的建模

方法:

(1)盒子法:利用六个多边形彼此相邻构成封闭的六面体。分别表示天空的前面、后面、左面、右面、上面、下面,然后對六边形分别进行贴图,最后形成天空。通过构建六边形贴图的天空盒,可看出多边形与多边形交界处有黑线(可以通过改变纹理环绕模式),使用OpenGL函数glTexParameteri设置,参数包括:GL_REPEAT,GL_CLAMP,GLCLAMP TO EDGE。通过比较,可知使用GL CLAMP_ TO EDGE模式可以很好解决纹理交界处的缝隙痕迹,测试可知,三种模式下情景的渲染速度没有明显不同。

(2)平面天空:绘制一个足够大的矩形,使之充满整个屏幕,将包含天空纹理的位图映射到该矩形,使矩形随视点变化,并确保绘制的天空总是位于视点的前方,以保证天空始终可见。当使用这种方法建立天空模型如果出现纹理失真现象时,我们可利用绘制多个多边形而不是单个多边形来形成天空模型(使用多幅纹理图形来完成整个天空建模,避免了纹理的拉伸变形)。

(3)球形法:创建一个巨大的圆顶形半球面,将整个场景框进去,然后将天空的纹理图片映射到半球面上。这样,我们可以看到一整片浩瀚无边的天空,如图4所示,天空效果图如图5所示。

设球的中心在原点,半径为R球面方程:X2+Y2+22=R2;

f(p)= X2+Y2+22-R2;其中,p为球面一点。

F(p)=(px,py,pz)=f(R,)

球面可通过一系列三角形来形成一个球面,当三角形足够多的时候,就可以得到一个理想球面。优点:天空模型逼真,符合人们对天空的直观认识,并且对纹理没有过高的要求。缺点:建模过程较复杂,编程量大,渲染速度慢,并且随天空场景越大,系统消耗越大,不适用于大型的天空场景建模。

3.2 地形环境的建模

随着计算机图形硬件和计算机图形学的发展,地形的显示从二维地形图发展到三维真实感地形环境的阶段。地形的建模目前主要有两种方法:真实地形和模拟地形。真实地形现实世界中地形的真实再现,通过获取实际数据来构造,这种方式真实感强,但数据结构复杂且生成图形速度慢。模拟地形通常可以采用随机生成地形算法和分形算法,本文中着重介绍模拟地形方法,由于飞行场景中地形的建模对真实感要求不高,但对实时性要求较高,此方法生成地形速度较快,在视觉上满足真实地形的再现。

本文中,地形建模的方法是通过读取RAW文件中的地形数据,然后进行地形渲染的同时进行纹理映射。地形数据的获得与地形的渲染方法:首先读出RAW文件中的数据,然后根据一定的映射关系将数据映射到地形的高程上。高度图的格式:高度图的文件格式是RAW,这个格式不包含诸如图像类型和大小信息的文件头,所以易于被读取。RAW文件只是简单的二进制文件,只包含地形的高度数据。由于高度图通常是一张8位灰度图。它的高度值变化范围是在0-255之间,其中O(黑色)表示最低高度而255(白色)表示最大高度。可以使用一个缩放值增加这个间隔,用这个缩放值乘以默认高度值,增加其范围,这样可以增加高度范围,但会使两个高度之间的误差变大。

具体实现步骤:

(1)首先通过函数LoadRawFile()读出RAW文件中的数据。先将其保存到一个数组中,然后将其映射为高程数据。

(2)根据地形的X和Y坐标,从RAW文件中读出的数据映射到地形的高程值。

(3)根据从RAW获得的三维地形的每个顶点数据,以三角形面片的形式渲染地形。

同样,我们也可以采取随机生成地形算法来进行地形场景建模。飞行场景对真实感要求不高,而对于地形实时性要求很高。所以,采用基于数据模拟方法来模拟地形,通过随机生成地形算法来获取的地形高程数据,再采用线性差值算法对其生成的地形网格进行平滑处理,并将其映射到地形高程值。

生成的地形网格如图6所示,地形纹理效果如图7所示。

4 结束语

纹理映射技术是OpenGL中广泛应用的一项重要技术,能够极大地提高虚拟场景的真实感,在三维及虚拟空间中是一项基本技术。在虚拟仿真研究中应用很广泛,是计算机图形学研究中最重要的内容之一,主要目的就是利用计算机产生真实感图形。在三维飞行仿真场景的开发中,纹理技术应用是很常见的,我们需要建立虚拟场景中的三维物体模型,如天空环境、地形、飞机跑道、光照环境和雾环境等场景,并使用纹理技术为三维场景进行纹理贴图,增强三维效果,使人身临其境。

参考文献

[1]郝燕玲,路辉,基于OpenGL实现海底地形显示的研究[J].计算机仿真,2003 (10).

[2]尚游,陈岩涛.OpellGL图形程序设计指南[M].北京:中国水利水电出版社,2001.

[3]潘李亮,基于OLD的大规模真实感场景室外场景实时渲染技术的初步研究[D].西安电子科技大学学士学位论文,2003.

[4]游雄,基于虚拟现实技术的战场环境仿真[J].测绘学报,2002.

[5]郭艳萍,娄国胜.等高线三维显示技术的探讨[J].三晋测绘,加04 (01):19-21.

[3]姚建新,冯秀兰,等高线的三维地形建模与实现[J].林业资源管理,2002 (04): 65- 69.

[6]詹荣开等,虚拟现实技术在武器对抗仿真中的应用研究[J].计算机仿真,2001(03).