- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
实验六
实验目的与要求:
实现太阳、地球、月球的运动模型。
创建一个球体动画,实现自由落体运动。
实验内容:
通过不断修改旋转角度参数来实现天地运动;
创建一个球体动画,使其在窗口内做自由落体,并在撞击到地面后弹回原来的高度
实验步骤:
相关算法及原理描述:
动画的实现是通过不断修改旋转变换的角度参数来实现的。在实现动画时,需要创建一个循环,在每次调用显示回调函数之前改变角度参数的值,使地球和月球看起来像绕着原子旋转。为了不断地调用显示回调函数,需要利用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)、太阳、地球、月亮运动模型
#includegl/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();
}
文档评论(0)