您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > OpenGl实验报告
计算机图形学综合实验报告烟台大学计算机学院软件工程专业班级:计103-3学号:201058503334姓名:公茂华指导教师:孔繁茹完成日期:2012.11.10综合试验:太阳系模型一、实验目的与要求1、学习和掌握OpenGL的使用2、掌握矩阵堆栈的实现方法3、根据自己的创意实现实验内容,进一步掌握和理解OpenGL的使用二、实验内容1、请编写地球围绕太阳自动旋转的方式2、请再加上一个月亮,并围绕地球旋转,并添加轨道3、实现用户通过键盘或鼠标加入或减少行星和卫星三、实验结果1、开始运行2、增加地球和月亮(按键L或l)或其他任意行星及其若干卫星3、按照提示用鼠标和键盘增加或减少行星和卫星转换视角:4、异常提示:要将Color.txt文件放到当前文件夹下四、体会通过本次试验的实践,使我更加了解和初步掌握了OpenGL的用法,对使用OpenGl绘制球体等图形有了充分认识,并对平移矩阵堆栈和旋转矩阵堆栈的使用有了初步的掌握。虽然以前没有接触过OpenGl,但是通过学习计算机图形学这门课程的知识,以及通过多次上机实验,已使我对OpenGL有了一定了解,不过具体使用和其它方面还需要进一步理解和学习。最后,感谢老师的悉心指导。五、源程序注:红色注释为新加#includewindows.h#includegl/glut.h#includestdlib.h#includestdio.h#includemath.hstaticfloatfE=0.0f;//绕太阳或行星旋转的角度staticinti=0,j=0,m;//for循环计数staticGLintx=7,y=3;//转换视角,以太阳为中心staticinta[8];//计数第几颗行星的卫星的数量staticboollag=false;//键盘L(l)增加行星的标志,true为增加intk[8][3];//读取文件数据FILE*fp;voidInitial(){glEnable(GL_DEPTH_TEST);//启用深度测试glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色}voidChange(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);//设置视区尺寸glMatrixMode(GL_PROJECTION);//指定当前操作投影矩阵堆栈glLoadIdentity();//重置投影矩阵GLfloatfAspect;fAspect=(float)w/(float)h;gluPerspective(45,fAspect,1.0,600.0);//设置透视投影矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidSatellite()//增加卫星{for(intn=0;na[i];n++){glPushMatrix();glRotatef(30.0f+6*n,0.0f,0.0f,1.0f);//绕z轴旋转30度glRotatef(fE*10*(3*n+1),0.0f,1.0f,0.0f);//公转速度fE*10*(3*n+1)glTranslated(-5.0f*m,1.0f,0.0f);glColor3f(256.0f,256.0f,0.0f);glutWireSphere(1.0f,20,20);//卫星glColor3f(0.0f,0.0f,0.0f);glPopMatrix();}}voidPlanet()//增加行星{if(lag==true)//键盘L(l)增加行星i=j-1;elsei=0;for(;ij;i++){if(i5){if(i==3)m=1.9;//模拟火星elsem=i+1;}elsem=9-i;glPushMatrix();//保存当前的模型视图矩阵glColor3f(0,0,9);glutWireTorus(20.0f*(i+1),0,100,1);//轨道glRotatef(fE*(9-i),0.0f,1.0f,0.0f);//绕y轴旋转一定的角度glTranslated(20.0f*(i+1),0.0f,0.0f);//平移一段距离glColor3f(k[i][0],k[i][1],k[i][2]);glutWireSphere(2.0f*m,20,20);//行星glColor3f(0.0f,0.0f,0.0f);Satellite();glPopMatrix();}}voidDisplay(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将缓存清除为预先的设置值glMatrixMode(GL_MODELVIEW);//指定当前矩阵glLoadIdentity();//重置视图矩阵glTranslated(0.0f,0.0f,-300.0f);//将图形沿z轴负方向移动glRotatef(60.0f,x,y,0);glColor3f(1.0f,0.0f,0.0f);glutWireSphere(16.0f,20,20);//太阳半径glColor3f(0.0f,0.0f,0.0f);Planet();fE+=1.0f;//增加旋转步长if(fE360.0f)fE=1.0f;glutSwapBuffers();}voidTimer(intvalue){glutPostRedisplay();glutTimerFunc(100,Timer,1);//100毫秒后调用回调函数}voidMouseMove(GLintxMouse,GLintyMouse)//以鼠标移动,变换视角{x=xMouse;y=yMouse;}voidMousePlot(GLintbutton,GLintaction,GLintxMouse,GLintyMouse){if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)//增加行星{//if(lag==true)//取消键盘L(l)增加的行星,取消的部分//{//lag=false;//a[j-1]=0;//j=-1;//}if(j8&&lag==false)//最大数量限制{a[j]=0;j++;}}if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)//减少行星{if(lag==true)//取消键盘L(l)增加的行星{lag=false;a[j-1]=0;j=0;}if(j0)//最少数量限制{j--;a[j]=0;}}}voidKeyboard(unsignedcharkey,intx,inty){switch(key){case'q'://增加卫星if(a[0]1)//最大限制a[0]++;break;case'Q'://减少卫星if(a[0]0)//最小限制a[0]--;break;case'w':if(a[1]2)a[1]++;break;case'W':if(a[1]0)a[1]--;break;case'e':if(a[2]5)a[2]++;break;case'E':if(a[2]0)a[2]--;break;case'r':if(a[3]7)a[3]++;break;case'R':if(a[3]0)a[3]--;break;case'a':if(a[4]8)a[4]++;break;case'A':if(a[4]0)a[4]--;break;case's':if(a[5]6)a[5]++;break;case'S':if(a[5]0)a[5]--;break;case'd':if(a[6]4)a[6]++;break;case'D':if(a[6]0)a[6]--;break;case'f':if(a[7]3)a[7]++;break;case'F':if(a[7]0)a[7]--;break;case'l'://L(l)键case'L':lag=true;printf(1、水星2、金星3、地球4、火星5、木星6、土星7、天王星8、海王星\n);printf(请输入行星代号:);scanf(%d,&j);if(j1||j8)exit(0);printf(请输入卫星数量(不小于0,不大于12):);scanf(%d,&a[j-1]);if(a[j-1]0||a[j-1]12)//控制卫星数量exit(0);printf(转换视角时,按下鼠标不动!\n);break;case27://退出ESCexit(0);break;default:break;}}intmain(intargc,char*argv[]){printf(太阳系模型按键操作:\n\t1、鼠标左键增加行星数量,右键减少行星数量;\n\t);printf(2、键盘q、w、e、r、a、s、d、f依次增加行星的卫星;\n\t);printf(3、键盘Q、W、E、R、A、S、D、F依次减少行星的卫星;\n\t);printf(4、键盘L(l)可以增加任意一个指定行星及其若干卫星;\n\t);printf(5、鼠标右键取消第4步操作!\n\t);printf(转换视角时,按下鼠标左键移动!\n);Sleep(2000);if(NULL==(fp=fopen(Color.txt,r)))//读取颜色信息{printf(filenotopenorfilenotexist!\n);Sleep(1000);exit(0);}for(intq=0;q8;q++)for(intii=0;ii3;ii++)fscanf(fp,%d,&k[q][ii]);//fp文件指针fclose(fp);glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(1000,700);glutInitWindowPosition(10,10);glutCreateWindow(太阳系简单模型);glutReshapeFunc(Change);glutDisplayFunc(Display);glutKeyboardFunc(Keyboard);glutMouseFunc(MousePlot);glutMotionFunc(MouseMove);glutTimerFunc(500,Timer,1);//制定定时器回调函数Initial();glutMainLoop();return0;}
本文标题:OpenGl实验报告
链接地址:https://www.777doc.com/doc-5754429 .html