首页 opengl实现太阳地球及月亮的运动模型和小球的自由落体运动

opengl实现太阳地球及月亮的运动模型和小球的自由落体运动

举报
开通vip

opengl实现太阳地球及月亮的运动模型和小球的自由落体运动实验六1、实验目的和要求了解且掌握OpenG叶包含的有关三维变换的操作,并且做出模型视图变换、投影变换和视见区变换的实例。2、实验内容1)在OpenG叶绘制太阳、地球和月亮的运动模型。2)在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面(窗口的下边界)后能够弹回原来的高度。3、实验步骤1)相关算法及原理描述①矩阵堆栈在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将三维形体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到变换后的形体顶点的其次坐标矩阵,这样只要求出形体三维变换矩阵,就...

opengl实现太阳地球及月亮的运动模型和小球的自由落体运动
实验六1、实验目的和要求了解且掌握OpenG叶包含的有关三维变换的操作,并且做出模型视图变换、投影变换和视见区变换的实例。2、实验内容1)在OpenG叶绘制太阳、地球和月亮的运动模型。2)在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面(窗口的下边界)后能够弹回原来的高度。3、实验步骤1)相关算法及原理描述①矩阵堆栈在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将三维形体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到变换后的形体顶点的其次坐标矩阵,这样只要求出形体三维变换矩阵,就可以得到变换后的形体。在OpenGL中,对象的变换也是通过矩阵来实现的。在进行矩阵操作前,需要指定当前操作的矩阵对象,可以使用函数glMatrixMode(GLenummode);定义。矩阵堆栈主要用来保存和恢复矩阵的状态,主要用于具有层次结构的模型绘制中,以提高绘图效率。利用函数voidglPushMatrix(void);VoidglPopMatrix(void);实现矩阵堆栈的操作。矩阵堆栈是有深度的,如果超出了堆栈深度或当堆栈为空时试图弹出栈顶矩阵,都会发生错误。可以用下面函数获得堆栈深度的最大值:glGet(GL_MAX_MODELVIEW_STACK_DEPTH);glGet(GL_MAX_PROJECTION_STACK_DEPTH);②模型视图变换模型视图矩阵是一个4*4的矩阵,用于指定场景的视图变换和几何变换。在进行模型视图矩阵操作前,必须调用函数glMatrixMode(GL_MODELVIEW)定变换只能影响模型试图矩阵。主要有以下两种方法。2.1、直接定义矩阵利用函数voidglLoadMartrix{fd}(constTYPE*m);将m所指定的矩阵置为当前矩阵堆栈的栈顶矩阵。.2.2、利用高级矩阵函数平移矩阵函数:voidglTranslate{df}(TYPEx,TYPEy,TYPEz);用当前矩阵乘以平移矩阵。旋转矩阵函数voidglRotate{df}(TYPEangle,TYPEx,TYPWy,TYPEz);缩放矩阵函数voidglScale{df}(TYPEx,TYPEy,TYPEz);如不需要效果积累可调用重置矩阵函数voidglLoadIdentity(void);该函数将单位矩阵置为当前变换矩阵。③投影变换有两种投影方式,不管调用哪种,必须调用glMAtrixMode(GL_PROJECTION)指定当前处理的矩阵是投影变换矩阵。3.1、正投影它的有限观察空间是一个长方体,无论物体距离相机多远,投影后的物体大小尺寸不变。正投影函数有两个:voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebotton,GLdoubletop,GLdoublenear,GLdoublefar);voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublbotton,GLdoubletop);1.3.2、透视投影特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失。透视投影函数也有两个:voidglFrustum(GLdoubleleft,GLdoubleRight,GLdoublebotton,GLdoubletop,GLdoublenear,GLdoublefar);voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);2)程序调试、测试与运行结果分析①太阳、地球和月亮的运动模型■earth,sun②小球的自由落体运动4、附录(1)太阳、地球和月亮的运动模型#includestaticintday=200;voiddisplay(){glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(75,1,1,400000);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0,-200000,200000,0,0,0,0,0,1);glColor3f(1,0,0);//sunglutSolidSphere(69600,20,20);glColor3f(0,0,1);glRotatef(day,0,0,-1);glTranslatef(150000,0,0);//earthglutSolidSphere(15945,20,20);glColor3f(1,1,0);glRotatef(day/30.0*360-day,0,0,-1);glTranslatef(38000,0,0);//moonglutSolidSphere(4345,20,20);glutSwapBuffers();}voidtimer(intp){day++;if(day>360)day=0;glutTimerFunc(50,timer,0);glutPostRedisplay();}intmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE);glutCreateWindow("earth,moon,sun");glutInitWindowSize(400,400);glutDisplayFunc(display);glutTimerFunc(50,timer,0);glutMainLoop();return0;}(2)小球的自由落体运动#include#include#include#include#include#definePI3.1415926doublemove=20.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");//持续时间GLfloatmat_specular[]={220.220,220.0,220.0,220.0};GLfloatmat_shininess[]={70.0};GLfloatlight_position[]={0.0,0.0,0.0,-2.0};//r-lu-df-bGLfloatambientLight口={0.2f,0.2f,0.2f,1.0f};GLfloatdiffuseLight口={0.6f,0.6f,0.6f,1.0f};GLfloatspecular[]={1.0f,1.0f,1.0f,1.0f};glClearC010r(0.3,0.8,0.8,0.0);//bgcglColor3ub(23,17,215);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);glLightfv(GL_LIGHT0,GL_SPECULAR,specular);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);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(0.4,40,50);glutSwapBuffers();}voiddisplay(void){printf("Display()");glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glLoadIdentity();glTranslatef(0,move,0.0);glutSolidSphere(0.4,40,50);glutSwapBuffers();}voidMoveSphereUp(){end=clock();duration=(double)(end-start-16.0)/CLOCKS_PER_SEC;length=5*(timeSpan-duration)*(timeSpan-duration);move=20-length;if(move>19.932){move=20;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=20-length;if(move<-20){timeSpan=duration;//记下下降所经历的时间move=-20;start=clock();down=0;//向上运动}display();glLoadIdentity();)voidTimerFunc2(intvalue){if(i==0){//leftGLfloatlight_position[]={2.0,0.0,0.0,0.0};〃r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==1){//left-upGLfloatlight_position[]={2.0,2.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==2){//upGLfloatlight_position[]={0.0,2.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==3){//up-rightGLfloatlight_position[]={-2.0,2.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==4){//rightGLfloatlight_position[]={-2.0,0.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==5){//right-downGLfloatlight_position[]={-2.0,-2.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}if(i==6){//downGLfloatlight_position[]={0.0,-2.0,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);)if(i==7){//down-leftGLfloatlight_position□={2.0,20,0.0,0.0};//r-lu-df-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);}i=(++i)%8;printf("%i",i);glutTimerFunc(60,TimerFunc2,1);}voidTimerFunc1(intvalue){if(down==1){MoveSphereDown();}if(down==0){MoveSphereUp();}glutTimerFunc(10,TimerFunc1,0);}intmain(intargc,char*argv口){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(400,740);glutInitWindowPosition(300,20);glutCreateWindow("小球自由落体运动");init();glutDisplayFunc(initDisplay);glutReshapeFunc(reshape);glutTimerFunc(1400,TimerFunc1,0);//毫秒glutTimerFunc(400,TimerFunc2,1);//毫秒glutMainLoop();return0;}
本文档为【opengl实现太阳地球及月亮的运动模型和小球的自由落体运动】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_597436
暂无简介~
格式:doc
大小:209KB
软件:Word
页数:15
分类:
上传时间:2020-05-18
浏览量:1