版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验六实验目的与要求:实现太阳、地球、月球的运动模型。创建一个球体动画,实现自由落体运动。实验内容:通过不断修改旋转角度参数来实现天地运动;创建一个球体动画,使其在窗口内做自由落体,并在撞击到地面后弹回原来的高度实验步骤:相关算法及原理描述:动画的实现是通过不断修改旋转变换的角度参数来实现的。在实现动画时,需要创建一个循环,在每次调用显示回调函数之前改变角度参数的值,使地球和月球看起来像绕着原子旋转。为了不断地调用显示回调函数,需要利用GLUT库中的函数:voidTimerFunc(unsignedintmsecs,(*func)(intvalue),intvalue);指定一个定时器回调函数,即经过msecs毫秒后由GLUT调用指定的函数,并将value值传递给它。被定时器调用的函数原型为:voidTimerFunction(intvalue);但是,这个函数与其他的回调函数不一样,该函数只能调用一次。为了实现连续的动画,必须在定时器函数中再次设置定时器回调函数。为了使动画效果更好,需要使用双缓存技术,以及深度测试函数。深度测试即当地球或月球运动到太阳的背面时,由于地球和月球是后绘制的,所以无法被太阳挡住,解决办法是启用深度测试。深度测试是一种移除被挡住表面的有效技术,它的过程是:绘制一个像素时,会给它分配一个值(称为z值),这个值表示它与观察者的距离。然后,如果需要在同一位置上绘制另一个像素,将比较新像素和已经保存在该位置的像素的z值。如果新像素的z值小,即它离观察者更近因而在原来那个像素的前面,原来的像素就会被新像素挡住。这一操作在内部由深度缓冲区完成。为了启用深度测试,只要调用函数:glEnable(GL_DEPTH_TEST);打开深度测试功能。要使用深度测试,必须在创建窗口时指定其具有深度缓冲区,代码为:glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);并且,为了使深度缓冲区正常完成深度测试功能,在每次渲染场景时,必须使用函数:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);消除深度缓冲区。程序设计:主要用到的新函数glEnable(GL_DEPTH_TEST);启用深度测试glutSolidSphere(50.0f,20,20);画球体voidTimerFunc(intvalue)指定定时器回调函数测试结果:(1)、太阳、地球、月亮运动模型:(2)、小球自由落体实验总结:通过此次的实验了解怎么在opengl中实现动画和深度测试。此次的实验有一定的难度。特别是小球自由落体运动的动画,开始的时候基本没想法。通过查看资料,才对其有一点理解,但还不是很懂,只是在查阅的资料的基础上做了一些修改,并没有太大的改动。但是此次的实验,完全可以和后面两章的内容结合,使用光照模型,绘制出具有真实感的图形。附录:(1)、太阳、地球、月亮运动模型#include<gl/glut.h>floatfElect1=2.0f;//地球绕太阳的旋转角度floatfElect2=24.0f;//月球绕地球的旋转角度voidInitial(){glEnable(GL_DEPTH_TEST);//启用深度测试glClearColor(0.0f,0.0f,0.0f,0.8f);//背景为黑色}voidChangeSize(intw,inth){GLfloatfAspect;if(0==h)h=1;glViewport(0,0,w,h);//设置视区尺寸glMatrixMode(GL_PROJECTION);//指定当前操作投影矩阵堆栈glLoadIdentity();//重置投影矩阵fAspect=(float)w/(float)h;//计算视区的宽高比gluPerspective(45.0f,fAspect,1.0f,1000.0f);//指定透视投影的观察空间glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidDisplay(void){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清除颜色和深度缓冲区glMatrixMode(GL_MODELVIEW);//指定当前操作模型视图矩阵堆栈glLoadIdentity();//重置模型视图矩阵glTranslatef(0.0f,0.0f,-500.0f);//将图形沿z轴负向移动//画太阳 glColor3f(1.0f,0.0f,0.0f);glutSolidSphere(50.0f,20,20);//画地球glColor3f(0.0f,0.0f,1.0f);glRotatef(23.27,0.0,0.0,1.0);//地球与太阳的黄赤交角glRotatef(fElect1,0.0f,1.0f,0.0f);glTranslatef(200.0f,0.0f,0.0f);glutSolidSphere(20.0f,20,20);//画月球glPopMatrix();glPopMatrix();glRotatef(6.0f,1.0f,1.0f,1.0f);glRotatef(fElect2,0.0f,1.0f,0.0f);glColor3f(1.0f,1.0f,0.0f);glTranslatef(30.0f,0.0f,0.0f);glutSolidSphere(5.0f,20,20);glLoadIdentity();fElect1+=2.0f;//增加旋转步长,产生动画效果if(360.0f<fElect1)fElect1=2.0f;fElect2+=24.0f;if(360.0f<fElect2)fElect2=24.0f;glFlush();glutSwapBuffers();}voidTimerFunc(intvalue){glutPostRedisplay();glutTimerFunc(100,TimerFunc,1);//100毫秒后调用定时器回调函数}intmain(intargc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);//窗口使用RGB颜色,双缓存和深度缓存 glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow("天体运动动画");glutReshapeFunc(ChangeSize);glutDisplayFunc(Display);glutTimerFunc(500,TimerFunc,1);//指定定时器回调函数Initial();glutMainLoop();return0;}(2)、小球自由落体#include<GL/glut.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<math.h>#definePI3.1415926doublemove=10.0;inti=0;intdown=1;intcount=1;doubletimeSpan=0; //下降到底所需时间doublemovey=0.0;doubleduration=0.0; //持续时间doublelength=0.0;clock_tstart,end;voidinit(void){ printf("init"); glClearColor(0.0,1.0,0.0,0.0); glColor3ub(23,17,215); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST);//启用深度测试}voidreshape(intw,inth){ printf("reshape");glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h) glOrtho(-12,12,-12*(GLfloat)(h)/(GLfloat)(w),12*(GLfloat)(h)/(GLfloat)(w),-1.0,1.0);elseglOrtho(-12*(GLfloat)(w)/(GLfloat)(h),12*(GLfloat)(w)/(GLfloat)(h),-12,12,-1.0,1.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}voidinitDisplay(void){ printf("initDisplay()"); down=1; //向下运动 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0,20.0,0.0); glutSolidSphere(1.0,40,40); glutSwapBuffers();}voiddisplay(void){ printf("Display()"); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,move,0.0); glutSolidSphere(1.0,40,40); glutSwapBuffers();}voidMoveSphereUp(){ end=clock(); duration=(double)(end-start-16.0)/CLOCKS_PER_SEC; length=5*(timeSpan-duration)*(timeSpan-duration);move=20-length; if(move>9.932){ move=10; down=1; printf("%i",down); start=clock(); }display();glLoadIdentity(); }voidMoveSphereDown(){ if(count==1){ start=clock(); count=0; } end=clock(); duration=(double)(end-start)/CLOCKS_PER_SEC; length=5*duration*duration;move=10-length; if(move<-10){ timeSpan=duration;//记下下降所经历的时间 move=-10; start=clock(); down=0;//向上运动 }display();glLoadIdentity();}voidTimerFunc2(intvalue){ if(i==0){//left GLfloatlight_position[]={2.0,0.0,0.0,0.0}; } if(i==1){//left-up GLfloatlight_position[]={2.0,2.0,0.0,0.0}; } if(i==2){//up GLfloatlight_position[]={0.0,2.0,0.0,0.0}; } if(i==3){//up-right GLfloatlight_position[]={-2.0,2.0,0.0,0.0}; } if(i==4){//right GLfloatlight_position[]={-2.0,0.0,0.0,0.0}; } if(i==5){//right-down GLfloatlight_position[]={-2.0,-2.0,0.0,0.0}; } if(i==6){//down GLfloatlight_positi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五版游戏版权采购合同示范文本3篇
- 湘潭大学《体育基础》2023-2024学年第一学期期末试卷
- 2024年版经营权作抵押借款协议样例版B版
- 二零二五版户外广告资源代理合作框架协议3篇
- 2024消防设备研发与制造合同范本3篇
- 二零二五年度艺术品收藏交易合同3篇
- 2025年度智慧养老服务平台建设与运营合同3篇
- 桐城师范高等专科学校《表演基础》2023-2024学年第一学期期末试卷
- 二零二五版板房租赁合同含物业管理及保洁服务3篇
- 四川文轩职业学院《机械工程材料B》2023-2024学年第一学期期末试卷
- 上海纽约大学自主招生面试试题综合素质答案技巧
- 办公家具项目实施方案、供货方案
- 2022年物流服务师职业技能竞赛理论题库(含答案)
- 危化品安全操作规程
- 连锁遗传和遗传作图
- DB63∕T 1885-2020 青海省城镇老旧小区综合改造技术规程
- 高边坡施工危险源辨识及分析
- 中海地产设计管理程序
- 简谱视唱15942
- 《城镇燃气设施运行、维护和抢修安全技术规程》(CJJ51-2006)
- 项目付款审核流程(visio流程图)
评论
0/150
提交评论