OpenGL---GLUT教程(四) GLUT动画

 GLUT教程

                      动画

到现在为止,我们有了一个画着一个白色三角形的OpenGL窗口,但一点也不激动人心。现在让我们在这节教程里,让这个三角形自己旋转起来。

 

让我们回到main()函数,增加些额外的设置。首先告诉GLUT我们想要一个双缓冲区。双缓冲区通过在后一个缓冲区里绘画,并不停交换前后缓冲区(可见缓冲区),来产生平滑的动画。使用双缓冲区可以预防闪烁。

………….

glutInitDisplayMode(GL_DEPTH|GLUT_DOUBLE|GLUT_RGBA);

…………

接着我们要做的是告诉GLUT,当应用程序空闲的时候渲染函数应该被调用。这导致GLUT一直调用渲染函数而产生动画。GLUT提供了一个函数:glutIdleFunc.这个函数使另一个函数在程序空闲的时候就会被调用。

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

参数:

func:在程序空闲的时候就会被调用的函数的函数名。

按照我们的想法,当程序空闲时应该调用的函数是我们先前定义的渲染函数: renderScene。由于OpenGL默认没有开启深度测试,我们还要开启它,这样我们才能知道哪个物体在前面,哪个物体在后面。深度测试的开启在main()函数里,下面看看现在的main函数。

void main(int argc, char **argv) {
   
   
         glutInit(&argc, argv);
   
   
         
   
   
         // 在这里设置双缓冲区。
    
    
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
   
   
         
   
   
         glutInitWindowPosition(100,100);
   
   
         glutInitWindowSize(320,320);
   
   
         glutCreateWindow("3D Tech- GLUT Tutorial");
   
   
         glutDisplayFunc(renderScene);
   
   
         
   
   
         // 这里让程序空闲时调用renderScene
    
    
         glutIdleFunc(renderScene);
   
   
         
   
   
         glutReshapeFunc(changeSize);
   
   
         
   
   
         //开启深度测试。
    
    
         glEnable(GL_DEPTH_TEST);
   
   
         glutMainLoop();
   
   
}
   
   

下面就是设置渲染函数renderScene。我们定义了一个浮点型变量并初始化为0.0,下面在renderScene函数加一些必须的东西。

 

float angle=0.0;
   
   

   
   
    
     
   
   
void renderScene(void) {
   
   

   
   
    
     
   
   
         //注意我们这里清除了深度缓冲区。
    
    
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
   
         
   
   
         //保存当前模型视图矩阵。
    
    
         glPushMatrix();
   
   
        
   
   
         glRotatef(angle,0.0,1.0,0.0);
   
   
         glBegin(GL_TRIANGLES);
   
   
                 glVertex
   
   
    
    3f
   
   (-0.5,-0.5,0.0);
   
   
                 glVertex
   
   
    
    3f
   
   (0.5,0.0,0.0);
   
   
                 glVertex
   
   
    
    3f
   
   (0.0,0.5,0.0);
   
   
         glEnd();
   
   
         
   
   
         // 弹出堆栈
    
    
         glPopMatrix();
   
   
         
   
   
         // 交换缓冲区
    
    
         glutSwapBuffers();
   
   
         
   
   
         // angle自动增加。
    
    
         angle++;
   
   
}
   
   

glutSwapBuffers函数交换了前后缓冲区,函数原型如下:

void glutSwapBuffers();

好了,我们得到了一个旋转的三角形,你可以下载这个VC工程在这里(glut2.zip)。很棒吧?。但再次说下,我们不会渲染一些十分精美的画面,这是为了保持代码的简洁。也因为主要是学习GLUT

 
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值