




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学 院班 级学 号姓 名摘要设计是基于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 设计内容从地形高度图中读取相应信息,使用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参数。Reshape参数:无功能: 设置modelview,projection,viewport参数。Drawscene参数:无功能:清屏。计算摄像头坐标。绘制地形。Swapbuffer。打印fps。Key:参数:无功能:根据键盘输入进行相应的opengl参数设置。Special参数:无功能:这对SPECIAL KEEY INPUT 设置视角。2.2 主要功能本次大作业采用opengl作为图形绘制接口,在window平台上实现了一个基本的地形绘制系统。主要包括以下几个主要环节:1. 系统初始化。此部分分两个步骤:A) 从terrain.dat高度文件中读取需要绘制的地形的各个坐标高度值。将该地形缓存绑定至GL_TEXTURE_2D纹理中,然后对此纹理的WRAP FILTER ENV_MODE进行相应的设置B) 初始化其他参数。包括clearcolor, 雾参数,alpha混合。然后进行modelview,projection,viewport坐标变换的矩阵进行初次设置。2. 输入响应。包括一般键盘输入和方向键输入。A) 一般键盘输入。主要控制摄像头的速度,是否启用雾效果。设置fillmode。设置cullmode。B) 方向键输入。属于特殊键位处理。可以修改摄像头的俯仰角度。3. 地形绘制。该环节功能最多。包括:A) 使能GL_TEXTURE_2D。清屏。保存现场矩阵。B) 计算摄像头位置。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, 256, 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);设置雾参数。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 = color32;(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;改变polymode: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) * sin(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:重新设置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(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 程序运行结果说明:左边窗口是帧率。右边窗口是经过高度-颜色映射出来的地形图。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 /#include #include stdio.h#include #include /#include /#include /#include /#include #include #include #define _CRT_SECURE_NO_WARNINGS#ifdef WIN32#include #endif/#include /using namespace std;#include #ifndef M_PI#define M_PI 3.14159265#endif#define heightMnt450#definelenghtXmnt62#define lenghtYmnt62#define stepXmnt 96.0#define stepYmnt 96.0#define WIDTH 640#define HEIGHT 480static GLint T0 = 0;static GLint Frames = 0;#define TSCALE 4#define FOV 85static GLfloat terrain256 * 256;static GLfloat terraincolor256 * 2563;static int win = 0;static int fog = 1;static int bfcull = 1;static int usetex = 1;static int poutline = 0;static int help = 1;static int joyavailable = 0;static int joyactive = 0;static float ModZMnt;static long GlobalMnt = 0;static int scrwidth = WIDTH;static int scrheight = HEIGHT;#define OBSSTARTX 992.0#define OBSSTARTY 103.0static float obs3 = OBSSTARTX, heightMnt * 1.3, OBSSTARTY ;static float dir3, v12, v22;static float v = 900.0;static float alpha = 75.0;static float beta = 90.0;static voidcalcposobs(void) float alpha1, alpha2; static double t0 = -1.; double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; if (t0 0.0) t0 = t; dt = t - t0; t0 = t; dir0 = sin(alpha * M_PI / 180.0); dir2 = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0); dir1 = cos(beta * M_PI / 180.0); if (dir0 -1.0e-5) dir0 = 0; if (dir1 -1.0e-5) dir1 = 0; if (dir2 -1.0e-5) dir2 = 0; alpha1 = alpha + FOV / 2.0; v10 = sin(alpha1 * M_PI / 180.0); v11 = cos(alpha1 * M_PI / 180.0); alpha2 = alpha - FOV / 2.0; v20 = sin(alpha2 * M_PI / 180.0); v21 = cos(alpha2 * M_PI / 180.0); obs0 += v * dir0 * dt; obs1 += v * dir1 * dt; obs2 += v * dir2 * dt; if (obs1 0.0) obs1 = 0.0;static voidreshape(int width, int height) 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(GL_MODELVIEW); glLoadIdentity();static intclipstrip(float y, float *start, float *end) float x1, x2, t1, t2, tmp; if (v11 = 0.0) t1 = 0.0; x1 = -HUGE_VAL; else t1 = y / v11; x1 = t1 * v10; if (v21 = 0.0) t2 = 0.0; x2 = HUGE_VAL; else t2 = y / v21; x2 = t2 * v20; if (x1 -(lenghtXmnt * stepXmnt) / 2) & (t2 = 0.0) | (t1 (lenghtXmnt * stepXmnt) / 2) | (t1 0.0) & (t2 0.0) return 0; if (t1 = 0.0) & (t2 = 0.0) if (v10 0.0) & (v20 0.0) & (v21 0.0) & (v11 0.0) & (v21 0.0) *start = -stepXmnt; *end = (lenghtXmnt * stepXmnt) / 2; return 1; else return 0; else if (t2 0.0) if (x1 0.0) x2 = -(lenghtXmnt * stepXmnt) / 2; else x2 = (lenghtXmnt * stepXmnt) / 2; if (t1 0.0) if (x2 x2) tmp = x1; x1 = x2; x2 = tmp; x1 -= stepXmnt; if (x1 (lenghtXmnt * stepXmnt) / 2) x2 = (lenghtXmnt * stepXmnt) / 2; *start = (int) (x1 / stepXmnt) * stepXmnt; *end = (int) (x2 / stepXmnt) * stepXmnt; return 1;static voidprintstring(void *font, char *string) int len, i; len = (int) strlen(string); for (i = 0; i len; i+) glutBitmapCharacter(font, stringi);static voiddrawterrain(void) int h, i, idx, ox, oy; float j, k, start, end; ox = (int) (obs0 / stepXmnt); oy = (int) (obs2 / stepYmnt); GlobalMnt = (ox * TSCALE) & 255) + (oy * TSCALE) & 255) * 256; glPushMatrix(); glTranslatef(float) ox * stepXmnt, 0, (float) oy * stepYmnt); for (h = 0, k = -(lenghtYmnt * stepYmnt) / 2; h lenghtYmnt;k += stepYmnt, h+) if (!clipstrip(k, &start, &end) continue; glBegin(GL_TRIANGLE_STRIP);/* I hope that the optimizer will be able to improve this code */ for (i = (int) (lenghtXmnt / 2 + start / stepXmnt), j = start; j = 2000) GLfloat seconds = (t - T0) / 1000.0; GLfloat fps = Frames / seconds; sprintf(frbuf, Frame rate: %f, fps); printf(%sn, frbuf); T0 = t; Frames = 0; static voidkey(unsigned char k, int x, int y) switch (k) case 27: exit(0); break; case a: v += 50.; break; case z: v -= 50.; break; 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; case t: usetex = (!usetex); break; case b: if (bfcull) glDisable(GL_CULL_FACE); bfcull = 0; else glEnable(GL_CULL_FACE); bfcull = 1; break;#ifdef XMESA case : XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW); fullscreen = (!fullscreen); break;#endif static voidspecial(int k, int x, int y) 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; static voidcalccolor(GLfloat height, GLfloat c3) GLfloat color43 = 1.0, 1.0, 1.0, 0.0, 0.8, 0.0, 1.0, 1.0, 0.3, 0.0, 0.0, 0.8 ; GLfloat fact; height = height * (1.0 / 255.0); if (height = 0.9) c0 = color00; c1 = color01; c2 = color02; return; if (height = 0.7) fact = (height - 0.7) * 5.0; c0 = fact * color00 + (1.0 - fact) * color10; c1 = fact * color01 + (1.0 - fact) * color11; c2 = fact * color02 + (1.0 - fact) * color12; return; if (height = 0.6) fact = (height - 0.6) * 10.0; c0 = fact * color10 + (1.0 - fact) * color20; c1 = fact * color11 + (1.0 - fact) * color21; c2 = fact * color12 + (1.0 - fact) * color22; return; if (height = 0.5) fact = (height - 0.5) * 10.0; c0 = fact * color20 + (1.0 - fact) * color30; c1 = fact * color21 + (1.0 - fact) * color31; c2 = fact * color22 + (1.0 - fact) * color32; return; c0 = color30; c1 = color31; c2 = color32; voidloadpic(void)GLubyte bufferter256 * 256, terrainpic256 * 256;FILE *FilePic; int i, tmp; GLenum gluerr; size_t result; if (FilePic = fopen(terrain.dat, r) = 0) fprintf(stderr, Error loading terrain.datn); exit(-1); result = fread(bufferter,256 * 256, 1, FilePic); assert(result = 1); fclose(FilePic); for (i = 0; i 255) ? 255 : tmp; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); if (gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 256, 256, GL_LUMINANCE, GL_UNSIGNED_BYTE, (GLvoid *) (&terrainpic0) fprintf(stderr, GLULib%sn, (char *) gluErrorString(gluerr); exit(-1); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTUR
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年营养与食品安全知识综合测评模拟考试卷答案及解析
- 2025年儿科学小儿传染病诊断模拟考试卷答案及解析
- 2025广东阳江市阳山县政协机关招聘政府购买服务人员1人笔试模拟试题及答案解析
- 2025河南洛阳市洛宁县下半年公益性岗位招聘40人笔试模拟试题及答案解析
- 2025年骨科手术后护理要点考核模拟试卷答案及解析
- 2025年消化科疾病病例分析模拟测试卷答案及解析
- 2025年传染病控制预防策略评估答案及解析
- 传媒行业广告创意方案及案例分析
- 2025年传染病防治流行病学分析模拟考卷答案及解析
- 2025年网络直播行业网络直播内容创新与用户付费行为研究报告
- 2025中考语文名著《红岩》重点知识讲解及高频考点梳理+练习(学生版+解析版)
- 音乐节舞台搭建及拆除施工方案
- 2025年江苏省农业融资担保有限责任公司招聘笔试参考题库附带答案详解
- 《慢性硬膜下血肿》课件
- PRP治疗注意事项
- 2025年泰和县工投建设集团有限公司及子公司招聘笔试参考题库含答案解析
- 企业事业部制信息化与数字化转型
- GB 5009.229-2025食品安全国家标准食品中酸价的测定
- 高支模工程监理细则
- 环氧乙烷应急救援预案
- 2024-2025学年高中数学 第三章 函数的概念与性质 3.1.1 函数的概念教学设计 新人教A版必修第一册
评论
0/150
提交评论