地学可视化与景观模拟 实验报告_第1页
地学可视化与景观模拟 实验报告_第2页
地学可视化与景观模拟 实验报告_第3页
地学可视化与景观模拟 实验报告_第4页
地学可视化与景观模拟 实验报告_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、地学可视化与景观模拟实验报告姓名 班级 学号 环境与测绘学院一 实验目的1. 掌握利用opengl进行三维可视化的基本方法。2. 了解opengl几何变换基本原理,掌握opengl基本变换编程技能。3. 了解光照基本原理与知识;练习使用opengl光照函数,如gllight, glmaterial, glcolormaterial等函数。二 实验内容1. 利用opengl对给定的dem数据进行三维可视化。2. 在实验一的基础上,实现利用键盘控制三维地形围绕地形的中心旋转。3. 在实验二基础上,增加光源、材质等光照效果。三 实验代码与分析/函数声明部分#include #include #inc

2、lude #include #include using namespace std;extern long ncols=535;extern long nrows=435;extern double dem435535=0.0;/定义存dem的数组static int angle=0,leftx=0,rightx=0,up=0,down=0,bigger=0,smaller=0;void myinit(void);void myreshape(glsizei w, glsizei h);void display(void);void readfile(void);/读取dem文件的函数。vo

3、id drawdem(void);/绘制dem的函数,在display中被引用。void keyboard(unsigned char key, int x, int y);void specialkey(int key,int x,int y);/主函数部分void main( int argc, char * argv) readfile();/读取dem文件glutinit (&argc, argv);/init 即 initialize初始化。这个函数用来传输命令行参数并初始化glut库。必须写。glutinitdisplaymode(glut_depth |glut_double|g

4、lut_rgba); /窗口显示双缓存和rgb(彩色)模式glutinitwindowposition(200,200); /大小 x=200 y=200 (0,0)是屏幕左上点glutinitwindowsize (820, 620);/设置窗口大小glutcreatewindow(openglsample.c); /初始化窗口,参数是标题myinit();/初始化 glutreshapefunc(myreshape);/ 为窗口改变大小而设置一个回调函数glutdisplayfunc(display);/绘制demglutkeyboardfunc(keyboard);/键盘放大缩小图形,引

5、用函数keyboardglutspecialfunc(specialkey);/键盘平移图形,引用函数specialkeyglutmainloop();/myinit 函数,设置初始化的状态 void myinit(void)/光照也是在myinit中设置glclearcolor (0.0, 0.0, 0.0, 0.0);glshademodel (gl_smooth);glfloat light_position = 0.0, 0.0, 500.0, 1.0 ;glfloat light_ambient = 0.1, 0.1, 0.1, 1.0 ;glfloat light_diffuse

6、= 0.8, 0.8, 0, 1.0 ;glfloat light_specular = 0.2, 0.2,0.2, 1.0 ;glfloat lmodel_ambient=0.1,0.1,0.1,1.0;/设置light0,用到上面的参数gllightfv(gl_light0, gl_position, light_position);gllightfv(gl_light0, gl_ambient,light_ambient);gllightfv(gl_light0, gl_diffuse,light_diffuse);gllightfv(gl_light0, gl_specular,lig

7、ht_specular);glfloat mat_ambient = 0.1,0.1,0.1,1.0 ;glfloat mat_diffuse = 0.8,0.8,0.8,1.0 ;glfloat mat_specular = 0.1, 0.1, 0.1, 1.0 ;glmaterialfv(gl_front, gl_ambient, mat_ambient);glmaterialfv(gl_front, gl_diffuse, mat_diffuse);glmaterialfv(gl_front, gl_specular, mat_specular);gllightmodelfv(gl_li

8、ght_model_ambient,lmodel_ambient);glenable(gl_lighting);/设置光照开关,相当于电闸glenable(gl_light0);/设置light0可用,相当于打开灯light0*/readfile函数。用于读取dem文件void readfile(void)/读取dem文件ifstream ifile(dem2.txt);/输入文件.dem2是新的demstring temp;/设置一个字符串tempdouble xllcorner,yllcorner,cellsize,nodata_value;double data;/data用于读入dem

9、值int i,j;ifiletempncols; /从文件中读入的第一个值存到ncols中ifiletempnrows;/从文件中读取下一个值,存到nrows中ifiletempxllcorner;/每次读取一个值,存入对应变量ifiletempyllcorner;ifiletempcellsize;ifiletempnodata_value;for (i=0;inrows;i+)/把所有的高程值存入dem数组中for (j=0;jdata;demij=data;/display函数,用于绘制图形void display(void) glclearcolor(0.0,0.0,1.0,0.0);

10、 /将窗口清为蓝色glclear(gl_color_buffer_bit|gl_depth_buffer_bit); glcolor3f(0,1.0,0); /选绘图时用的颜色(r,g,b)glpushmatrix();/* 记住初始状态:什么都没画 */gltranslatef(-leftx,0,0);/向左平移,即沿x轴负向平移gltranslatef(rightx,0,0);/向右平移,即沿x轴正向平移gltranslatef(0,up,0);/向上平移,即沿y轴正向平移gltranslatef(0,-down,0);/向下平移,即沿y轴负向平移gltranslatef(0,0,bigg

11、er);/放大,即沿z轴正向平移gltranslatef(0,0,-smaller);/缩小,即沿z轴负向平移glrotatef(angle,0,0,1);/键盘交互控制的旋转gltranslatef (-nrows/2*10, -ncols/2*10, -2000.0);drawdem();glpopmatrix();/* 回到初始状态,什么都没画 */glutswapbuffers (); /缓冲区交换。和main函数中设置的双缓冲区相对应。/drawdem函数,用于按照四边形串的方式绘制demvoid drawdem(void)int i,j;glpolygonmode(gl_front

12、_and_back, gl_line);/设置多边形绘图方式void glpolygonmode(glenum face,glenum mode);/face: gl_front_and_back(缺省值)、gl_front、gl_back,选择绘制哪个面。/mode: gl_point、gl_line、gl_fill(缺省值),选择多边形应该是被绘制为d点、线还是填充面。for(i=0;inrows;i=i+1) for(j=0;jncols;j+) glbegin(gl_polygon);/绘制四边形串。/应该是每循环一次设置画一个四边形,所以每个循环都有glbegin和glend glv

13、ertex3f(10*(nrows-i),10*j,demij); glvertex3f(10*(nrows-i)+1),10*j,demi+1j); glvertex3f(10*(nrows- i)+1),10*(j+1),demi+1j+1); glvertex3f(10*(nrows-i),10*(j+1),demij+1);/一个循环绘制四个点。即一个四边形。通过for循环形成四边形串 glend();/myreshape函数。用于当窗口大小发生改变时进行图形重绘void myreshape (glsizei w, glsizei h) glviewport(0,0,w,h);glma

14、trixmode(gl_projection);glloadidentity();gluperspective (100 , ( glfloat ) w /( glfloat ) h ,0,2000 );/透视投影glmatrixmode(gl_modelview);glloadidentity();glulookat(0,0,500,0,0,0,0,1,0);/keyboard函数。用于键盘交互控制dem的旋转和缩放void keyboard(unsigned char key, int x, int y)switch(key)/a键和d键控制图形旋转,不论键盘处于大写或小写状态,按下同一个

15、键的旋转方向应该一致。case a:/按下a键,图形逆时针旋转angle=(angle+4)%360;glutpostredisplay();break;case a:/按下a键,图形逆时针旋转angle=(angle+4)%360;glutpostredisplay();break;case d:/按下d键,图形顺时针旋转angle=(angle-4)%360;glutpostredisplay();break;case d:/按下d键,图形顺时针旋转angle=(angle-4)%360;glutpostredisplay();break;case w:/w键,放大图形bigger=big

16、ger+10;glutpostredisplay();break;case w:bigger=bigger+10;glutpostredisplay();break;case s:/s键,缩小图形smaller=smaller+10;glutpostredisplay();break;case s:smaller=smaller+10;glutpostredisplay();break;/specialkey函数。用于键盘交互,控制图形的平移void specialkey(int key,int x,int y)/键盘控制平移switch(key)case glut_key_left:/键盘左

17、键leftx=leftx+10;glutpostredisplay();break;case glut_key_right:/键盘右键rightx=rightx+10;glutpostredisplay();break;case glut_key_up:/键盘上键up=up+10;glutpostredisplay();break;case glut_key_down:/键盘下键down=down+10;glutpostredisplay();break;debug 及函数分析1. 声明与xxx不兼容:声明和定义的函数名写的不一样2. 一个变量在两个函数中都用到,就要把它写成全局变量。而且不能

18、放在某个函数里面定义,要放在最外面文件一开始include完了以后的地方定义3. lnk2001不确定的外部符号:一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。c的全局常量只有静态连接性能。这不同于c,如果试图在c的多个文件内使用全局变量也会产生lnk2001错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.cpp文件中包含该头文件;另一种方法是使用时给该变量赋以常数。4. 文件的读取。头文件要加入fstream和string5. glutkeyboardfunc普通按键的按键消息。这个函数是告诉窗口系统

19、,哪一个函数将会被调用来处理普通按键消息。普通键是指字母,数字,和其他可以用ascii代码表示的键。函数原型如下:void glutkeyboardfunc(void(*func)(unsigned char key,int x,int y)参数: func: 处理普通按键消息的函数的名称。如果传递null,则表示glut忽略普通按键消息。这个作为glutkeyboardfunc函数参数的函数需要有三个形参。第一个表示按下的键的ascii码,其余两个提供了,当键按下时当前的鼠标位置。鼠标位置是相对于当前客户窗口的左上角而言的。6. glutspecialfunc特殊按键的按键消息。glut提供

20、函数glutspecialfunc以便当有特殊键按下的消息时,你能注册你的函数。函数原型如下:void glutspecialfunc(void (*func)(int key,int x,int y); 参数:func: 处理特殊键按下消息的函数的名称。传递null则表示glut忽略特殊键消息。7. glulookat(gldoble eyex,gldouble eyey,gldouble eyez,gldouble centerx,gldouble centery,gldouble centerz,gldouble upx,gldouble upy,gldouble upz);它选取 eyex,eyey, eyez确定相机的位置,然后centerx, centery,centerz规定往哪里看,看的方向用在那里的一个点的坐标表示,upx,upy,upz是观察者(相机)头顶朝向,用头顶指向的方向向量示。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论