太阳、月球、地球模型.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

祝星 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档