




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、OpenGL 实验5 动画和交互 刘慧敏 添加简单动画 添加交互 大作业 1 2 3 本节课内容 1 添加简单动画 动画 采用逐帧拍摄对象并连续播放而形成运动的影像技术 关键点:每帧都在变化-逐帧更新 假设某动画一共有n幅画面,则它的工作步骤就是: 显示第1幅画面,然后等待一小段时间,直到下一个1/24秒 显示第2幅画面,然后等待一小段时间,直到下一个1/24秒 显示第n幅画面,然后等待一小段时间,直到下一个1/24秒 结束 如果用C语言伪代码来描述这一过程,就是: for(i=0; in; +i) DrawScene(i);Wait(); 可能存在的绘制问题-画面闪烁 在计算机上的动画与实际
2、的动画有些不同: 实际的动画:先画好了,播放的时候直接拿出来显示就行。 计算机动画:画一张,就拿出来一张,再画下一张,再拿出来。 如果所需要绘制的图形很简单,那么这样也没什么问题。但一旦图形比较复杂, 绘制需要的时间较长,问题就会变得突出。 如果把计算机想象成一个画图比较快的人,假如他直接在屏幕上画图,而图形 比较复杂,则有可能在他只画了某幅图的一半的时候就被观众看到。而后面虽 然他把画补全了,但观众的眼睛却又没有反应过来,还停留在原来那个残缺的 画面上。也就是说,有时候观众看到完整的图象,有时却又只看到残缺的图象, 这样就造成了屏幕的闪烁。 解决方案:双缓冲技术 解决方案:双缓冲技术 glu
3、tInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 还有需要更改的地方每次绘制完成时,需要交换两 个缓冲区,把绘制好的信息用于屏幕显示(否则无论怎 么绘制,还是什么都看不到)。如果使用GLUT工具包, 也可以很轻松的完成这一工作,只要在绘制完成时简单 的调用glutSwapBuffers函数就可以了。 实现连续动画 按理说,绘制动画的代码写成下面这个样子: for(i=0; i= 360) day = 0; myDisplay(); int main(int argc, c
4、har*argv) glutInit( glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(200, 200); glutInitWindowSize(300, 300); glutCreateWindow(月亮,地球和太阳); glutDisplayFunc( glutIdleFunc( glutMainLoop(); return 0; void myDisplay(void) glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_B
5、UFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 400); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -200, 200, 0, 0, 0, 0, 0, 1); glColor3f(1.0f, 0.0f, 0.0f); / 绘制红的太阳 glutSolidSphere(69.6, 20, 20); glColor3f(0.0f, 0.0f, 1.0f); / 绘制蓝色的地球 glRotatef(day
6、 / 360.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(150, 0.0f, 0.0f); glutSolidSphere(15.945, 20, 20); glColor3f(1.0f, 1.0f, 0.0f);/绘制黄色的月亮 glRotatef(day / 30.0*360.0 - day / 360.0*360.0, 0.0f, 0.0f, -1.0f); glTranslatef(38, 0.0f, 0.0f); glutSolidSphere(4.345, 20, 20); glFlush(); glutSwapBuffers(); 示例程
7、序-太阳系动画 第二个动画示例程序: 旋转的正方形 2 添加交互 交互 实现与场景中物体的互动 交互可以实现的方式: 鼠标、 键盘、 传感器(声音,温度等) 1)鼠标响应-glutMouseFunc 例如:设置鼠标点击控制动画播放与否 glutIdleFunc控制动画每帧刷新 glutMouseFunc捕获鼠标事件 void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(myidle); break; ca
8、se GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; 此函数中写动画的运 动函数 此函数在main函数中以 glutMouseFunc(mouse)的 方式调用 void myidle() . 2)键盘响应-glutKeyboardFunc 例如:设置键盘按键控制行星运动 glutKeyboardFunc捕获键盘事件 void keyboard(unsigned char key, int x, int y) switch (key) case f: day = (day + 10) % 360; glutPostRedisplay(); break; case F: day = (day - 10) % 360; glutPostRedisplay(); break; case y: year = (year + 5) % 360; glutPostRedisplay(); break; 此函数在main函数中以 glutKeyboardFunc(keyboard) 的方式调用 若要实现键盘控制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论