opengl实现--太阳、地球和月亮的运动模型及小球的自由落体运动.doc_第1页
opengl实现--太阳、地球和月亮的运动模型及小球的自由落体运动.doc_第2页
opengl实现--太阳、地球和月亮的运动模型及小球的自由落体运动.doc_第3页
opengl实现--太阳、地球和月亮的运动模型及小球的自由落体运动.doc_第4页
opengl实现--太阳、地球和月亮的运动模型及小球的自由落体运动.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

实验六1、 实验目的和要求了解且掌握OpenGL中包含的有关三维变换的操作,并且做出模型视图变换、投影变换和视见区变换的实例。2、 实验内容1)在OpenGL中绘制太阳、地球和月亮的运动模型。2)在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面(窗口的下边界)后能够弹回原来的高度。3、 实验步骤1) 相关算法及原理描述 矩阵堆栈在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将三维形体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到变换后的形体顶点的其次坐标矩阵,这样只要求出形体三维变换矩阵,就可以得到变换后的形体。在OpenGL中,对象的变换也是通过矩阵来实现的。在进行矩阵操作前,需要指定当前操作的矩阵对象,可以使用函数glMatrixMode(GLenum mode); 定义。矩阵堆栈主要用来保存和恢复矩阵的状态,主要用于具有层次结构的模型绘制中,以提高绘图效率。利用函数void glPushMatrix(void);Void glPopMatrix(void); 实现矩阵堆栈的操作。矩阵堆栈是有深度的,如果超出了堆栈深度或当堆栈为空时试图弹出栈顶矩阵,都会发生错误。可以用下面函数获得堆栈深度的最大值: glGet(GL_MAX_MODELVIEW_STACK_DEPTH); glGet(GL_MAX_PROJECTION_STACK_DEPTH); 模型视图变换模型视图矩阵是一个4*4的矩阵,用于指定场景的视图变换和几何变换。在进行模型视图矩阵操作前,必须调用函数glMatrixMode(GL_MODELVIEW)指定变换只能影响模型试图矩阵。主要有以下两种方法。121、直接定义矩阵利用函数 void glLoadMartrixfd(const TYPE *m);将m所指定的矩阵置为当前矩阵堆栈的栈顶矩阵。 122、利用高级矩阵函数 平移矩阵函数:void glTranslatedf(TYPE x,TYPE y,TYPE z); 用当前矩阵乘以平移矩阵。 旋转矩阵函数 void glRotatedf(TYPE angle,TYPE x,TYPW y,TYPE z); 缩放矩阵函数 void glScaledf(TYPE x,TYPE y,TYPE z); 如不需要效果积累可调用重置矩阵函数void glLoadIdentity(void); 该函数将单位矩阵置为当前变换矩阵。 投影变换有两种投影方式,不管调用哪种,必须调用glMAtrixMode(GL_PROJECTION);指定当前处理的矩阵是投影变换矩阵。131、正投影它的有限观察空间是一个长方体,无论物体距离相机多远,投影后的物体大小尺寸不变。正投影函数有两个:void glOrtho(GLdouble left,GLdouble right,GLdouble botton,GLdouble top,GLdouble near,GLdouble far); void gluOrtho2D(GLdouble left,GLdouble right,GLdoubl botton,GLdouble top); 1.3.2、透视投影特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失。透视投影函数也有两个: void glFrustum(GLdouble left,GLdouble Right,GLdouble botton,GLdouble top,GLdouble near,GLdouble far); void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);2) 程序调试、测试与运行结果分析 太阳、地球和月亮的运动模型 小球的自由落体运动4、 附录(1)太阳、地球和月亮的运动模型#include static int day = 200;void display() 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);/sun glutSolidSphere(69600,20,20); glColor3f(0,0,1); glRotatef(day,0,0,-1); glTranslatef(150000,0,0);/earth glutSolidSphere(15945,20,20); glColor3f(1,1,0); glRotatef(day/30.0*360 - day, 0,0,-1); glTranslatef(38000,0,0);/moon glutSolidSphere(4345,20,20); glutSwapBuffers();void timer(int p) day +; if(day 360)day = 0; glutTimerFunc(50,timer,0); glutPostRedisplay();int main(int argc,char *argv) glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutCreateWindow(earth,moon,sun); glutInitWindowSize(400,400); glutDisplayFunc(display); glutTimerFunc(50,timer,0); glutMainLoop(); return 0;(2)小球的自由落体运动#include#include#include#include#include#define PI 3.1415926double move=20.0;int i=0;int down=1;int count=1;double timeSpan=0;/下降到底所需时间double movey=0.0;double duration=0.0;/持续时间double length=0.0;clock_t start,end;void init(void)printf( init);GLfloat mat_specular=220.220,220.0,220.0,220.0;GLfloat mat_shininess=70.0;GLfloat light_position=0.0, 0.0, 0.0, -2.0; /r-l u-d f-bGLfloat ambientLight = 0.2f, 0.2f, 0.2f, 1.0f ;GLfloat diffuseLight = 0.6f, 0.6f, 0.6f, 1.0f ;GLfloat specular = 1.0f, 1.0f, 1.0f, 1.0f;glClearColor(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); /启用深度测试void reshape(int w,int h)printf( reshape); glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(w19.932) move=20;down=1;printf(%i,down);start=clock(); display(); glLoadIdentity();void MoveSphereDown()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();void TimerFunc2(int value)if(i=0) /leftGLfloat light_position=2.0,0.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=1) /left-upGLfloat light_position=2.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position); if(i=2) /upGLfloat light_position=0.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=3) /up-rightGLfloat light_position=-2.0,2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=4) /rightGLfloat light_position=-2.0,0.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=5) /right-downGLfloat light_position=-2.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=6) /downGLfloat light_position=0.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);if(i=7) /down-leftGLfloat light_position=2.0,-2.0,0.0,0.0; /r-l u-d f-bglLightfv(GL_LIGHT0,GL_POSITION,light_position);i=(+i)%8;printf(%i,i);glutTimerFunc(60,TimerFunc2,1);void TimerFunc1(int value)if(down=1)MoveSphereDown();if(down=0)MoveSphereUp();glutTimerFunc(10,TimerFunc1,0);int main(int argc,char *argv)glutInit(&argc,argv);glutInitDisplay

温馨提示

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

评论

0/150

提交评论