计算机图形学opengl动画报告_第1页
计算机图形学opengl动画报告_第2页
计算机图形学opengl动画报告_第3页
计算机图形学opengl动画报告_第4页
计算机图形学opengl动画报告_第5页
全文预览已结束

下载本文档

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

文档简介

1、东南大学计算机图形学实验名: 学号:08011322姓评定成绩: 审阅教师:一. 实验目的与内容1、学习用 OpenGL 制作简单的动画2、学习使缓冲技术绘图3、让画出的钟表图具有动画效果二. 基本实验原理这次课程作业,做一个钟表出来。为了使这个钟表可以真正的“动”起来,实时显示时间,不仅需要画出钟表,还需要运用到 OpenGL 中的双缓冲。当 A 缓冲区显示时,B缓冲区正在绘制图形。当B 绘制完毕时,就交换缓冲区,此时B 显示,而 A 就进行绘画。从而实现平滑地显示每一帧地显示,观众就看不到没有完成的画面。计算机的在交换缓冲区的时候,速度很快,所以一般用户是觉察不到的。为了能让的程序能够使缓

2、冲需要改变 main 函数中 glutInitDisplayMode()函数的参数,把 GLUT_SINGLE 改为 GLUT_DOUBLE,表示以前是单缓冲(single)。现在要使缓冲(double)了,在OpenGL 中,并没有提供交换缓冲这个函数,因为有些硬件不支持这个特性。对于不同的操作系统,有不同的方法。使用的 GLUT 辅助库,帮解决了这个问题,只用调用 glutSwapBuffers();函数所以再把 Draw 函数中的 glFlush()函数换成glutSwapBuffers()就可以了。这个时候编译运行,会同样的出现钟表,画面并没有动起来,因为 Draw 函数只调用了一次。

3、在 main 函数中使用 glutIdleFunc(&Update)函数,可以设置一个回调函数 Update。设置了以后,Update 便会在循环中不断地被调用,直到有窗口消息产生。这里暂时不管窗口消息是什么,只需要知道 Update 正不断被调用。Update 函数:void Update()time_t structtime (rawtime;tm * timeinfo; &rawtime );timeinfo = localtime ( &rawtime ); h=timeinfo-tm_hour;m=timeinfo-tm_min; s=timeinfo-tm_sec;gluttRed

4、isplay();gluttRedisplay 函数,就和它的名字一样,它发送了一个消息给 glut 窗口,告诉它重新绘制一下画面,结果就是 Draw 函数会被调用。这时再编译运行一次,发现同样可以显示画面。其实这个时候,画面是在不断地更新的,只是感觉不出来而已。需要注意的是,与指针读数相关的的h、m、s 三个参数必须设置为全局变量,让其在其他函数中也可以被使用。三. 方案实现与测试程序完整代码如下:#include #include #include #include#defin 3.1415926float h,m,s; void Draw()i;float R,TR,PR,h_Angle

5、,m_Angle,s_Angle,count,h_Length,m_Length,s_Length; R=0.5;TR=R-0.04; PR=R-0.08;glClear(GL_COLOR_BUFFER_BIT); glLineWidth(5); glBegin(GL_LINE_LOOP);for (i=0; i100; i+)glVertex2f(R*cos(2*PI/100*i),R*sin(2*PI/100*i);glEnd();glLineWidth(2);/画表盘for (i=0; i12; i+)glBegin(GL_LINES);glVertex2f(PR*sin(2*PI/12

6、*i),PR*cos(2*PI/12*i); glVertex2f(R*sin(2*PI/12*i),R*cos(2*PI/12*i);glEnd();glLineWidth(1);for (i=0; i60; i+)glBegin(GL_LINES);glVertex2f(TR*sin(2*PI/60*i),TR*cos(2*PI/60*i); glVertex2f(R*sin(2*PI/60*i),R*cos(2*PI/60*i);glEnd();glLineWidth(0.5);/画长、短刻度h_Length=0.2; m_Length=0.3; s_Length=0.4; count=

7、60; s_Angle=s/count; count*=60; m_Angle=(m*60+s)/count; count*=12;h_Angle=(h*60*60+m*60+s)/count; glLineWidth(1); glBegin(GL_LINES);glVertex2f(0.0f,0.0f);/计算每一时刻下时、分、秒针的角度glVertex2f(s_Length*sin(2*PI*s_Angle),s_Length*cos(2*PI*s_Angle);glEnd();glLineWidth(5); glBegin(GL_LINES);glVertex2f(0.0f,0.0f);

8、/画秒针glVertex2f(h_Length*sin(2*PI*h_Angle),h_Length*cos(2*PI*h_Angle);glEnd();glLineWidth(3); glBegin(GL_LINES);glVertex2f(0.0f,0.0f);/画分针glVertex2f(m_Length*sin(2*PI*m_Angle),m_Length*cos(2*PI*m_Angle);glEnd();glLineWidth(1);/画时针glBegin(GL_POLYGON); for (i=0; itm_hour; m=timeinfo-tm_min;s=timeinfo-tm_sec;gluttRedisplay();/不停地本地时间main(argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);glutInitWindowition(100, 10

温馨提示

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

评论

0/150

提交评论