基于opengl的三维场景漫游实现

合集下载

电子论文-基于OpenGL技术的实时漫游系统研究及实现

电子论文-基于OpenGL技术的实时漫游系统研究及实现

基于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的三维场景多视角实时漫游与观察

基于OpenGL的三维场景多视角实时漫游与观察
fzmuh / 影机 的 方位 角 ( z平 面 ) 范 围 03 0 A i t;/摄 x , -6
v i CC mea: ttViw(o ta CV co3 v xs od a r: ae e f a , e tr A i Ro l ) {GL tx fMR; mar l i6 V co3 oae txa A i,MR : e trDR ttMar (,v xs i )
Co p tr Er o 0 8 m u e a N .1 2 0 1
基于 O e L p n 的三维场景多视角实时漫游与观察 G
傅 由甲
( 工 学院计 算机科 学与工 程 学院 ,重庆 4051 重庆 000
摘 要 :主要 介 绍 三 维场 景 中景 内和 景 外摄 影机 控 制 的原 理 和 实现 方 法 。 方 法克 服 了 O eGL场 景观 察 缺 乏 交互 功 能 该 pn
_
CVeco 3 m v Ve t r I 摄 影 机 向 上 方 位 向 量 tr Up co ; I
_
Cv c or e t 3 m v t f ; / 影 机 侧 向 向 量 S r e /摄 a
_
l f t oa m
_
f p e ;/摄影机步速 大小 Sed , flv t n /摄影机的仰 角(Z平 面)范围 01 0 Ee ai ; / o Y , -8
1 Ca r 的定义 mea类
C me a r a类变量和主要 函数定义如下 :
CCamem
{ p bc u l: i
CVe t 3 cor m v o i n / 点 位 置 P s i ;/视 t o
_
R t e i (n l . _ Srf) /以 v t f oa Ve a g Z m v t e; / S r e为轴旋转 t w e a a

基于OpenGL的虚拟场景漫游模拟毕业论文答辩

基于OpenGL的虚拟场景漫游模拟毕业论文答辩
贴地形纹理图就构成了简单的地形。
三维场景漫游的实现
系统详细设计
结论
1
本设计采用单片 机控制为核心, 采用等精度测频 法,提高测量精 度;分频计数是 为了提高测频范 围
2
3
设计采用放大整形
电路,降低待测信号 的幅度,并把不是方 波的波形转换成方波; 采用LCD液晶显示器 显示频率值,体积小、 功耗低、能显示英文
构造虚拟环境漫游系统,就是利用计算机软硬件创建 参与者具有身临其境的人机交互能力, 达到参与者在
虚拟环境中获取知识、 形成概念的最终目标
关键技术
纹理映射,纹理映射技术原理是通过把纹理空间坐标与物体空间坐标的每一点 建立关联,实现把二维的纹理图像映射到三维物体的表面。能够把二维的纹理
图像映射到三维物体的表面,从而呈现出真实视觉效果
基于OpenGL的飞机虚拟场景漫游模拟
导 师: XXXXXX 答辩人: XXXXXX 业: XXXXXXXXXXX
目录
项目背景及研究意义 关键技术 硬件设计 软件设计 调试过程 结论
一、项目背景及研究意义
目前计实等方面的图形研究
基于OpenGL进行三维地形地物显示和互 交,成为当前可视化仿真的热点。
本设计尚处于 模拟设计,并未真 正做出可投放市场 的成品,真正投放 市场还需进一步研 究,相信前景广阔
谢谢
开发工具:Visual Studio6.0
1 2 3
系统详细设计
天空的设计与实现
天空主要通过运用了“球形法”来实现,在场景中构建一个球体,并往此球 体上面贴张带有天空的bmp格式的图像,此图像带有云彩图案,可以增强真
实感。
系统详细设计
地形的设计与实现
地形的建模主要是通过用四边形近似模拟和纹理贴图的方法来实现的,导入 64*64的位图图片,在xz平面建立64*64的网格,每4个点代表四边形,每个点 的y坐标确定下来为0,x,z坐标等于对应像素的值乘以比例值。然后往格子上

OpenGL绘图 简单3D空间 3D漫游的实现

OpenGL绘图 简单3D空间 3D漫游的实现

主要参考了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); //注意:编码时变换的顺序和实际变换的顺序刚好相反。

基于OpenGL的三维场景多视角实时漫游与观察

基于OpenGL的三维场景多视角实时漫游与观察

龙源期刊网
基于OpenGL的三维场景多视角实时漫游与观察
作者:傅由甲
来源:《计算机时代》2008年第11期
摘要:主要介绍三维场景中景内和景外摄影机控制的原理和实现方法。

该方法克服了OpenGL场景观察缺乏交互功能的缺点,在VC环境下采用面向对象技术,建立一个摄影机类,通过键盘和鼠标进行三维场景的多视角实时观察和漫游。

在摄影机类的实现中通过OpenGL提供的矩阵堆栈,直接获得变换矩阵,避免了大量矩阵运算代码的编写,并在简化计算的同时,提高了程序的运行效率。

基于OpenGL的三维游戏引擎设计与实现

基于OpenGL的三维游戏引擎设计与实现

基于OpenGL的三维游戏引擎设计与实现在当今数字游戏行业蓬勃发展的背景下,三维游戏引擎作为游戏开发的核心技术之一,扮演着至关重要的角色。

基于OpenGL的三维游戏引擎设计与实现是一个复杂而又具有挑战性的任务,需要开发者具备扎实的编程基础、对图形学原理的深刻理解以及对游戏引擎架构的把握能力。

本文将深入探讨基于OpenGL的三维游戏引擎的设计与实现过程,带领读者一窥游戏引擎开发的奥秘。

一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,广泛应用于计算机图形领域。

作为一种开放标准,OpenGL提供了丰富的图形渲染功能,为开发者提供了强大的工具来实现各种视觉效果。

在三维游戏开发中,OpenGL扮演着至关重要的角色,为游戏引擎提供了底层的图形渲染支持。

二、三维游戏引擎架构设计1. 游戏循环在设计三维游戏引擎时,首先需要考虑的是游戏循环(Game Loop)。

游戏循环是指游戏引擎不断更新游戏状态并渲染画面的过程,通常包括事件处理、物理模拟、逻辑更新和渲染等步骤。

一个高效稳定的游戏循环是保证游戏流畅性和性能的关键。

2. 场景管理场景管理是指如何管理游戏中的场景、对象和资源。

在三维游戏中,场景管理器负责加载、卸载场景、管理场景中的对象以及处理碰撞检测等任务。

合理设计场景管理系统可以提高游戏开发效率和资源利用率。

3. 图形渲染图形渲染是三维游戏引擎最核心的部分之一。

通过OpenGL提供的图形渲染功能,开发者可以实现各种视觉效果,包括光照、阴影、纹理映射等。

合理利用OpenGL API可以提高渲染效率和画面质量。

4. 用户交互用户交互是指玩家与游戏之间的互动过程。

在三维游戏中,用户交互包括键盘鼠标输入、触摸屏输入等方式。

设计友好直观的用户交互系统可以提升玩家体验和游戏可玩性。

三、基于OpenGL的三维游戏引擎实现1. 硬件加速利用OpenGL进行三维图形渲染时,可以充分利用硬件加速功能来提高渲染效率。

基于OpenGL与3DSMAX的虚拟场景漫游系统的设计与实现

基于OpenGL与3DSMAX的虚拟场景漫游系统的设计与实现

计算机与现代化 2007年第12期J I S UANJ I Y U X I A NDA I HUA总第148期文章编号:100622475(2007)1220080203收稿日期:2006212220作者简介:马阿曼(19812),女,陕西咸阳人,南平师范高等专科学校助教,研究方向:图形、图像处理。

基于OpenG L 与3DSMAX 的虚拟场景漫游系统的设计与实现马阿曼(南平师范高等专科学校,福建武夷山354300)摘要:讨论了基于OpenG L 与3DSMAX 的虚拟环境的建模与漫游,并以此开发出一个虚拟的环境。

系统以V isual C ++6.0为开发平台,结合OpenG L 以及3DSMAX 建模,进行了南平师范高等专科学校部分场景的建模,以及漫游的实现,并具有光照、材质等真实感增强处理方法,建立的虚拟场景立体视觉效果明显,且实现了场景的可交互性。

关键词:虚拟场景;建模;OpenG L;漫游中图分类号:TP391.41 文献标识码:ADesi gn and Rea li za ti on of Vi rtua l Scene Ramble Syste m Ba sed on O penG L and 3DS MAXMA A 2man(Depart m ent of Science &Engineering of Nanp ing H igher Nor mal College,W uyiMountain 354300,China )Abstract:This article discusses the establishing model and ra mble of virtual envir on ment based on OpenG L and 3DSMAX ,and at the same ti m e devel op s a virtual envir on ment .The syste m establishes model of partial scene of nanp ing higher nor mal college connecting with OpenG L and 3DSMAX based on V isual C ++6.0devel op ing p latfor m and realizes ra mble .This syste m has truly enhancing handling methods such as illu m inati on and material etc .This syste m establishes obvi ous s olid visi on efficiency of vir 2ture scene and realizes interacti on of scene .Key words:virtual scene;establishing model;OpenG L;ra mble0 引 言OpenG L (OpenGraphic L ibrary )是一种与硬件、窗口系统和操作系统相独立的一系列AP I,它可以被集成到Unix 、W indows NT 和X W indow 等窗口系统中。

基于OpenGL的虚拟漫游系统研究与实现

基于OpenGL的虚拟漫游系统研究与实现

研生名 呜够 究签:
时 : D年 了 1 间 夕 月 日
关于学位论文使用授权的说明
本人完全 了解新疆农业大学有关保 留、使用学位论文的规定,即:新 疆农业大学有权保留并向国家有关部门或机构送交论文的复 印 件和 电 子文 档, 以 可 采用影 印、缩 印或扫描等复制手段保存 、汇编学位论文,允许论 文被查阅和借 阅。本人授权新疆农业大学将学位论文的全部或部分 内 容编 入有关数据库进行检索 ,可以公布 ( 包括刊登)论文的全部或部分内容。
信息处理的主要工具,成为人类与信息空间交流的主要通道。而在这其中,人机交互的界面是一个
主 障 从 算 明 现 人 面 还是 要的 碍. 计 机发 到 在, 机界 主要 通过窗口 基于 盘、 标的wM Wno , , 键 鼠 IP d w ( i s
I , e , ii , ec 模式, n o c M n Pn n Dv ) u ot g i e 这种模式是间 接的、 接的、 非直 有限的, 这极大地影响了 用户
对计算机的 使用,甚至影响到人们的工作与生活。如今每天面对着大量的信息资讯,如何智能处理
和高效利用这些来自 客观世界的海量信息?如何扩展人类的感知通道, 提高人类对跨越时空事物和
复杂动态事件的感知能力,实现人与信息空间的自 然、和谐的交互? 这些都己渐渐成为人类面临的
新挑战, 而虚拟现实技术是 这个挑战最有效的 解决 方法途径‘ 如图1 所示。 . 1 , 一 1
w lh uh ot l ie co. a r g cn o f n r tn i ko ro t i r a
T e u o s n C 十a p G ee P ri n ui V + ndo n Ldvl aP l i 口 山e Dc P n i i ssm h al r g h e o S em a r 一 a u a g n y ・ e m sv a g 比 t
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于opengl的三维场景漫游实现摘要:本课题是关于opengl三维场景的实现,要求能够实现人机交互,具有缩放、旋转等基本的功能。

利用opengl创建三维模型的原理,本课题在理解opengl创建图形元的基础上,实现了简单三维场景模型的建立。

通过建立全局Camera,实现了对场景全方位的观测,同时能够及时响应键盘和鼠标的操作。

在此基础上,利用天空盒子和全局地形的方法,实现了三维场景的基本框架,能够在虚拟场景中任意角度的漫游。

通过纹理贴图的方法,实现场景的创建,并对场景内部的事物进行碰撞检测,来实现简单的三维场景漫游。

关键词:三维建模; 全局Camera; 场景漫游; 纹理贴图; 碰撞检测目录1 课题论述 (1)1.1选题背景简介 (1)1.2系统开发平台及运行环境 (1)1.2.1 开发环境的搭建 (1)1.2.2 opengl绘图机制 (1)2课题实现的关键技术 (2)2.1 场景建模 (2)2.2 场景渲染 (2)2.3 纹理映射 (2)2.4 碰撞检测 (3)3漫游场景的实现 (4)3.1 全局Camera的创建 (4)3.2 地形和天空的绘制 (5)3.3场景的绘制 (6)3.4纹理和字体类的设计 (7)4 总结 (8)5 程序使用方法介绍 (8)1 课题论述1.1选题背景简介随着科技的发展,人们对视觉的需求也越来越高,这正好也促发了计算机图形学的快速发展:从简单的平面图形到3D空间的立体图形空间的一个转变,为opengl提供了广阔的应用和开发前景。

随着opengl的越来越成熟,在各个领域的应用也变得广泛起来。

从计算机、多媒体、影视到医学、工业等领域。

Opengl开发的重心也有所转变,从普通的三维场景的建立,到现在的大型复杂场景的三维信息生成、实时三维场景光影效果的模拟和实时三维场景的内存使用控制,opengl的发展越来越成熟。

正是基于opengl目前广泛的应用,本课题从opengl基本的图形元的创建、渲染、视角的转换等方面,选择一些opengl的基本操作,实现简单的三维场景空间的漫游,促进对opengl进一步的了解,也为以后进一步的开发做准备。

1.2系统开发平台及运行环境本设计是基于Opengl 1.0在windows7操作系统下使用Visual C++6.0集成开发环境开发并调试,设计中使用了基于Win Application的架构。

1.2.1 开发环境的搭建本设计是在Visual C++ 6.0下使用Opengl1.0库开发的,开发环境搭建步骤详细如下:(1)安装Visual C++ 6.0。

(2)配置Opengl1.0由于Visual C++ 6.0本身带有安装好的opengl1.0版本,所以一些头文件和bin路径的设置就不必要做了。

但自带的opengl1.0 没有包含glut函数库,所以需要下载glut函数库,并正确的设置include和bin的路径,并把dll文件放到system32下。

1.2.2 opengl绘图机制在Windows环境的绘图机制下使用图形设备接口GDI作图要通过设备上下文调用相应的函数,用opengl作图也是这样。

Opengl通过“渲染上下文”即RC完成对三维图形的绘制。

Windows下的设备上下文和窗口都支持“文图格式”属性,和RC在位图结构方面是一致的。

因此只要在创建RC的同时与一个DC建立联系,opengl函数就可以通过对应的DC 绘制到相应的显示设备上面。

2课题实现的关键技术2.1 场景建模场景的建模能够直接的展示出场景的三维特性,也是影响三维可视化功能的关键。

在本课题中,我主要完成了一下几个场景的建模。

首先是地形的建模,在地形的建模中,采用了四边形近视模型和纹理贴图的方式来完成。

在xoz平面,建立的是一个46*46的网格模型,其中每个方格的大小大约为7个坐标。

在y方向,通过读取位图信息的方式,建立的随机高度的模型。

其中,地形中心部分为平面,用于建立一些基本的场景,而地形的边界部分,用位图数据随机读取,生成一圈环绕的小山,把整个场景环绕在山围之中。

房子模型的建立是通过opengl简单的图形元建立,首先建立房子的四周,即四个围墙,用四个平面图形建立,然后屋顶通过两个四边形和两个三角形进行建模,实现三维房屋的构建。

天空的建立有很多方法,基本的有两种:一种是天空盒法,另一种是天空球法。

天空盒是有一个长方体,在它的各个面上贴有天空的图片组成。

天空球是有一个球体,在它的表面贴上天空的纹理组成。

天空球相对于天空盒子较简单,因为它只需要一张纹理,但为了显示效果的真实性,本课题采用的是天空盒子的方法,建立六个天空的面,然后选取合适的天空图片进行贴图。

由于六个面的链接处会出现一条线,为了实现天空的无缝连接,需要设置纹理的一些属性,来达到天空的无缝连接。

2.2 场景渲染场景的渲染对于三维空间来说也是十分最要的,因为这直接决定着场景的真实性。

本课题主要利用了纹理映射场景进行渲染。

纹理映射是把纹理空间中的纹理像素映射到屏幕空间中的像素的过程,利用纹理映射,可以使三维的世界显得更加的逼真。

本课题中主要对地形、天空、房子等进行了纹理的渲染,同时利用鼠标来旋转摄像机,相当于对物体进行了三维空间的旋转,来更好的观测场景的效果。

2.3 纹理映射纹理映射技术的原理是通过把纹理空间坐标与物体空间坐标的每一点建立关联,实现把二维的纹理图像映射到三维的物体表面,从而呈现出真实的视觉效果。

纹理映射操作包括启用及载入纹理,指定纹理坐标,设置纹理的参数,使用纹理对象等方面。

Opengl中规定纹理贴图在RGBA模式下。

本文启用了opengl中的纹理映射技术来对三维场景中的地形、天空和房子进行纹理的渲染,实现的大体过程如下:(1)首先要创建纹理对象并且为此对像指定纹理。

调用glGenTexture()函数创建纹理对象,使用一个正整数对纹理对象进行编号,并把相应的对象存储到指定的数组中。

最后调用glBindTexture()函数实现把生成的纹理名字绑定到对应的目标纹理上。

(2)控制滤波的方式Opengl在图像的时候,有可能显示的图像比原始的要大,也有可能比原始的图像要小,所以要采用控制滤波的方式,对其进行适当的放大和缩小。

本课题采用的是GL_LINEAR方式,这样纹理总是以平滑的方式来显示。

(3)启用纹理并载入纹理的数据首先要启用纹理,通过glEnable(GL_TEXTURE_2D)来启用二维的纹理,并通过glBindTexture()和glTexImage2D()来绑定纹理数据。

由于贴纹理的时候要明确纹理与映射物体的映射关系,所以通过函数glTexCoord2f()来进行绑定。

2.4 碰撞检测碰撞检测技术主要是对场景内部的物体进行的,由于场景都是自己通过三维图形建立的,而随着在场景内部全局Camera的移动,相当于观察者在场景中进行漫游。

当观察者移动到一些场景内部时,如果没有碰撞检测,就会直接穿过物体,不符合实际的情况,所以需要引入碰撞检测技术。

碰撞检测技术有很多中,本课题采用的是基于盒子的碰撞检测原理,即在被检测物体的一定范围之内,假设存在一个盒子把物体包围住,当观察者移动到盒子的范围边界时,就停止一定,然后根据Camera的角度,进行偏移。

本课题场景比较简单,主要是有山和房子组成,所以碰撞检测只做了山和房子的检测。

对于山的检测比较简单,利用盒子原理,在山的内部边界部分,设置一个四方体边界,当相机移动到边界的时候,就停止移动,然后根据角度左右或则前后移动,防止穿过环绕山。

而对于房子的检测,就要分为好几部分,墙面的检测,门的检测。

其中在房子内部和外部的边界部分都要做边缘的检测,使从外部进入和里面出来都不能穿过墙面和门。

其实现方法也是在墙面和门的附近很小的距离设置检测边界,当到达边界时,即碰撞到了物体,不能越过边界,从而达到碰撞检测并不穿过物体的目的。

3漫游场景的实现3.1 全局Camera的创建由于需要在虚拟场景中实现漫游,如果只是简单的控制坐标轴的旋转,不能够对场景中的物体进行全方位的观察,因此引入了全局Camera,通过键盘的方向键和鼠标的移动,来控制Camera移动的方向和角度,实现场景的漫游。

场景中大量的旋转和平移,如果没有相机来控制的话,程序会显得杂乱。

因此。

本课题首先创建了Camera来实现对ViewMatrix矩阵和ProjectMatrix矩阵的管理。

通俗的说,就是由相机来维护整个场景的平移、旋转等矩阵换算,还有远近裁剪面的矩阵,这样大量复杂计算全都在相机这样一个实体类中得以处理,使用者只需要调用相机的外部接口来满足自己的视角,相机内部处理矩阵计算,最终传递给OpenGL对应的Matrix,从而支撑起整个场景的视觉效果。

在程序设计中,首先创建了Camera类,包含一些基本的处理函数,关键的函数部分如下:void setCamera(float positionX, float positionY, float positionZ,float viewX, float viewY, float viewZ,float upVectorX, float upVectorY, float upVectorZ);void rotateView(float angle, float X, float Y, float Z); /* 旋转摄像机方向*/void setViewByMouse(); /* 根据鼠标设置摄像机观察方向*/void yawCamera(float speed); /* 左右摄像机移动*/void moveCamera(float speed); /* 前后移动摄像机*/void setLook(); /* 放置摄像机*/void checkForMovement(); /*检查时候移动*/void CheckedgeCollision(Vector3f oldPos,Vector3f oldView); /*碰撞检测*/首先需要调用setCamera(),初始化相机开始的位置,在本程序中,相机的初始位置设定在场景的中心,方便后边的碰撞检测。

然后通过键盘或则鼠标的相应事件,调用相应的函数,判断是要向哪个方向一定。

程序中设定“W、S、A、D、Shift”以及键盘上的方向键为相机移动和加速的响应键,当方向键被按下时,调用yawCamera() 函数和moveCamera()函数,获取移动的方向,保存相应的值。

同时移动鼠标,调用setViewByMouse()函数,通过计算鼠标移动的角度,获取Camera要旋转的视角。

最后调用checkForMovement()函数,检查键盘和鼠标是否移动,如果移动,把上述获取的值赋予Camera,移动相机,实现漫游的效果。

相关文档
最新文档