基于openGL的三维地形场景的生成
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于openGL的三维地形场景的生成
1、背景介绍 (3)
2、openGL中地形动态显示 (3)
3、程序的主要功能 (4)
3.1 三维地形的生成 (4)
3.2 天空盒的生成 (8)
3.3 树的生成 (9)
3.4 3DS模型的读入 (11)
3.5 键盘交互实现漫游 (11)
3.6汉字的显示 (12)
4、总结 (13)
4.1 项目总结 (13)
4.2 小组成员分工 (14)
参考文献 (15)
1、背景介绍
地形是自然界最复杂的景物之一,对其三维显示和漫游一直是计算机图形学、地理信息系统、数字摄影测量和遥感研究的热点之一。但由于受地形结构复杂,数据量大等条件的制约,要实时模拟具有真实感的大范围三维地形,最大的难点是,如何精简并有效地组织地形数据,以达到高速度、高精确度的可视化目的。
openGL是开放式图形工业标准,是绘制高度真实感三维图形,实现交互式视景仿真和虚拟现实的高性能开发软件包。
利用openGL进行地形动态显示的基本框架如图1所示:
图1 openGL地形现实基本框架
2、openGL中地形动态显示
利用openGL进行地形的三维可视化,包含以下几个步骤:
(1)openG L模型映射:利用openGL 制作三维立体地形图,就要将数字地面模型格网用openGL提供的点,线,多边形等建模原语描述为openGL图形函数所识别。
(2)遥感图像与地形融合:openGL提供两类纹理:一类纹理图像的大小必须是几何级数;另一类Mipmaps 纹理可为任意大小。在Mipmaps纹理映射的基础上,可将遥感图像与地形融合。在遥感影像与数字地形相套合时,地形与遥感影像的配准是关键。为了获取更好的视觉效果,配准方案可采取数字地形向遥感图像配准,通过控制点,建立匹配方程,将数字地形由大地坐标系转到影像坐标系中。
(3)观察路线设置与视点计算:为了达到三维交互控制的目的,可在正射的遥感数字影像上任意选择观察路线,对路线上的采样点记录其平面坐标,根据采样点的平面位置从DEM 中采用一定的插值方法,确定观察路线上采样点的高程和平面坐标,当采用Fly-through方式观察时,观察路线上每个视点的高度可由观察点地面高程加上飞行高
度确定当采用walk-through方式观察时观察
路线上每个视点的高度可由观察点地面高程加上
身高来确定
(4)实时显示Opengl 提供了双缓存技术,通过它可实现地形实时动态显示。其基本原理是提供前后两个缓存,在显示前台缓存内容的一帧图像时,后台缓存正在绘制下一帧图像后台绘制完成后,交换前后台缓存。不断循环,实现动态显示。可进一步结合立体视觉技术传感技术,多媒体技术等实现虚拟现实。
3、程序的主要功能
本程序利用openGL实现了三维地形的现实和漫游,天空盒的显示,并且利用billboard 技术在场景中添加了树模型,同时实现了在3DS模型的直接读入。下面,对各功能的实现原理进行介绍。
3.1 三维地形的生成
3.1.1 地形生成的主要思想
地形生成的主要思想是:给定等高地形图Terrain2.bmp,将其加载进数组g_imageData[];利用数组中的值生成地形采样点x,y的高程值h。然后利用三个数组分别保存地形相关的数据,其中:
(1)g_terrain [MAP_W*MAP_W][3]:存储地形的x,y,z值,其中每一行代表一个地形采样点。x和z表示采样点的平面位置。y表示采样点的高程,高程值的确定通过上述方法获得。
下面以3*3地形的生成为例:
g_terrain[3*3][3]如下所示:
x y z
0 0 0
1 24 0
2 48 0
3 0 -24
4 24 -24
5 48 -24
6 0 -48
7 24 -48 8
48
-48
表1 g_terrain[]数组
因为坐标系为:
图2 openGL 中的坐标系
所以,y 值表示高度h ,值的获取方法为:
(2)g_index [MAP_W*MAP_W* 2]:用来保存顶点的索引。
0 0 1 3 2 1 3 4 4 2 5 5 6 3 7 6 8 4 9
7
x
10 5 11 8 12 6 13 9 14 7 15 10 16 8 17
11
表2 顶点索引g_index[]数组
(3)g_texcoord [MAP_W*MAP_W][2]:用来保存顶点的纹理坐标。
0 0 0 1 1
0 2 2 0 3 0 1 4 1 1 5 2 1 6 0 2 7 1 2 8
2
2
表3 顶点纹理坐标数组g_texcoord[]
g_texcoord []数组的使用是结合glBindTexture(GL_TEXTURE_2D, g_cactus[0]),用来指定纹理坐标。
3.1.2 地形生成的主要过程
上述三个数组准备完成后,利用glDrawElements ()函数来实现地形的绘制。 glDrawElements ()具体实现为:
glDrawElements(GL_TRIANGLE_STRIP,MAP_W*2,GL_UNSIGNED_INT,&g_index[z*M
AP_W*2]); 其中:
GL_TRIANGLE_STRIP 指出要绘制的模式。 MAP_W*2是纹理数组的大小。
GL_UNSIGNED_INT 指出第四个参数索引数组的类型。
g_index 是三角形的索引数据,随着z 的改变,该函数每次利用MAP_W*2个
g_terrain[]中的顶点,按照g_index[]中的顺序,每三个绘制一个三角形。
图3 地形绘制主要过程
函数以此从g_terrain[]数组中取出MAP_W*2个顶点,按照g_index[]中的顺序,每三个点绘制一个三角形。利用循环来绘制整个场景中地形。
x