OpenGL动态曲线的实现

    这几天在学OpenGL,觉得这个挺好的,没有网易邮箱,所以复制一下。

    原文链接:http://hexiong26.blog.163.com/blog/static/131280813201088103731617/

   首先,我们来理解一下如何实现动画,想必大家都知道电影和动画的工作原理吧?是的,快速的把看似连续的画面一幅幅的呈现在人们面前。一旦每秒钟呈现的画面超过24幅,人们就会错以为它是连续的。
   我们通常观看的电视,每秒播放25或30幅画面。但对于计算机来说,它可以播放更多的画面,以达到更平滑的效果。如果速度过慢,画面不够平滑。如果速度过快,则人眼未必就能反应得过来。对于一个正常人来说,每秒60~120幅图画是比较合适的。具体的数值因人而异。那么我们现在来理解一下以下的概念.....

   1、双缓冲技术
    在计算机上的动画与实际的动画有些不同:实际的动画都是先画好了,播放的时候直接拿出来显示就行。计算机动画则是画一张,就拿出来一张,再画下一张,再拿出来。如果所需要绘制的图形很简单,那么这样也没什么问题。但一旦图形比较复杂,绘制需要的时间较长,问题就会变得突出。
让我们把计算机想象成一个画图比较快的人,假如他直接在屏幕上画图,而图形比较复杂,则有可能在他只画了某幅图的一半的时候就被观众看到。而后面虽然他把画补全了,但观众的眼睛却又没有反应过来,还停留在原来那个残缺的画面上。也就是说,有时候观众看到完整的图象,有时却又只看到残缺的图象,这样就造成了屏幕的闪烁。
    如何解决这一问题呢?我们设想有两块画板,画图的人在旁边画,画好以后把他手里的画板与挂在屏幕上的画板相交换。这样以来,观众就不会看到残缺的画了。这一技术被应用到计算机图形中,称为双缓冲技术。即:在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显示器的数据,一块作为绘画的区域,在适当的时候交换它们。由于交换两块内存区域实际上只需要交换两个指针,这一方法效率非常高,所以被广泛的采用。
   以下代码需要一定的OpenGL知识,需要学哦....


#include <GL/glut.h>
float i=-1;
float j=1;
float k=-1;
float x=-0.9;
void myDisplay(void)
{

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_LINES);
glPointSize(10.0f);
glVertex2f(-1.0f, 0.0f);//动态绘制x坐标
glVertex2f(i+=0.01, 0.0f);
glVertex2f(0,1.0f);//动态绘制y坐标
glVertex2f(0,j-=0.01);
glEnd();
glBegin(GL_LINE_STRIP);//这是画图通道
for(k=-1;k<=x;k+=0.0001)//动态绘制抛物线
{
glVertex2f(k,k*k);

}
x+=0.01;
glEnd();

glFlush();//更新缓冲区,使图像立即显示
glutSwapBuffers();

//交换在存储器(很有可能是显存)中开辟两块区域,一块作为发送到显示器的数据,一块作为绘画的区域
}
void myIdle(void)//这个自定义函数几乎没有多大用处,不过对于其他的程序就有用
{
myDisplay();
}
int  main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); // 修改了参数为GLUT_DOUBLE
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("绘制抛物线"); // 设置窗口标题
glutDisplayFunc(&myDisplay);//意思是对系统说:如果你需要绘制窗口了,请调用myDisplay这个函数
glutIdleFunc(&myIdle); // 当CPU有空隙的时候,就调用myIdle()函数

glutMainLoop();
return 0;
}

  其实,myDisplay()函数中,最后几句的意思是,执行一次,然后又执行一次,循环此过程........

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值