三维地形漫游系统的OPENGL实现
- 格式:doc
- 大小:485.00 KB
- 文档页数:12
基于OpenGL的三维地球可视化及漫游控制研究
王永岗;孟永军;臧海健
【期刊名称】《测绘》
【年(卷),期】2016(39)1
【摘要】随着计算机图形学的发展,OpenGL在数据可视化方面体现出了明显优势,得到广泛应用.本文根据地形图分幅方式,提出了一种绘制三维地球及漫游控制的方法.最后在VC++ 6.0环境下,利用OpenGL的API,编程实现了三维地球的可视化及漫游控制.
【总页数】3页(P24-26)
【作者】王永岗;孟永军;臧海健
【作者单位】中国人民解放军61175部队,山东淄博255000;中国人民解放军61175部队,山东淄博255000;中国人民解放军61175部队,山东淄博255000【正文语种】中文
【中图分类】P208
【相关文献】
1.基于OpenGL的DEM地形可视化和虚拟漫游系统 [J], 赵庆展;张清;宁川
2.基于OpenGL的三维校园漫游系统可视化研究 [J], 刘萍萍;陆兆攀;高武奇
3.基于OpenGL的交互式三维树木建模与可视化研究 [J], 赵凯;唐丽华;张姝婧;;
4.基于OpenGL的三维场景漫游系统的研究与实现 [J], 宋桂岭
5.基于OpenGL的三维OBJ模型可视化研究与实现 [J], 李倩
因版权原因,仅展示原文概要,查看原文内容请购买。
基于OpenG L技术的实时漫游系统研究及实现僧德文1,2,王红霞1(1.浙江水利水电专科学校,浙江杭州 310018;2.北京科技大学土木与环境工程学院,北京 100083)摘 要:结合水利行业的需求和当前可行的技术,讨论了基于桌面系统及通用平台开发实时漫游系统的技术关键和难点,给出了模型建立、转换及调用方法,并利用OpenG L技术基于Visual C++6.0集成开发环境开发了一个实用的实时漫游系统.关键词:水利工程;漫游;数据模型;开放的图形程序接口中图分类号:TP391 文献标识码:A 文章编号:1008-536X(2007)022*******Study and Implementation of Real T ime Navigation System Ba sed on Open G LS ENG De2wen1,2,WANG Hong2xia1(1.Zhejiang Water C onservancy and Hydropower C ollege,Hangzhou310018,China;2.Civil and Environmental Engineering School,Beijing University of Science and T echnology,Beijing100083,China)Abstract:C ombined with the needs of water conservancy and feasible technology,this paper discusses the techniques and the difficulties in the development of a real time desktop navigation system based on comm on developing platform.The methods of construction,transi2 tion and usage of the visualized3D m odels are provided.A practical system is implemented by OpenG L on the Visual C++6.0inte2 grated development environment.K ey w ords:water conservancy w orks;navigation;data m odel;OpenG L0 引 言现实世界是在三维空间延伸的,过去人们由于受认知能力、技术手段和硬件水平的限制,对现实世界的仿真基本上是二维形式.然而,二维仿真是一种抽象和简化,很多情况下不能有效地表达现实世界中的物体和现象,在某种程度上给人们的思维带来了一定的局限.近年来,可视化仿真技术的发展和硬件能力的提高,为人们更好地模拟和描述现实世界提供了方便[1].OpenG L是SGI公司开发的一套高性能图形处理系统,它以高性能的交互式三维图形建模能力和易于编程开发,得到了Micros oft、I BM、DEC、S UN、HP等大公司的认同.目前它已经成为开放的国际图形标准[2].本研究结合水利工程特点,探讨基于PC机平台,在Visu2收稿日期:2006212205基金项目:浙江省教育厅科研立项项目(21205);浙江省水利厅科技项目(RC0605);浙江省高校青年教师资助计划项目(21223);浙江省教育厅科研立项项目(20060001)作者简介:僧德文(1977-),男,福建漳州人,博士/博士后研究人员,主要研究方向为地学可视化、系统建模与仿真.al C++6.0集成开发环境下利用OpenG L技术开发三维实时漫游系统的实现方法.1 三维仿真场景的构造场景(Scene)是系统所有可视化对象的集合.一般来讲这些对象的形状可以通过点、线、面(多边形)进行拟合,对象的真实感则通过对三维物体进行裁剪、反走样、消隐并赋予阴影、光照、纹理和材质等属性来表现.三维空间虚拟场景的构造一般要经过以下步骤[3]:(1)几何构模 就是对整个场景模型进行几何重建,主要运用数学方法建立所需场景的几何描述,并将它们输入计算机.这部分工作可由三维立体造型或曲面造型系统来完成.(2)物理构模 所谓物理构模就是进行颜色、光照、材质和纹理等的处理,最终将几何图素及其视觉特征转换为可供显示的图形或图像.(3)场景设置 在对三维场景进行渲染前,需要设置相关的场景参数值.这些参数一般包括光源性质(镜射光、漫射光和环境光)、光源方位(距离和方向)、明暗处理方式(平滑处理或平面处理)、纹理映射方式 第19卷 第2期浙江水利水电专科学校学报V ol.19 N o.2 2007年6月J.Zhejiang Wat.C ons&Hydr.C ollege Jun.2007等.除此之外还需设定视点位置和视线方向.(4)模型渲染 主要通过投影变换将三维空间场景转换为二维计算机屏幕上的图像.虚拟场景中一般都采用透视投影,以更好地模拟真实世界的情况.2 虚拟漫游系统框架通过可视化技术构造出三维虚拟场景后,系统必须提供一定的人机交互功能,使用户能够更好的理解和认识场景中的对象以及对象间的关系.在所有人机交互手段中,交互式漫游是最重要的一种虚拟观测手段[4].本研究设计了的虚拟漫游系统框架(见图1).图1 三维场景虚拟漫游系统框架整个系统由用户的交互输入控制场景的绘制与显示.用户的输入主要指键盘、鼠标等输入设备的输入,经输入解释后将变成一系列的控制命令,进行场景数据的管理、几何模型的加载、物体光照、材质属性、不透明度以及视点方向、位置的设置等.之后,模型渲染模块能够根据用户的输入进行场景的实时绘制与动态显示.在这个过程中,还能够根据视点与物体之间的距离进行碰撞检测.3 漫游功能的实现三维场景漫游中,观察者可以通过鼠标或键盘来控制视点的位置、视向和参考方向.当视点的位置、视向和参考方向发生改变时,场景中的物体相对于观察者的方位也发生了改变,从而产生了“动感”.系统中,视点即为人眼的“化身”,其功能与现实世界的照相机类似,视线方向可由参考点位置确定(参考点位置减去视点位置即可得到视线方向的向量).漫游过程的实质就是通过不断移动视点或改变视线方向而产生三维动画的过程.3.1 键盘漫游命令的处理键盘漫游就是通过操纵键盘实现用户在三维场景中的任意漫游.通过键盘漫游用户可以灵活、准确地对场景进行全方位的观察.键盘漫游的过程就是一个根据键盘命令连续不断地改变视点位置或视线方向并渲染场景的过程.通常,键盘漫游命令包括左转、右转、前进、后退、上升、下降、仰视、俯视、左移、右移等.本系统中使用的是Z 轴朝上的左手坐标系,Z 值代表场景的高度,响应左转、右转、仰视、俯视命令时视点均保持不变,只改变视线方向.对左转、右转视线分别绕Z 轴逆、顺时针旋转一定角度,对仰视、俯视则增、减视线与XY 平面的夹角(仰角);前进、后退时将视点分别沿视线方向、视线反方向移动一定距离(视行进速度而定);上升、下降时则只增、减视点高度值(Z 坐标值);左移、右移时只将视点进行平移,视线方向则保持不变.按照这种响应方法,通过空间向量分解运算,即可计算出新的视点和参考点坐标.例如当响应前进(后退)命令时视点与参考点坐标的计算公式为:(1)视点坐标(speed 表示行进速度,anglez 表示视线绕Z 轴旋转的角度)vEyePt.x =vEyePt.x +(-)speed ×sin (anglez );vEyePt.y =vEyePt.y +(-)speed ×cos (anglez );vEyePt.z =vEyePt.z ;(2)参考点坐标(updown -angle 表示视线与XY 平面的夹角即仰角)v LookPt.x =vEyePt.x +150×sin (anglez );v LookPt.y =vEyePt.y +150×cos (anglez );v LookPt.z =vEyePt.z +150×sin (updown -angle );上式中常数150是为了使视点和参考点之间保持一定距离而设置的.3.2 记录漫游路径通过键盘操作实现对三维场景实时漫游虽然灵活、方便,但用户不断地按下键盘显得有些烦琐.特别是当需要重复前一漫游过程时更是如此.为此,系统可设计一种对键盘漫游过程进行记录的功能(记录漫游路径).所记录的键盘漫游过程称为历史记录,通过重新播放历史记录便可实现对键盘漫游过程的再现[5].记录键盘漫游过程的处理如下:首先记录下初始的视点、观察点、视线绕Z 轴旋转的角度、仰角等,然后对每种连续的键盘操作命令按“动作类型,执行次数”的格式进行记录,其中动作类型为上述的10种键盘漫游命令之一,目的就是将键盘漫游的整个过程解释为漫游命令序列.最后以一个相反的过程播放历史记录,即从文件中读取上述初始化参数并按照这些参 64 浙江水利水电专科学校学报第19卷数对系统进行设置,而后读取键盘操作命令的序列并调用相应的命令处理函数进行处理.4 系统优化要达到真实模拟环境系统,对各类复杂的自然以及人造工程的真实模拟,需要借助于计算机真实感图形绘制技术才能完成,主要包括反走样、消隐、光照、阴影、材质纹理、融合、雾化等技术.图形真实感绘制直接影响到场景的真实性及其可视化效果,然而,真实感与实时性是相互对立的两个问题,很多情况下要在两者之间取得一个平衡[5].本系统的优化着重于降低场景的复杂度在编程时采取了以下措施:(1)对象的重复引用 场景中经常需要多个相同的虚拟物体,如相同的树木等,对于这类需重复出现的物体,采用了重复引用的方法,再通过几何变换得到其他位置的物体,该方法大大节省了内存,提高了动态显示的速度.(2)可见消隐 由于屏幕只显示观察者的视野,即使系统的整个仿真场景都被绘制,落在观察者视野之外的物体也是不可见的.因此,只要绘制观察者当前所能看见的场景便能达到要求.当观察者仅能看到场景的很少一部分时,由于系统只显示相应部分的场景,从而大大减少了所需显示的物体的数目.5 结 论作者在最近开发的水利工程三维可视化仿真系统中,运用前面介绍的方法方便而高效地实现了水利工程三维场景的交互虚拟漫游.系统漫游速度快、画面流畅、真实感强,实践效果良好.图2体现了用户在交互漫游过程中,从不同视点位置和视线方向观察的仿真场景三维效果.进一步的研究工作正在进行之中,目标是将各种人造工程实体集成显示到仿真场景中,并提供其它方式的交互漫游功能.图2 三维仿真场景虚拟漫游系统参考文献:[1] 汪成为,高 文,王行仁.灵境(虚拟现实)技术的理论、实现及应用[M].北京:清华大学出版社,1997.[2] 僧德文,李仲学,李春民.基于OpenG L 的真实感图形绘制技术研究与实现[J ].计算机应用研究,2005,22(3):173-175.[3] 僧德文,李仲学,李春民,等.地矿三维场景虚拟漫游技术及其应用[J ].东北大学学报,2004,25(S2):35-37.[4] 尚建嘎,刘修国,郑 坤.三维场景交互漫游的研究与实现[J ].计算机工程,2003,29(2):61-63.[5] 彭群生,鲍虎军,金小刚.计算机真实感图形的算法基础[M].北京:科学出版社,1999. 第2期僧德文等.基于OpenG L 技术的实时漫游系统研究及实现65 。
基于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 提供了双缓存技术,通过它可实现地形实时动态显示。
主要参考了NEHE的Opengl教程所有物体都是直接用代码画的,没有经过建模。
主要部分有详细注释。
适合刚接触图形学或OpenGL的新手。
老鸟勿来。
部分效果图:全部代码,VC6.0环境:/*主要实现简单的3D空间搭建,添加物体旋转效果,光照,纹理映射,3D漫游,雾化效果*/#include <windows.h>// Header File For Windows#include <math.h>// Math Library Header File#include <stdio.h>// Header File For Standard Input/Output#include <gl\gl.h>// Header File For The OpenGL32 Library#include <gl\glu.h>// Header File For The GLu32 Library#include <gl\glaux.h>// Header File For The Glaux LibraryHDC hDC=NULL;// Private GDI Device ContextHGLRC hRC=NULL;// Permanent Rendering ContextHWND hWnd=NULL;// Holds Our Window HandleHINSTANCE hInstance;// Holds The Instance Of The Applicationbool keys[256];// Array Used For The Keyboard Routinebool active=TRUE;// Window Active Flag Set To TRUE By Defaultbool fullscreen=TRUE;// Fullscreen Flag Set To Fullscreen Mode By Defaultbool blend;// Blending ON/OFFbool bp;// B Pressed?bool fp;// F Pressed?bool gp;// G Pressed?bool light;bool lp;GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };// 雾气的三种模式GLuint fogfilter = 0;// Which Fog Mode To UseGLfloat fogColor[4] = {0.5f,0.5f,0.5f,1.0f};// Fog ColorGLfloat walkbias = 0;GLfloat walkbiasangle = 0;GLfloat lookupdown = 0.0f;float x;float z;GLfloat eye[]={0.0f,0.0f,0.0f};GLfloat lookat[]={0.0f,0.0f,0.0f};GLfloat angle=-90.0;GLfloat speed=0.5;float PI=3.14159f;GLuint filter;// Which Filter To UseGLuint texture[7];// 储存7个纹理LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// Declaration For WndProcAUX_RGBImageRec *LoadBMP(char *Filename) // 加载一个位图{FILE *File=NULL; // File Handleif (!Filename) // Make Sure A Filename Was Given{return NULL; // If Not Return NULL }File=fopen(Filename,"r"); // Check To See If The File Existsif (File) // Does The File Exist?{fclose(File); // Close The Handlereturn auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer}return NULL; // If Load Failed Return NULL }int LoadGLTextures() // 加载位图并将其转化为纹理{int Status=FALSE; // Status IndicatorAUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULLif (TextureImage[0]=LoadBMP("Data/zhou.bmp")) //指定风扇轴的纹理{Status=TRUE; // Set The Status To TRUEglGenTextures(1, &texture[0]);glBindTexture(GL_TEXTURE_2D,texture[0]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/yepian.bmp")) //指定风扇叶的纹理{Status=TRUE;glGenTextures(1,&texture[1]);glBindTexture(GL_TEXTURE_2D,texture[1]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/qiang.bmp")) //指定左右墙壁的纹理{Status=TRUE;glGenTextures(1,&texture[2]);glBindTexture(GL_TEXTURE_2D,texture[2]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/diban.bmp")) //指定地板的纹理{Status=TRUE;glGenTextures(1,&texture[3]);glBindTexture(GL_TEXTURE_2D,texture[3]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/tianhuaban.bmp")) //指定天花板的纹理{Status=TRUE;glGenTextures(1,&texture[4]);glBindTexture(GL_TEXTURE_2D,texture[4]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/qiang2.bmp")) //指定对面墙的纹理{Status=TRUE;glGenTextures(1,&texture[5]);glBindTexture(GL_TEXTURE_2D,texture[5]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if(TextureImage[0]=LoadBMP("Data/shafa.bmp")) //指定沙发的纹理{Status=TRUE;glGenTextures(1,&texture[6]);glBindTexture(GL_TEXTURE_2D,texture[6]);glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_ UNSIGNED_BYTE,TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);}if (TextureImage[0]) // If Texture Exists{if (TextureImage[0]->data) // If Texture Image Exists{free(TextureImage[0]->data); // Free The Texture Image Memory}free(TextureImage[0]); // Free The Image Structure }return Status; // Return The Status}GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// Resize And Initialize The GLWindow{if (height==0)// Prevent A Divide By Zero By {height=1;// Making Height Equal One }glViewport(0,0,width,height);// Reset The Current ViewportglMatrixMode(GL_PROJECTION);// Select The Projection Matrix glLoadIdentity();// Reset The Projection Matrix// Calculate The Aspect Ratio Of The WindowgluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,120.0f);glMatrixMode(GL_MODELVIEW);// Select The Modelview MatrixglLoadIdentity();// Reset The Modelview Matrix }//设置0—6号光源位置GLfloat sun_light_position0[] = {0.0f, -5.0f, 2.0f, 1.0f};GLfloat sun_light_position1[] = {0.0f, 7.0f, 2.0f, 1.0f};GLfloat sun_light_position2[] = {-10.0f, -5.0f, -30.0f, 1.0f};GLfloat sun_light_position3[] = {10.0f, 7.0f, -30.0f, 1.0f};GLfloat sun_light_position4[] = {10.0f, 5.0f, -50.0f, 1.0f};GLfloat sun_light_position5[] = {-10.0f, -5.0f, -50.0f, 1.0f};GLfloat sun_light_ambient[] = {0.5f, 0.5f, 0.5f, 1.0f}; //环境光GLfloat sun_light_diffuse[] = {1.0f, 1.0f, 1.0f, 1.0f}; //漫射光GLfloat sun_light_specular[] = {1.0f, 1.0f, 1.0f, 1.0f}; //反射光int InitGL(GLvoid)// 开始对OpenGL进行所有的设置{if (!LoadGLTextures())// Jump To Texture Loading Routine{return FALSE;// If Texture Didn't Load Return FALSE}glEnable(GL_TEXTURE_2D);// 开启纹理映射glBlendFunc(GL_SRC_ALPHA,GL_ONE);// Set The Blending Function For TranslucencyglClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 清理背景颜色为黑色glClearDepth(1.0);// 开启清理深度缓存glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); //透视修正glLightfv(GL_LIGHT0, GL_POSITION, sun_light_position0); //0号光源glLightfv(GL_LIGHT0, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT0, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT1, GL_POSITION, sun_light_position1); //1号光源glLightfv(GL_LIGHT1, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT1, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT1, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT2, GL_POSITION, sun_light_position2); //2号光源glLightfv(GL_LIGHT2, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT2, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT2, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT3, GL_POSITION, sun_light_position3); //3号光源glLightfv(GL_LIGHT3, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT3, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT3, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT4, GL_POSITION, sun_light_position4); //4号光源glLightfv(GL_LIGHT4, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT4, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT4, GL_SPECULAR, sun_light_specular);glLightfv(GL_LIGHT5, GL_POSITION, sun_light_position5); //5号光源glLightfv(GL_LIGHT5, GL_AMBIENT, sun_light_ambient);glLightfv(GL_LIGHT5, GL_DIFFUSE, sun_light_diffuse);glLightfv(GL_LIGHT5, GL_SPECULAR, sun_light_specular);glEnable(GL_LIGHTING); //启用光源glEnable(GL_LIGHT0); //启用0号光源glEnable(GL_LIGHT1); //启用1号光源glEnable(GL_LIGHT2);glEnable(GL_LIGHT3);glEnable(GL_LIGHT4);glEnable(GL_LIGHT5);glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Fog ModeglFogfv(GL_FOG_COLOR, fogColor);// Set Fog ColorglFogf(GL_FOG_DENSITY, 0.1f);// 雾气的浓度glHint(GL_FOG_HINT, GL_DONT_CARE);// 系统如何计算雾气glFogf(GL_FOG_START, -10.0f);// 雾气的开始位置glFogf(GL_FOG_END, -58.0f);// 雾气的结束位置glEnable(GL_FOG);return TRUE;// Initialization Went OK}void DrawGLfengshanzhou() //画一个四边形作为风扇轴{glBindTexture(GL_TEXTURE_2D, texture[0]); //绑定0号纹理,即风扇轴的纹理glBegin(GL_QUADS); //画四边形glNormal3f( 0.0f, 0.0f, 1.0f); //设置法向量glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.1f, -2.5f, 0.0f); //纹理和四边形左下坐标glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.1f, -2.5f, 0.0f); //纹理和四边形右下坐标glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.1f, 2.5f, 0.0f); //纹理和四边形右上坐标glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.1f, 2.5f, 0.0f); //纹理和四边形左上坐标glEnd();}void DrawGLfengshanye() //画一个四边形作为风扇叶片{glBindTexture(GL_TEXTURE_2D, texture[1]); //绑定1号纹理,即叶片的纹理glBegin(GL_QUADS);glNormal3f(0.0f,1.0f,0.0f);glTexCoord2f(0.0f, 0.0f);glVertex3f( 4.0f, 0.0f, 1.0f);glTexCoord2f(1.0f, 0.0f);glVertex3f(-4.0f, 0.0f, 1.0f);glTexCoord2f(1.0f, 1.0f);glVertex3f(-4.0f, 0.0f, -1.0f);glTexCoord2f(0.0f, 1.0f);glVertex3f( 4.0f, 0.0f, -1.0f);glEnd();}void DrawGLfengshan(GLfloat x) //画风扇,由柱和叶片组合而成,有一个浮点型参数,代表旋转增量{glPushMatrix();glTranslatef(0.0,2.5f,0.0); //轴长5.0,开始在中心原点,所以先向上平移2.5DrawGLfengshanzhou(); //画风扇轴glPopMatrix();glPushMatrix();glRotatef(x,0.0f,1.0f,0.0f); //使风扇叶片绕Y轴旋转,x表示旋转增量glPushMatrix();glTranslatef(4.0f,0.0f,0.0f); //风扇叶长8.0,开始在中心原点,所以先向右平移4.0DrawGLfengshanye(); //画第一个叶片glPopMatrix();glPushMatrix();glRotatef(120,0.0f,1.0f,0.0f); //旋转120度glTranslatef(4.0f,0.0f,0.0f); //注意:编码时变换的顺序和实际变换的顺序刚好相反。
分类号TP 学校代码10590 U D C密 级公开深圳大学硕士学位论文基于OpenGL的三维立体校园地图系统关键技术的研究与实现刘志荣学科门类工学专业名称计算机应用技术学院(系、所)信息工程学院指导教师黄培之教授基于OpenGL的三维立体校园地图系统关键技术的研究与实现摘 要目前传统的印刷地图和平面电子地图主要表现出二维的地理空间信息,而用户则越来越多地需要三维地图可视化来观察、分析和处理各种相关的三维问题,二维平面地图无法体现三维空间信息,具有很大的局限性。
近年来,随着计算机图形、图像学理论及计算机软、硬件技术的迅速发展,使得二维地图信息无法满足当今实际需要的问题得到解决成为可能,这就是计算机三维立体地图需要研究的目的所在。
计算机三维立体图像显示技术,是虚拟现实(VR)的一个重要分支,并且应用到建筑、旅游、游戏、航空航天、医学等众多方面,自从上个世纪八十年代以来就备受人们的关注,而且取得了相当好的成果。
计算机三维立体地图的研究包括许多的学科知识,包括地理信息、计算机图形学、计算机数字图像学、虚拟现实、计算机数据库、计算机编程等相关的学科。
本文首先对OpenGL的三维图形显示技术几个关键技术进行了研究,包括OpenGL图形的绘制、OpenGL的颜色与纹理映射和OpenGL的三维变换等技术。
然后研究了采用3ds Max建模工具对建筑物进行建模,并用OpenGL技术进行三维重建,同时还对三维立体校园地图的其它构成要素进行了研究,包括地图地形的建立、真实感天空的绘制、平面树木在三维空间中的动态显示以及粒子系统在三维景观喷泉中的应用等。
从研究得知三维立体地图并不是二维平面地图的简单扩展,还要从三维模型数据、空间关系、显示技术和对它的操作等方面进行系统的研究。
在基于三维立体技术研究的同时,本文还以深圳大学校园为例,对三维立体地图的地形数据的获取、建立和显示,建筑物模型的建模、转换及可视化,自然界景观的模拟等相关技术进行了研究和系统实现,该系统是基于OpenGL的图形显示技术,并借助3ds Max软件工具进行建模,采用面向对象编程技术在Microsoft Visual C++ 6.0下实现。
三维地形漫游系统的OPENGL实现引言 (2)1地形可视化的概念: (2)2 三维地形的生成技术: (3)2.1 基于真实数据的地形生成 (3)2.2 基于分形技术的地形生成 (3)2.3 Diamond一Square算法: (4)3基于OpenGL的地形渲染: (5)3.1:OpenGL的基本操作 (6)4 三维地形的简化技术: (7)4.1四叉树的LOD简化算法 (7)4.2自适应实时网格优化算法(ROAM) (9)5三维地形的漫游系统: (10)5.1各个类之间的类视图,如图所示: (10)5.2各个类的具体实现: (11)5.2.1数据采集和处理 (11)5.2.2Lod 类,封装LOD技术 (11)5.3系统实现 (12)引言本系统是基于OpenGL的三维地形漫游,系统主要包括三个方面:地形数据的采集与计算,由于本系统是采用随机中点位移法得到地形高度图数据。
采用Diamond一Square算法得到原始数据。
地形渲染,采用基于OpenGL的环境,在地形中加入光照,雾,天空,以及纹理等效果对地形进行模拟,使其更接近真实。
采用LOD技术对地形进行简化和管理。
1地形可视化的概念:地理信息系统技术从60年代以来,经过40多年的发展,现逐步向三维化、可视化和网络化等方面发展,GIS软件平台不断推陈出新。
传统的2D-GIS 软件通过矢量或栅格的方法完成二维地表的成图和分析,多年来,一直用二维地图产品表示三维地物,包括地质图、横断面图、示意图以及专门的几何结构图如立体网等。
但在某些领域,人们需要分析具有三维坐标的地表面以下的状况,这种空间关系时常为判断和评价矿产资源、石油资源和污染状况提供重要的信息。
因此人们在2D-GIS软件的基础上研究和开发了一些适合实际需要的3D-GIS产品。
“数字地球”强调对地球的真三维的描述,中国政府将“数字地球”列为21世纪的战略目标之一,使得3D-GIS的理论研究和软件开发又掀起了一次高峰。
所有的GIS系统都带有包括空间数据、拓扑关系及属性数据在内的地理数据库,或者能与外部数据库管理系统直接进行连接。
GIS所处理的空间数据按其处理方式不同,可分为:栅格数据、2D拓扑矢量数据、数字高程模型(DEM)、三角形不规则网格(TIN)、三维模型、时间模型等,而所有这些都是以2D或2.5D(准三维)为主的。
2D-GIS用点、线和面来表示地理实体,许多3D地理实体被简化为2D形式,得到的是二维地图、图像产品,其分析功能也是在二维基础上进行的。
2.5D或称准3D意思是它不具备真正的Z坐标,而是将Z值作为某一位置上的属性变量,它并不是空间坐标值。
在真3D-GIS中,可用表达式a=f(x,y,z)来表示,a为点(x,y,z)对应的属性值,z是独立于x,y的自变量,即三维空间中的z坐标值。
3D-GIS 具有连续的数据结构和与之相应的分析功能,由此带来的好处是可以从空间的角度分析和显示物体。
地形的可视化是一门以研究数字地面模型(Digital Terrain Model,DTM)或数字高程域(Digital Height Field)的显示、简化、仿真为内容的学科,它属于计算机图形学的一个分支。
除了计算机图形学之外,计算几何也是它的重要基础知识。
它的应用涉及地理信息系统(GIS)、虚拟现实(VR)技术、战场环境仿真、娱乐与游戏、飞行穿越(Flythrough)、土地管理与利用、气象数据的可视化等各个领域。
常用的地形可视化方法大致有写景法、等高线法、分层设色法、晕渲法、拍摄实地景观照片、建立三维几何相似的实物模型、产生三维线框透视投影图和逼真地形显示等多种方法。
随着光栅图形显示硬件的发展,以真实感图形为代表的光栅图形技术日益成为计算机图形发展的主流,基于计算机图形学理论的三维地形逼真显示逐渐成为地形可视化发展的主流。
产生逼真地形显示的方法主要有两种:一是将航空像片或卫星影像数据映射到数字地面模型上,另一种是基于分形模型的地面模拟。
随着计算机视觉、科学计算可视化、遥感技术、计算机图形学等相关学科的发展,由航空航天摄影测量获取的地形数据来生成具有高度细节层次的三维地形模型已经十分普遍。
这些由上百万或者更多的三角形面片表示的各种地形模型,满足了人们对地形真实性所提出的越来越高的要求,但由于这些数据很少从绘制效率方面考虑进行优化,因此对计算机性能又提出了新的挑战。
2 三维地形的生成技术:2.1 基于真实数据的地形生成根据真实地形数据进行地形生成是实际工作中使用最多的一类,目前大多采用数字地面模型(Digital Terrain Model,DTM)来生成,DTM数据由在规则网格地形图上采样所得的高程值构成,与飞机或卫星上所拍摄的遥感纹理图像数据相对应,这些纹理图像在重构地形表面时被映射到相应的部位。
简单的地形渲染算法,是将相邻的4个网格点定义的DTM单元变换成2个三维空间的三角形,然后将视锥体内部区域的所有这样的三角形送入图形流水线进行绘制。
这种算法还可将图像纹理数据以它的最高分辨率映射到对应的多边形上,但这是一个效率很低的方法,因为在一般情况下,三角形和遥感图像纹理像素的数量非常大,而每一个独立的三角形投影到图像空间后则很小,并且很多纹理像素可能被压缩到一个图像像素中,以至于对图像的影响可以忽略不计。
因此,如果用DTM直接生成地形,即使在高性能的图形硬件平台上,要进行实时渲染,也几乎是不可能的,通常要对DTM数据进行一定的简化。
地形简化方法将在下一章进行详细介绍。
2.2 基于分形技术的地形生成二十世纪七十年代美籍法国数学家Mnedelbot为研究自然界中复杂极不规则的几何现象创立了分形几何学[34〕,此后,分形理论得到了广泛关注和蓬勃发展。
分形(rfactal)的两个重要特征是自相似性和分数维。
现在,随着计算机图形图像处理技术的发展应用,用分形几何来表达千差万别的自然现象产生了许多传统方法无法达到的美妙结果。
而基于分形原理来研究地形场景(包括地形表面、地形纹理、蓝天白云、地貌植被等)的生成和多分辨率表达是分形几何极为重要的应用领域,也是三维地形可视化的一个重要l”[l’811’9]。
国内外一些学者从不同的角度、不同的侧面进行了持续而深入方面究,但普遍而言缺乏系统性、比较性、实践性。
英国植物学家Brwon在1827年注意到浮在液面上的微粒极不规则的运动,空气中的烟尘粒子也具有相似的现象,后来解释为由液体的分子撞击所引起,称这一现象为布朗运动。
假设一个随机过程X(t)是实变量t的函数,对每一个给定的时刻t,X(t)是一个随机变量,则两个时刻的函数差:x(I2)一X(t!)(6一l)也是一个随机变量,称为“函数增量”。
因此,对这个增量的描述通常要随机变量的统计特征来表示。
在自然界中呈现出来的许多现象大多数服从高斯分布,他们的均方增量正比于时间差,这一正比关系说明了时间间隔越大,x(t2)和x〔,)相差越大,相关性越小。
记t1 = t0,t2 = t0+△t,当△t扩大r倍时可表示为以下关系:这意味着当△t扩大r倍时,函数增量减少1/√r倍后,与(X(t0 + r△t)-x(t0))具有统计自相似性。
为了讨论方便,当t0=0时,令x(t0) = 0,时间间隔变量τ表示,则:X(τ)∝1/√r X(rτ);关系式中的τ和函数值在不同尺度比例下保持不变,这种比例关系称“非一致比例变换”,这种性质称为“自放射形”。
分布性布朗运动从随即分形生成逼真景物的数学模型,他能有效的表达自然界中许多非线形现象,也是迄今为止能够描述真实地形的最好随即过程。
他是布朗运动的一个推广。
其生成算法是:基于随机分形的地形生成技术将分形几何与FMB相结合,常采用的方法有泊淞阶跃法(poissonfaulting)、傅立叶滤波法(fourierfiltersng)、中点位移法(midpointdisplaeement)、逐次随机增加法(Suc。
essiverandomadditions)和带限噪声积累法(summingbandlimit。
dnoises)等五类。
其中,随机中点位移法是最简单和经典的方法,是对FBM的直接应用。
一维随机中点位移法的思想是:针对一己知端点高程(或属性)的线段,其线段中点的高程(或属性)为其两端点高程(或属性)的平均值再加一随机位移量,位移后的两线段再进行上述中点细分并位移,递归知道满足所需要的分辨率为止。
将其推广到二维,依据表面构网方式的不同,其模拟可分为三角形格网模拟法、矩形(正方形)格网模拟法、钻石方块格网模拟法、参数方块格网模拟法等方法,其实现思想与一维类似。
下面以正方形格网为例,着重研究二维随机中点位移法的实现过程。
2.3 Diamond一Square算法:二维随机重点位移法实现的方案很多,难点是需要消除曲面生成过程中可能产生的裂缝和皱折,“Diamond-Square”算法是三维分形地形生成的经典算法。
1>根据二维分形布朗运动思想,首先构造一个维数是2的空二维数组,可以把这个数组看成是一个正方形,然后将四个角的高程初始化为相同的值。
如(a)中的方形黑点。
2>Diamond过程取正方形的四个顶点,在其中点位置(两对角线交点)生成一个随机值,这一随机值是通过平均四个顶点的值再加上一个随机量而生成的。
这样用直线连接每四个点就形成一个棱锥。
如图6.1(b)所示,新的点显示为方形黑点,已经存在的值显示为圆形黑点。
3>Square 过程在正方形每条边的中点上,即每四个点形成的棱锥的中心位置生成一个随机值,它是通过平均棱锥的四个顶点值再加上与Diamnod过程相同的随机值而生成。
这样在原来正方形的基础上又生成了一系列正方形。
如图C所示,新的点显示为方形黑点,己经存在的值显示为圆形黑点。
4>重复迭代2、3两个步骤,最终把先前建立的二维数组填充满,从而获得了生成三维分形地形所需要的高度值。
如图(d)和(e)所示。
这样,如果己经生成了一个种子正方形并经过单独一次细分过程将得到四个正方形,第二次经过该过程得到16个方形,增长的很快,方形数目等于2的(2+i)次方,其中i为递归经过细分过程的次数。
5>算法的伪代码:当正方形(Suqare)边长大于K (K是常数,一般取2的幂,其大小决定了迭代次数的多少)时{遍历数组,对每个正方形表达执行Diamond步;遍历数组,对每个棱形表达执行Square步;减小随机数范围;}3基于OpenGL的地形渲染:OpenGL即开放性图形库(Open Graphic Library),是由SGI开发的一套高性能图形软件处理系统,是图形硬件的软件界面[21]。
OpenGL作为一个性能优越的图形应用程序设计界面(API),适用于广泛的计算机环境。