//在窗口内绘制一个移动的矩形
/*我们通常还可以用OpenGL程序创建动画效果,这里我们利用前面的例子,绘制正方形,并使这个正方形在窗口的边框反弹。这里需要创建一个循环,在每次调用显示回调函数之前改变正方形的位置,使其看起来像在窗口中移动。为了不断的显示回调函数,需要GLUT库中的函数:glutTimerFunc(unsigned int msecs,(*func)(int value),int value);
该函数用于指定一个定时器回调函数,即经过msecs毫秒后由GLUT调用指定的函数,并将value值传递给它。被定时器调用的函数原型如下:void TimerFunction(int value);注意,该函数与其他的回调函数不一样的地方在于该函数只会被激发一次。为了实现联系的动画,必须在定时器函数中再次重新设定定时器回调函数。
*/
#include <gl/glut.h>
//正方形的位置和大小
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;
//正方形运动变化的步长
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;
//窗口的大小
GLfloat windowWidth;
GLfloat windowHeight; void RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(x1,y1,x1+rsize,y1+rsize); glutSwapBuffers();//清空命令缓冲区并交换帧缓存
}
void ChangeSize(GLsizei w,GLsizei h)
{
if (h == 0)
{
h = 1;
}
glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); if (w <= h)
{
windowHeight = 250.0f*h/w;
windowWidth = 250.0f;
}
else
{
windowHeight = 250.0f;
windowWidth =250.0f*w/h;
}
glOrtho(0.0f,windowWidth,0.0f,windowHeight,1.0f,-1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void TimerFunction(int value)
{
//处理到达窗口边界的正方形,使之反弹
if (x1 > windowWidth - rsize || x1 < 0)
{
xstep =-xstep;
} if (y1 > windowHeight -rsize || y1 <0)
{
ystep = -ystep;
}
if (x1 > windowWidth - rsize)
{
x1 = windowWidth - rsize -1;
}
if (y1 > windowHeight -rsize)
{
y1 = windowHeight -rsize -1;
}
//根据步长修改正方形的位置
x1 += xstep;
y1 += ystep; //用新坐标重新绘图
glutPostRedisplay();
glutTimerFunc(50,TimerFunction,value);
}
void SetupRC()
{
//设置窗口的清除色为蓝色
glClearColor(0.0f,0.0f,1.0f,1.0f);
} void main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Bounce"); glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(500,TimerFunction,1); SetupRC();
glutMainLoop();
}
/*这里,我们使用了双缓存技术来实现。双缓存技术使得执行的绘图代码能够子啊一个屏幕之外的缓冲区内进行渲染,然后用交换命令glutSwapBuffers()把图形瞬间放到屏幕上。这样在绘制动画的时候,每一帧都是在画面外的缓冲区中绘制,完成之后再快速地交换到屏幕上,这样会使动画比较平滑。在程序中,我们通过在窗口初始化时设定窗口模式为双缓冲区窗口,glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);此外,在显示回调哈思楠的结尾我们使用了glutSwapBuffers()代替glFlush(),该函数的作用是交换两个缓冲区的内容,即把隐藏的渲染好的图像放到屏幕上显示,并完成OpenGL流水线的刷新。
*/

效果图:

最新文章

  1. centos 6.x安装rvm 配置 Ruby开发环境
  2. Apache模块mod_security 和 Nginx过滤配置
  3. 电脑自动访问g.ceipmsn.com
  4. 2016喜剧《死侍》韩版.HD720P中英双字
  5. 【转】身份证号码校验与信息提取 - Java 代码
  6. live555源码研究(一)------live555MediaServer的启动过程和基本类图
  7. Linux数组array基础
  8. Caffe 在 Ubuntu 中安装
  9. SendMessage和PostMessage区别以及WPARAM 和 LPARAM区别
  10. VxWorks6.6 pcPentium BSP 使用说明(二):创建启动盘
  11. Android+ESP8266+路由器实现远程控制(基于花生壳域名方式访问)
  12. Oracle学习——dmp文件(表)导入与导出
  13. 实战UITableview深度优化
  14. Oracle下SQL学习笔记
  15. TSFDEVTY
  16. Windows与Linux端口占用查询及处理
  17. Vue + Spring Boot从零开始搭建个人网站(一) 之 项目前端Vue.js环境搭建
  18. windows 7 下安装Oracle 9i 解决方法[转]
  19. 【three.js练习程序】旋转、缩放场景
  20. [转] map/reduce

热门文章

  1. linux中CURL的安装(转)
  2. numpy中dtype
  3. Git -- 基本操作 之 版本回退
  4. MySQL存储引擎Innodb和MyISAM对比总结
  5. linux nginx,php开机启动
  6. RMAN:简单的duplicate创建新数据库 for 12c+
  7. linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?
  8. pycahrm使用docstrings来指定变量类型、返回值类型、函数参数类型
  9. [原]巧用RenderTexture
  10. 【笔试面试】神马搜索C++程序猿电话面试