《西工大C++程序的设计期末大作业》由会员分享,可在线阅读,更多相关《西工大C++程序的设计期末大作业(43页珍藏版)》请在金锄头文库上搜索。
1、. . . .学 院班 级学 号姓 名摘要设计是基于opengl的windows地形显示系统,从地形高度图中读取相应信息,使用opengl针对不同的地形进行绘制。并可以根据键盘输入调节摄像头位置和视角,达到动态效果。目录1 摘要31.1 设计题目31.2 设计内容31.3 开发工具31.4 应用平台32 详细设计32.1 程序结构32.2 主要功能32.3 函数实现32.4 开发日志43 程序调试及运行43.1 程序运行结果43.2 程序使用说明43.3 程序开发总结44 附件(源程序)41 摘要1.1 设计题目基于opengl的windows地形显示系统1.2 设计内容从地形高度图中读取相应
2、信息,使用opengl针对不同的地形进行绘制。并可以根据键盘输入调节摄像头位置和视角,达到动态效果1.3 开发工具VC6.01.4 应用平台Windows 2000/XP/Vista 32位2 详细设计2.1 程序结构LoadPicInitRshapeDrawSceneKey func主要函数功能介绍:Loadpic 参数:无功能:将terrain.dat的高度信息读取到缓存中,并绑定至texture_2d中,设置好相应的WRAP ,FILTER等参数。Init参数:无功能:清屏。设置depth参数。设置shademode。设置雾效果。设置modelview proj viewport参数。R
3、eshape参数:无功能: 设置modelview,projection,viewport参数。Drawscene参数:无功能:清屏。计算摄像头坐标。绘制地形。Swapbuffer。打印fps。Key:参数:无功能:根据键盘输入进行相应的opengl参数设置。Special参数:无功能:这对SPECIAL KEEY INPUT 设置视角。2.2 主要功能本次大作业采用opengl作为图形绘制接口,在window平台上实现了一个基本的地形绘制系统。主要包括以下几个主要环节:1. 系统初始化。此部分分两个步骤:A) 从terrain.dat高度文件中读取需要绘制的地形的各个坐标高度值。将该地形缓存
4、绑定至GL_TEXTURE_2D纹理中,然后对此纹理的WRAP FILTER ENV_MODE进行相应的设置B) 初始化其他参数。包括clearcolor, 雾参数,alpha混合。然后进行modelview,projection,viewport坐标变换的矩阵进行初次设置。2. 输入响应。包括一般键盘输入和方向键输入。A) 一般键盘输入。主要控制摄像头的速度,是否启用雾效果。设置fillmode。设置cullmode。B) 方向键输入。属于特殊键位处理。可以修改摄像头的俯仰角度。3. 地形绘制。该环节功能最多。包括:A) 使能GL_TEXTURE_2D。清屏。保存现场矩阵。B) 计算摄像头位
5、置。C) 计算地形颜色。主要是根据高度信息进行相应的高度-颜色映射。D) 交换前后buffer。E) 计算fps并显示。2.3 函数实现(1)系统初始化函数:Loadpic:使用文件操作打开terrain.dat高度文件。将高度信息读取到terrain数组中。fread(bufferter,256 * 256, 1, FilePic);利用calccolor函数将高度信息转换为颜色信息。calccolor(GLfloat) bufferteri, terraincolori);将颜色信息传送给GL_TEXTURE_2D。gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 2
6、56, 256, GL_LUMINANCE, GL_UNSIGNED_BYTE, (GLvoid *) (&terrainpic0)利用glTexParameterf和glTexEnvf接口设置GL_TEXTURE_2D的参数。使能GL_TEXTURE_2D。glEnable(GL_TEXTURE_2D);init:设置default color和depth。glClearColor(fogcolor0, fogcolor1, fogcolor2, fogcolor3); glClearDepth(1.0);使能 depth test。glEnable(GL_DEPTH_TEST);设置雾参数
7、。glEnable(GL_FOG); glFogi(GL_FOG_MODE, GL_EXP2); glFogfv(GL_FOG_COLOR, fogcolor); glFogf(GL_FOG_DENSITY, 0.0007);设置各个矩阵。reshape(scrwidth, scrheight);calccolor:将高度分成多个区间进行颜色映射。if (height = 0.9) 。if (height = 0.7) 。if (height = 0.6) 。if (height = 0.5) 。如果height0.5c0 = color30; c1 = color31; c2 = color
8、32;(2)键盘相应函数Special:根据GLUT_KEY 的不同,增加或者减少摄像头的视角。switch (k) case GLUT_KEY_LEFT: alpha += 2.0; break; case GLUT_KEY_RIGHT: alpha -= 2.0; break; case GLUT_KEY_DOWN: beta -= 2.0; break; case GLUT_KEY_UP: beta += 2.0; break; Key:根据普通输入,改变相应的值。改变速度:case a: v += 50.; break; case z: v -= 50.; break;改变polymo
9、de:case p: if (poutline) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); poutline = 0; else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); poutline = 1; break;改变雾:case f: fog = (!fog); break;(3)绘制地形Calcposobs:根据摄像头移动速度计算此刻摄像头的位置和方向。摄像头方向计算:dir0 = sin(alpha * M_PI / 180.0);dir2 = cos(alpha * M_PI / 180.0) * s
10、in(beta * M_PI / 180.0); dir1 = cos(beta * M_PI / 180.0);摄像头位置计算:obs0 += v * dir0 * dt; obs1 += v * dir1 * dt; obs2 += v * dir2 * dt;drawterrain:绘制地形。glBegin(GL_TRIANGLE_STRIP);glColor3fv(terraincoloridx); glTexCoord2f(ox + i) / 8.0, (oy + h) / 8.0); glVertex3f(j, terrainidx, k);glEnd();reshape:重新设置
11、modelview, projection, viewport矩阵参数。scrwidth = width; scrheight = height; glViewport(0, 0, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(50.0, (GLfloat) width / (GLfloat) height), lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7); glMatrixMode
12、(GL_MODELVIEW); glLoadIdentity();drawscene:前面几个函数的组合。calcposobs(); gluLookAt(obs0, obs1, obs2, obs0 + dir0, obs1 + dir1, obs2 + dir2, 0.0, 1.0, 0.0); drawterrain();reshape(scrwidth, scrheight); glutSwapBuffers();fps calculation2.4 开发日志调试基本没有遇到问题。只是添加opengl的库有点问题。3 程序调试及运行3.1 程序运行结果说明:左边窗口是帧率。右边窗口是经过
13、高度-颜色映射出来的地形图。3.2 程序使用说明方向控制。可以通过上下左右方向键控制摄像头的视角朝向。速度控制:A键增加摄像头移动速度。Z键减小摄像头移动速度。3.3 程序开发总结通过这次编程,明白热爱一样东西就要去追寻,不管遇到什么困难,漫天繁星,斩断退路。一路向前。4 附件(源程序)/* * This program is under the GNU GPL. * Use at your own risk. * * written by David Bucciarelli (tech.hmwplus.it) * Humanware s.r.l. * * based on a Mikael SkiZoWalkers (MoDEL) / France (SkizoHol.Fr) demo */#include /