有了简单的画图基础外,可以通过openGL的glutTimerFunc函数实现简单的动画

砖块在窗口四周不断的弹来弹去

代码

主要是glutTimerFunc函数的使用, 见代码

#include <gl\glut.h>
#include <gl\GLU.h>
#include <gl\GL.h>
#include <math.h>const GLfloat PI = 3.141595654f;
const int windowWidth = 400;
const int windowHeight = 400;GLfloat posX = 100.0f;
GLfloat posY = 200.0f;
GLsizei rsize = 50;GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;void myDisplay(void)
{// 用当前清除色清除颜色缓冲区,即设定窗口的背景色glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0, 0);glRectf(posX, posY, posX + rsize, posY + rsize);//glFlush();glutSwapBuffers(); // 双缓冲下使用该函数交换两个缓冲区的内容
}void timerFunc(int value)
{if (posX > windowWidth - rsize || posX < 0)xstep = -xstep;if (posY > windowHeight - rsize || posY < 0)ystep = -ystep;if (posX > windowWidth - rsize)posX = windowWidth - rsize - 1;if (posY > windowHeight - rsize)posY = windowHeight - rsize - 1;posX += xstep;posY += ystep;/*glutPostRedisplay 标记当前窗口需要重新绘制。通过glutMainLoop下一次循环时,窗口显示将被回调以重新显示窗口的正常面板。*/glutPostRedisplay();/*(1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是glutTimerFunc(unsigned int millis, void (*func)(int value), int value);参数对应关系为:glutTimerFunc(毫秒数, 回调函数指针, 区别值);(2)写自己的回调函数 void OnTimer(int value);用value区分是哪个定时器(3)在函数里改变和位置有关的变量,然后调用glutPostRedisplay();用来重绘(4)最后再次调用glutTimerFunc,因为glut的定时器是调用一次才产生一次定时,所以如果要持续产生定时的话,在定时函数末尾再次调用glutTimerFunc*/glutTimerFunc(33, timerFunc, 1);
}int main(int argc, char *argv[])
{glutInit(&argc, argv);//glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 使用双缓冲glutInitWindowPosition(100, 100);glutInitWindowSize(windowWidth, windowHeight);glutCreateWindow("第一个OpenGL程序");gluOrtho2D(0.0, windowWidth, 0.0, windowHeight);glutDisplayFunc(&myDisplay);glutTimerFunc(33, timerFunc, 1);glutMainLoop();return 0;
}

截图,砖块是不断运动的

同上,小球碰撞运动

代码

#include <gl\glut.h>
#include <gl\GLU.h>
#include <gl\GL.h>
#include <math.h>const GLfloat Pi = 3.141595654f;
const int windowWidth = 400;
const int windowHeight = 400;float cx = windowWidth * 1.0 / 5.0;
float cy = windowHeight * 4.0 / 5.0;
GLfloat R = 20;float maxHeight = cy;GLfloat xstep = 0.0f;
GLfloat ystep = -2.0f;void myDisplay(void)
{// 用当前清除色清除颜色缓冲区,即设定窗口的背景色glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 0, 0);// 绘制多边形,n足够大就会变成圆形int n = 20;int i;glBegin(GL_POLYGON);for (i = 0; i<n; ++i)glVertex2f(cx + R*cos(2 * Pi / n*i), cy + R*sin(2 * Pi / n*i));glEnd();//glFlush();glutSwapBuffers(); // 双缓冲下使用该函数交换两个缓冲区的内容
}void timerFunc(int value)
{cx += 0.5;cy += ystep;if (cy <= R){ystep = -ystep;maxHeight /= 2;}if (cy > maxHeight){ystep = -ystep;}glutPostRedisplay();if (maxHeight >= 2 * R)glutTimerFunc(33, timerFunc, 1);
}int main(int argc, char *argv[])
{glutInit(&argc, argv);//glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 使用双缓冲glutInitWindowPosition(100, 100);glutInitWindowSize(windowWidth, windowHeight);glutCreateWindow("第一个OpenGL程序");gluOrtho2D(0.0, windowWidth, 0.0, windowHeight);glutDisplayFunc(&myDisplay);glutTimerFunc(33, timerFunc, 1);glutMainLoop();return 0;
}

OpenGL -- 二维动画 glutTimerFunc 函数相关推荐

  1. opengl二维几何变换实例

    引言 opengl提供的几何变换函数和绘图函数是完全分开的,并没有指定一个变换矩阵然后再绘图的API. opengl是先使用几何变换函数,此时相当于永久改变了坐标系,此后的所有绘图操作都相当于在新坐标 ...

  2. adobe animate cc 2021(二维动画制作软件)中文pj安装教程

    adobe animate cc2021由adobe公司最新发布的一款二维动画制作软件,相信大家都很熟知这款软件,最主要的是帮助设计者们很好的设计交互式矢量图和位图动画,并且在制作完成后支持快速发布到 ...

  3. 使用Qt动画框架设计角色的二维动画(二)

    使用Qt动画框架设计角色的二维动画(二) 接上次的 日志. 上次发布demo虽然使用了大量的动画框架.有限状态机框架,但是仍有瑕疵.比如说在用户一直按下按键的时候角色会被"冻"住, ...

  4. 使用Qt动画框架设计角色的二维动画

    使用Qt动画框架设计角色的二维动画 Qt的动画框架是Qt4.6新添加的一个重要的特性,有了它,开发人员可以制作激动人心的动画界面,而不必局限于单调的固定窗口了,可以说,Qt动画框架是其它界面库少见的功 ...

  5. C语言-二维数组做函数的参数

    文章目录 1 引例 2 观点1 这种使用方法是错误的 3 观点2 根本不需要这么做 4 二维数组做函数参数的方法 4.1 方法1 4.2 方法2 4.3 方法3 5 与Java的不同 1 引例 下面的 ...

  6. 【C 语言】二级指针作为输入 ( 二维数组 | 抽象业务函数 | 二维数组打印函数 | 二维数组排序函数 )

    文章目录 一.抽象 二维数组 业务函数 1.二维数组 打印函数 2.二维数组 排序函数 二.完整代码示例 一.抽象 二维数组 业务函数 1.二维数组 打印函数 注意 , 二维数组 作为 函数参数 输入 ...

  7. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  8. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析

    前言 很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {...}// ...

  9. 下面使用计算机动画制作的,2020年最新电大《计算机二维动画制作》形考作业任务01-03网考试题及答案(10页)-原创力文档...

    最新电大<计算机二维动画制作>形考作业任务1-3网考试题及答案 1%通过 考试说明<计算机二维动画制作>形考共有3个任务.做考题时,利用本文档中的查找工具,把考题中的关键字输到 ...

最新文章

  1. mysql删除表中的唯一索引吗_Mysql 使用sql删除同表中重复数据并加唯一索引
  2. 1月份制造业和非制造业PMI双双回升 企稳迹象初显
  3. Dataset:数据集集合(CV方向数据集)-常见的计算机视觉图像数据集大集合包括表面缺陷检测数据集(持续更新)
  4. 蓝牙BLE LINK LAYER剖析(二) -- PDU
  5. SAP ABAP SE16 and SE17
  6. Linux学习记录-文件、目录与磁盘
  7. 参考信息 - 云原生(Cloud Native)
  8. Android colorPrimary、colorPrimaryDark、colorAccent详解
  9. delphi常用函数大全(转)
  10. 视频聊天室软件的技术标准
  11. Android中在SurfaceView上高效绘图
  12. Linux中如何恢复rm命令误删除的文件之extundelete编译安装及使用
  13. npm依赖管理:冗余,依赖树
  14. lucky前面加a还是an_加方法 || 让孩子赶超学霸!这份小学英语知识精编,千万不能错过啦!...
  15. 表格元素的完全指南(译)
  16. java poi 合并单元格 边框显示不全
  17. Oracle应用之to_char(参数,'FM990.00')函数
  18. 关于css盒子模型和BFC的理解
  19. axios、Vue案例、生命周期
  20. 【HDOJ】4607 Park Visit_天涯浪子_新浪博客

热门文章

  1. 用Android Studio写一个聊天软件(聊天室)
  2. adduser和useradd的详细使用笔记
  3. 记一次Base64编码的应用
  4. 【Matlab优化选址】蚁群算法求解电动汽车充电站与换电站选址优化问题【含源码 1182期】
  5. 基于MATLAB的条码二维码识别系统
  6. linux中IGV的运行,[Linux] IGV使用说明
  7. JSP+servlet实现登录与注册功能
  8. fastdfs java集群连接_FastDFS集群部署
  9. 给力!腾讯正布局长沙!互联网指数,长沙全国第6,中部第1
  10. sublime使用live-server