资源描述:
《opengl实现--太阳、地球和月亮的运动模型与小球的自由落体运动》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、word资料下载可编辑实验六1、实验目的和要求了解且掌握OpenGL中包含的有关三维变换的操作,并且做出模型视图变换、投影变换和视见区变换的实例。2、实验内容1)在OpenGL中绘制太阳、地球和月亮的运动模型。2)在OpenGL中创建一个球体动画,使球体在窗口内做自由落体运动,并在撞击地面(窗口的下边界)后能够弹回原来的高度。3、实验步骤1)相关算法及原理描述①矩阵堆栈在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将三维形体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到变换后的形体顶点的其次坐标矩阵,这样只要求出形体三维变换矩阵,就可以得到变换后的形体。在OpenGL中,对象的变换
2、也是通过矩阵来实现的。在进行矩阵操作前,需要指定当前操作的矩阵对象,可以使用函数glMatrixMode(GLenummode);定义。矩阵堆栈主要用来保存和恢复矩阵的状态,主要用于具有层次结构的模型绘制中,以提高绘图效率。利用函数voidglPushMatrix(void);VoidglPopMatrix(void);实现矩阵堆栈的操作。矩阵堆栈是有深度的,如果超出了堆栈深度或当堆栈为空时试图弹出栈顶矩阵,都会发生错误。可以用下面函数获得堆栈深度的最大值:glGet(GL_MAX_MODELVIEW_STACK_DEPTH);glGet(GL_MAX_PROJECTION_STACK_D
3、EPTH);②模型视图变换模型视图矩阵是一个4*4的矩阵,用于指定场景的视图变换和几何变换。在进行模型视图矩阵操作前,必须调用函数glMatrixMode(GL_MODELVIEW)指定变换只能影响模型试图矩阵。主要有以下两种方法。专业技术资料word资料下载可编辑1.2.1、直接定义矩阵利用函数voidglLoadMartrix{fd}(constTYPE*m);将m所指定的矩阵置为当前矩阵堆栈的栈顶矩阵。1.2.2、利用高级矩阵函数平移矩阵函数:voidglTranslate{df}(TYPEx,TYPEy,TYPEz);用当前矩阵乘以平移矩阵。旋转矩阵函数voidglRotate{d
4、f}(TYPEangle,TYPEx,TYPWy,TYPEz);缩放矩阵函数voidglScale{df}(TYPEx,TYPEy,TYPEz);如不需要效果积累可调用重置矩阵函数voidglLoadIdentity(void);该函数将单位矩阵置为当前变换矩阵。①投影变换有两种投影方式,不管调用哪种,必须调用glMAtrixMode(GL_PROJECTION);指定当前处理的矩阵是投影变换矩阵。1.3.1、正投影它的有限观察空间是一个长方体,无论物体距离相机多远,投影后的物体大小尺寸不变。正投影函数有两个:voidglOrtho(GLdoubleleft,GLdoubleright,G
5、Ldoublebotton,GLdoubletop,GLdoublenear,GLdoublefar);voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublbotton,GLdoubletop);1.3.2、透视投影特点是距离视点近的物体大,距离视点远的物体小,远到极点即为消失。透视投影函数也有两个:voidglFrustum(GLdoubleleft,GLdoubleRight,GLdoublebotton,专业技术资料word资料下载可编辑GLdoubletop,GLdoublenear,GLdoublefar);voidgluPerspe
6、ctive(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);1)程序调试、测试与运行结果分析①太阳、地球和月亮的运动模型专业技术资料word资料下载可编辑①小球的自由落体运动专业技术资料word资料下载可编辑专业技术资料word资料下载可编辑专业技术资料word资料下载可编辑1、附录(1)太阳、地球和月亮的运动模型#includestaticintday=200;voiddisplay(){glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT
7、GL_DEP
8、TH_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(