Lighthouse3d.com >> GLUT Tutorial >> Basics >> Animation

前面章节我们已经创建了一个白色三角形的窗体.还没到高潮,现在开始感受OpenGL动画的乐趣.我们会让三角形旋转.

首先我们要告知GLUT应用程序当处于空闲时,渲染函数要被调用.这样可促使GLUT保持调用渲染函数来启用动画效果.GLUT提供一个函数glutIdleFunc来让你注册一个回调函数用于绑定应用程序空闲时事件.

void glutIdleFunc(void (*func)(void));

func – 空闲事件触发的函数

在我们之前的例子中,当应用程序空闲时我们想要调用之前定义的实体渲染函数: renderScene. main函数的代码如下:

  1. int main(int argc, char **argv) {
  2.  
  3. // init GLUT and create window
  4. glutInit(&argc, argv);
  5. glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  6. glutInitWindowPosition(,);
  7. glutInitWindowSize(,);
  8. glutCreateWindow("Lighthouse3D- GLUT Tutorial");
  9.  
  10. // register callbacks
  11. glutDisplayFunc(renderScene);
  12. glutReshapeFunc(changeSize);
  13.  
  14. // here is the idle func registration
  15. glutIdleFunc(renderScene);
  16.  
  17. // enter GLUT event processing cycle
  18. glutMainLoop();
  19.  
  20. return ;
  21. }

然后再来讨论渲染函数的细节.先声明一个浮点型值的角变量,初始值为0.0.接着添加必要的实现代码到renderScene函数.

  1. float angle = 0.0f;
  2.  
  3. void renderScene(void) {
  4.  
  5. // Clear Color and Depth Buffers
  6. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  7.  
  8. // Reset transformations
  9. glLoadIdentity();
  10. // Set the camera
  11. gluLookAt( 0.0f, 0.0f, 10.0f,
  12. 0.0f, 0.0f, 0.0f,
  13. 0.0f, 1.0f, 0.0f);
  14.  
  15. glRotatef(angle, 0.0f, 1.0f, 0.0f);
  16.  
  17. glBegin(GL_TRIANGLES);
  18. glVertex3f(-2.0f,-2.0f, 0.0f);
  19. glVertex3f( 2.0f, 0.0f, 0.0);
  20. glVertex3f( 0.0f, 2.0f, 0.0);
  21. glEnd();
  22.  
  23. angle+=0.1f;
  24.  
  25. glutSwapBuffers();
  26. }

注意此处需要用到双缓冲

你回忆一下,我们之前在main函数设置双缓冲模式作为显示模式.该特征提供两种显示缓冲.当前正在显示的是前台缓冲,另外的是后台缓冲.后台缓冲在后台按设定绘图.当我们发送切换缓冲的绘制命令时(例如当驱动完成时,前后缓冲会切换),然后下一帧会取代并渲染到屏幕.

glutSwapBuffers函数促发前后缓冲的切换,就是把后台绘制好的缓冲图像绘制到屏幕.原型如下:

void glutSwapBuffers();

  1. #ifdef __APPLE__
  2. #include <GLUT/glut.h>
  3. #else
  4. #include <GL/glut.h>
  5. #endif
  6.  
  7. void changeSize(int w, int h) {
  8.  
  9. // Prevent a divide by zero, when window is too short
  10. // (you cant make a window of zero width).
  11. if (h == )
  12. h = ;
  13.  
  14. float ratio = w * 1.0 / h;
  15.  
  16. // Use the Projection Matrix
  17. glMatrixMode(GL_PROJECTION);
  18.  
  19. // Reset Matrix
  20. glLoadIdentity();
  21.  
  22. // Set the viewport to be the entire window
  23. glViewport(, , w, h);
  24.  
  25. // Set the correct perspective.
  26. gluPerspective(45.0f, ratio, 0.1f, 100.0f);
  27.  
  28. // Get Back to the Modelview
  29. glMatrixMode(GL_MODELVIEW);
  30. }
  31.  
  32. float angle = 0.0f;
  33.  
  34. void renderScene(void) {
  35.  
  36. // Clear Color and Depth Buffers
  37. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  38.  
  39. // Reset transformations
  40. glLoadIdentity();
  41. // Set the camera
  42. gluLookAt( 0.0f, 0.0f, 10.0f,
  43. 0.0f, 0.0f, 0.0f,
  44. 0.0f, 1.0f, 0.0f);
  45.  
  46. glRotatef(angle, 0.0f, 1.0f, 0.0f);
  47.  
  48. glBegin(GL_TRIANGLES);
  49. glVertex3f(-2.0f,-2.0f, 0.0f);
  50. glVertex3f( 2.0f, 0.0f, 0.0);
  51. glVertex3f( 0.0f, 2.0f, 0.0);
  52. glEnd();
  53.  
  54. angle+=0.1f;
  55.  
  56. glutSwapBuffers();
  57. }
  58.  
  59. int main(int argc, char **argv) {
  60.  
  61. // init GLUT and create window
  62. glutInit(&argc, argv);
  63. glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
  64. glutInitWindowPosition(,);
  65. glutInitWindowSize(,);
  66. glutCreateWindow("Lighthouse3D- GLUT Tutorial");
  67.  
  68. // register callbacks
  69. glutDisplayFunc(renderScene);
  70. glutReshapeFunc(changeSize);
  71. glutIdleFunc(renderScene);
  72.  
  73. // enter GLUT event processing cycle
  74. glutMainLoop();
  75.  
  76. return ;
  77. }

[译]GLUT教程 - 动画的更多相关文章

  1. [译]GLUT教程(目录)

    http://www.lighthouse3d.com/tutorials/glut-tutorial/ GLUT是OpenGL Utility Toolkit的意思.作者Mark J. Kilgar ...

  2. [译]GLUT教程 - 游戏模式

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> Game Mode 根据GLUT官网的说明,GLUT的游戏模式是为开启 ...

  3. [译]GLUT教程 - glutPostRedisplay函数

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> glutPostRedisplay 直 ...

  4. [译]GLUT教程 - 安装

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Setup 你需要什么 要用GLUT库开发程序,你可以下载最新版本3. ...

  5. [译]GLUT教程 - 整合代码8

    Lighthouse3d.com >> GLUT Tutorial >> Avoiding the Idle Func >> The Code So Far VII ...

  6. [译]GLUT教程 - 整合代码7

    Lighthouse3d.com >> GLUT Tutorial >> Extras >> The Code So Far VII 以下是子窗体的最终版本代码. ...

  7. [译]GLUT教程 - 渲染到子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Rendering to Subwindows 先回顾一下之前 ...

  8. [译]GLUT教程 - 重整子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Reshape Subwindows 重整函数的回调需要处理两 ...

  9. [译]GLUT教程 - 创建和关闭子窗体

    Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...

随机推荐

  1. Python的网络编程[0] -> socket[1] -> socket 模块

    socket 1. 常量 / Constants AF_* 和 SOCK_* 分别属于 AddressFamily 和 SocketType 1.1 AF_*类常量 socket.AF_UNIX:  ...

  2. 洛谷——P2026 求一次函数解析式

    P2026 求一次函数解析式 题目背景 做数学寒假作业的怨念…… 题目描述 给定两个整点的坐标,求它们所在直线的函数解析式(一次函数). 输入输出格式 输入格式: 输入共两行. 第一行有两个整数x1, ...

  3. 内连接(INNER JOIN)

    内连接组合两张表,并且基于两张表中的关联关系来连接它们.使用内连接需要指定表中哪些字段组成关联关系,并且需要指定基于什么条件进行连接.内连接的语法如下: INNER JOIN table_name O ...

  4. [BZOJ5289][HNOI2018]排列(拓扑排序+pb_ds)

    首先确定将所有a[i]向i连边之后会形成一张图,图上每条有向边i->j表示i要在j之前选. 图上的每个拓扑序都对应一种方案(如果有环显然无解),经过一系列推导可以发现贪心策略与合并的块的大小和w ...

  5. 【bzoj1085】【 [SCOI2005]骑士精神】启发式剪枝+迭代加深搜索

    (上不了p站我要死了,侵权度娘背锅) 如果这就是启发式搜索的话,那启发式搜索也不是什么高级玩意嘛..(啪啪打脸) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且 ...

  6. 软路由OpenWrt教程收集(插件开发教程,opkg安装软件教程)

    说明:现在几乎所有家庭级别的路由器都是基于OpenWrt进行衍生搭建的. https://openwrt.io/(极路由HiWifi创建的开源站点,极路由系统有这个衍生而来) http://www.o ...

  7. Sql Server中百万级数据的查询优化

    原文:Sql Server中百万级数据的查询优化 万级别的数据真的算不上什么大数据,但是这个档的数据确实考核了普通的查询语句的性能,不同的书写方法有着千差万别的性能,都在这个级别中显现出来了,它不仅考 ...

  8. tmux用法

    列出所有的tmux  session,一个session是多个窗口的集合 tmux list-session 创建tmux窗口, tmux new -s server server为tmux的sess ...

  9. 使用nvDXT.exe把图片转换成dds图片【转】

    从nvidia官网下载工具包DDS Utilities [https://developer.nvidia.com/legacy-texture-tools] 转换图片格式需要的工具是 nvdxt.e ...

  10. BindVertexbuffer

    stride 的意思是 inputstream.layout 的大小 比如 description是 pos uv normal stride 就是一组pos uv normal的大小 ns  里面 ...