[OpenGL]用OpenGL制作动画
//在窗口内绘制一个移动的矩形
/*我们通常还可以用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流水线的刷新。
*/
效果图:
[OpenGL]用OpenGL制作动画的更多相关文章
- 使用WebGL + Three.js制作动画场景
使用WebGL + Three.js制作动画场景 3D图像,技术,打造产品,还有互联网:这些只是我爱好的一小部分. 现在,感谢WebGL的出现-一个新的JavaScriptAPI,它可以在不依赖任何插 ...
- 有关于OpenGL、OpenGL ES、WebGL的小结
转自原文 有关于OpenGL.OpenGL ES.WebGL的小结 一. OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口 ...
- 前端制作动画的几种方式(css3,js)
制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...
- CSS3制作动画的三个属性
CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation:我们一起学习完了Transform和Transition,让我们对元素实现了一些基本的动画效果,这 ...
- requestAnimationFrame制作动画:旋转风车
在以往,我们在网页上制作动画效果的时候,如果是用javascript实现,一般都是通过定时器和间隔来实现的,出现HTML5之后,我们还可以用CSS3 的transitions和animations很方 ...
- canvas学习之制作动画
html部分 ...... <body> <canvas id="myCanvas" width="400" height="400 ...
- OpenGL 和OpenGL ES简介
OpenGL的全称是Open Graphics Library,即开放的图形库接口,它定义了一个跨编程语言.跨平台的编程接口的规范,它主要用于三维图形(实际上二维图形也可以)变成.OpenGL的前 ...
- html5 requestAnimationFrame制作动画:旋转风车
详细内容请点击 在以往,我们在网页上制作动画效果的时候,如果是用javascript实现,一般都是通过定时器和间隔来实现的,出现HTML5之后,我们还可以用CSS3 的transitions和anim ...
- 在线Youtube视频下载,修改文本,剪切制作动画的最新方法
刚刚(减去编写本文章的时间,大概20分钟前吧)在看国外最新技术资讯的时候发现有个方法可以让我们快速去下载Youtube上面的视频,不敢独享,我自己都没有怎么玩就所以立刻post上来广而告之,希望对大家 ...
- Python+Matplotlib制作动画
注: 在"实验设计与数据处理"的课后作业中,有一个数据可视化的作业,利用课程上学习的某种方法找一个二维函数的最大值,并将这个寻找的过程可视化.在作业里面利用了Matplotlib的 ...
随机推荐
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...
- Mac Terminal菜鸟篇之使用unrar解压rar文件
安装: $ brew install unrar 使用: $ unrar x Httpclient_jar.rar $ unrar e Httpclient_jar.rar # 或者用参数e也行
- EasyUI的功能树之异步树
最近几个项目都用到了EasyUI这个Jquery框架,目前感觉起来还是很好使的,展示效果很好,帮助文档什么的资料很多,而且互联网上Easy粉很多,大多数拥护和喜爱EasyUI的粉丝们都愿意在网络平台互 ...
- 【WP8】图片缓存控件
在做图片相关的应用的时候,经常需要用大图片的缓存,默认的Image控件不支持缓存的支持,本文自定义一个支持图片缓存的控件 当图片的地址是网络图片时候 根据Url判断该图片是否存在本地,如果存在,则直接 ...
- 非抢占式RCU实现(一)
关于RCU的实现,考虑如下情形: 1.非抢占式RCU 2.限于嵌入式系统4核.每核单线程 3.RCU_FANOUT = 32 此时,RCU_TREE退化为单节点,如下,针对rcu_sched_stat ...
- phpstorm 初体验
最近在学php,今天想要读一下公司刚外包网站的源代码,要安装一个php的集成环境,因最开始用过JetBrains的pycharm觉得很好用,这会儿还选用该家产品PHPStorm(为啥storm这个词, ...
- 如果BarTender出现卸载不干净的问题如何处理
自从BarTender 2016出了之后,好多小伙伴都想试试新功能咋样,这就意味着首先要卸载电脑上旧版BarTender.然而就是这个操作,难倒了好一批人,他们表示BarTender卸载卸不干净,不仅 ...
- WebGL 颜色与纹理
1.纹理坐标 纹理坐标是纹理图像上的坐标,通过纹理坐标可以在纹理图像上获取纹理颜色.WebGL系统中的纹理坐标系统是二维的,如图所示.为了将纹理坐标和广泛使用的x.y坐标区分开来,WebGL使用s和t ...
- Java 多线程编程知识详解
Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程使用 ...
- 使用monkey技术修改python requests模块
例如请求前和请求后各来一条日志,这样就不需要在自己的每个代码都去加日志了. 其实也可以直接记录'urllib3.connectionpool' logger name的日志. 修改了requests ...