基于opengl的飞机虚拟场景漫游模拟毕业论文内容摘要:

GLfloat fogColor[4]= {, , , }。 //此处设置 雾的颜色 、//和系统的背景色一致,效果比较明显 fogMode = GL_LINEAR。 //采用、线性变化的雾化效果 glFogi (GL_FOG_MODE, fogMode)。 glFogfv (GL_FOG_COLOR, fogColor)。 //设置雾的颜色 , 与背景匹配 glFogf (GL_FOG_DENSITY,)。 //设置雾的稠密度 glHint (GL_FOG_HINT, GL_DONT_CARE)。 glFogf(GL_FOG_START, )。 // 雾气的开 始位置 glFogf(GL_FOG_END,)。 // 雾气的结束位置 } }else{ 基于 OpenGL 的飞机虚拟场景漫游模拟 9 glDisable(GL_FOG)。 //禁用雾 } } 光照 光照的概述 虚拟场景要模拟现实 , 有一个很重要的地方就是要考虑光照。 如同真实生活中一样,物体因为有光照而构成了我们五彩斑斓的世界。 同样,在虚拟场景中物体如果只有本身色彩而没有光照的话,就会给人晦暗,不真实的感觉。 OpenGL 在模拟现实光照条件方面拥有独特的光照模型,物体如果不能自己 发光的话,那么它就会接收三种不同类型的光的照射:散射光、环境光、镜面光当然真实生活中是没有这样的光的。 运用这三种类型的光可以模拟出物体的表面在接收不同的光照而产生不同的效果。 散射光有自己特定的方向,而环境光没有特定的方向,因此物体被环境光照射话其物体的表面都会均匀的照亮,当物体被散射光照射的时候要看入射光线的角度,入射光线如果直接的照在物体表面,如用手电筒直接照在门上,那么看起来物体看起来就会很亮,如果入射光线是通过某个较大的角度照射的话,如使用台灯看书,那么物体看起来就相对暗点。 镜面光不同于散射光,环境光 它虽然也是按特定的方向发射但是其反射的角度太锐利一致,如同现实生活中的聚光灯,根据这个原理我在课题中加了光照的功能。 光照的使用 在场景中使用光照,首先要调用 glEnable(GL_LIGHTING)来启用光照,接着要设置光源, OpenGL 支持 8 个光源, GL_LIGHT0 至 GL_LIGHT7 表示这 8 个光源。 尽管 OpenGL 可能支持更多的光源,但为了运行速度的快速一般只使用这 8个光源。 而使用光源必须设置光源的位置 [10]。 在本课题中的光照功能相关代码如下: glEnable(GL_LIGHTING)。 //光的参数设置 GLfloat LightPosition[]={ , , , }。 //光源位置 GLfloat LightAmbient[]= { , , , }。 //环境光参数 , R,G,B 各//取一半,显示灰色 GLfloat LightDiffuse[]= { , , , }。 // 散射光参数 , R,G,B 取//最高值 1,显示最强亮度 glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient)。 //设置并启用光照 1和 环境光 glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse)。 //设置并启用光照 1和 散射光 上面的 LightPosition 是一个四维数组,数组里的前 3 个参数分别 为光源位置的 X、 Y、福州大学阳光学院本科生毕业设计(论文) 10 开始读入文件头信息MS 3 D 文件。 处理主块信息读取实体信息读取材质 、 关键帧数据 、 多边形等信息形成显示列表结束YNZ 分量, 第四个参数 有两个取值,当此参数取值为 1 时,光源的位置就是前 3 个参数所指定的位置,而当取值为 1时,则表示光源位于距离三维场景无限远的地方,前 3个参数不起作用。 为了保证光线能够照在飞机的上,我将光源的位置朝着观察者,一般 将显示器的屏幕所处的位置看做 Z轴的 点, 因此 在 Z轴上的位移定为。 MS3D 模型载入 MilkShape3D 是一款有名的建模工具,而 MS3D 是 其特有的 模型格式。 飞机是一个相当复杂的几何模型,如果要用组合图形来实现 那么 工作量非常大且真实感很差,因此系统采用 MS3D 模型来构建飞机 , MS3D 文件是由文件头信息、材质信息、多边形信息等组成的。 对 MS3D 文件格式的三维模型读取以打开二进制文件的方式,将文件的数据读到计算机内存中,用 OpenGL 中的渲染方法将模型显示出来 [11]。 读取 MS3D 文件的流 程图如图 31所示。 图 31 读取 MS3D 文件的流程 图 基于 OpenGL 的飞机虚拟场景漫游模拟 11 4 漫游系统实现 天空的渲染和绘制 天空主要通过运用了“天空球 ”来实现,在场景中构建一个球体,并往此球体上面贴张带有天空的 bmp 格式的图像,此图像带有云彩图案,可以增强真实感 [12]。 OpenGL 提供三种不同的二次曲面:圆盘,圆柱体,球体。 函数 gluNewQuadric()和 gluDeleteQuadric()用来创建和删除这些二次曲面。 其主要主要过程是,首先要通过函数 GLUquadricObj 创建一 个新的二次曲面对象;然后调用 glEnable 及 glBindTexture 函数实现开启和绑定纹理;接着通过 gluSphere()函数创建球体的模型。 gluSphere() 函数原型为 : void gluSpere(GLUquadricObj* obj,GLdouble radius,GLint slices,GLint stacks)。 参数 radius 代表球体的半径,参数 obj 代表二次曲面对象,并以此对象为原点,参数 slices 和 stgacks 代表行经线(球体为坐标系,纵轴为经线)和行纬线(球体为坐标系,横轴为 纬线)。 相关 代码如下 : GLUquadricObj *skyqiu。 //二次方程对象 // 绘制蓝天白云背景 球面上做纹理映射 if(skyflag==true) { glEnable(GL_TEXTURE_2D)。 //开启纹理 glPushMatrix()。 //绑定纹理图, texture[0]为天空贴图对应的纹理名字 glBindTexture(GL_TEXTURE_2D, texture[0])。 glRotatef(90,1,0,0)。 //绕 x轴旋转 90 度角 glColor4f(1,1,1,1)。 gluSphere(skyqiu,1000,32,32)。 glPopMatrix()。 glDisable(GL_TEXTURE_2D)。 } 地形的实现 在 OpenGL 里, X 轴、 Z 轴是在平面坐标上,因此,绘制地图只需在 XZ 平面上绘制即可。 系统采用的是在 XZ 平面上绘制 64*64 的四边形的格子,结合纹理映射,往四边形上贴一幅带有草地地图的图像。 绘制过程:首先初始化地形 坐标点 , 把 y 坐标置为 0,通过福州大学阳光学院本科生毕业设计(论文) 12 在 X、 X、 Z、 Z 轴上 以 0 为起点, 各取 32个坐标点 乘以比例值, 然后 通过 双 循环 计算出XZ 平面上所有的 点的 坐标值 ,形成地形平面 ,如图 41所示。 接下来按逆时针顺序把 XZ 平面分成 64个网格同时运用 纹理映射 把地形贴图映射到网格上 ,为了正确的把纹理映射到 网格 ,必须 调用 glTexCoord2f()函数将 纹理图的四个角正确的映射到 网格的四个点 上 , 即构成了平面地图 [13]。 Y Z 32 X X 32 0 32 32 Z 图 41 地形平面分析 图 相关 代码如下所示 : define XQUARE 64 //64个格子 define ZQUARE 64 define SIZES 256 //格子大小 256 void CPlaneView::InitTerrain(void) { int x,z。 double xp,zp。 //初始化 坐标 for(z=0。 zZQUARE。 z++) { zp=(double)z((double)ZQUARE /2)。 //Z轴取正负 32 个坐标点 zp=zp*SIZES。 //乘以比例系数 for(x=0。 xXQUARE。 x++) { xp=(double)x((double)ZQUARE /2)。 //Z 轴取正负 32个坐标点 基于 OpenGL 的飞机虚拟场景漫游模拟 13 xp=xp*SIZES。 Terrain[x][z].x=xp。 Terrain[x][z].y=0。 Terrain[x][z].z=zp。 } } } void CPlaneView::DrawTerrain(void) { register int x,z。 glEnable(GL_TEXTURE_2D)。 //绑定纹理, tree 值可通过按键 M改变,从而切换地图 glBindTexture( GL_TEXTURE_2D, texture[tree] )。 for(z=0。 zZQUARE1。 z++) { for(x=0。 xXQUARE1。 x++) { glBegin(GL_QUADS)。 //绘制四边形方式 glTexCoord2d( , )。 //纹理的左下 //绘制  zx, 处的顶点 glVertex3f(Terrain[x][z].x,Terrain[x][z].y,Terrain[x][z].z)。 glTexCoord2d( , )。 //纹理的左上 //绘制  1, zx 处的顶点 glVertex3f(Terrain[x][z+1].x,Terrain[x][z+1].y,Terrain[x][z+1].z)。 glTexCoord2d( , )。 //纹理的右上 //绘制  1,1  zx 处的顶点 glVertex3f(Terrain[x+1][z+1].x,Terrain[x+1][z+1].y,Terrain[x+1][z+1].z)。 glTexCoord2d( , )。 //纹理的右下 //绘制 // zx ,1 处的顶点 glVertex3f(Terrain[x+1][z].x,Terrain[x+1][z].y,Terrain[x+1][z]. z)。 glEnd()。 } } glDisable(GL_TEXTURE_2D)。 福州大学阳光学院本科生毕业设计(论文) 14 } 三维场景漫游的实现 双缓冲技术概述 OpenGL 能够实现动画制作的一个重要技术就是运用了双缓冲技术,犹如放映电影一样,胶片一片一片快速的放映,就能给人感觉画面会动,双缓存也是同样的原理。 它分配了前 台缓存和后台缓存,在前台缓存进行图像显示的同时,后台缓存会绘制下一幅图像,绘制结束后会将后台缓存里的内容显示。 计算机的计算速度非常的快,可以在人眼察觉不出的时间里让显示图像不断地连续变化,这样就实现了动画效果。 而 SwapBuffers()函数可以交换两个缓存,双缓存技术主要是调。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。