OpenGL程序:移动的正方形

  1. #include<windows.h>
  2. #include<gl/glut.h>
  3. #include<gl/gl.h>
  4. #include<gl/glu.h>
  5.  
  6. GLfloat x1 = 100.0f;    //指定正方形的位置和大小
  7. GLfloat y1 = 150.0f;
  8. GLsizei size = 50;
  9.  
  10. GLfloat xstep = 5.0f;  //正方形运动的速度
  11. GLfloat ystep = 5.0f;
  12.  
  13. void RenderScene(void)
  14. {
  15.     glClear(GL_COLOR_BUFFER_BIT);
  16.     glColor3f(1.0f, 0.0f, 0.0f);
  17.     glRectf(x1, y1, x1+size, y1+size);
  18.  
  19.     glutSwapBuffers();   //清空命令缓冲区并交换帧缓存,代替了glFlush()函数
  20. }
  21.  
  22. void ChangeSize(GLsizei w, GLsizei h)
  23. {
  24.     if(h==0)   h==1;

  25.     glViewport(0, 0, w, h);
  26.  
  27.     glMatrixMode(GL_PROJECTION);
  28.     glLoadIdentity();
  29.  
  30.     if(w <= h)
  31.     {
  32.        windowHeight = 250.0f * h/w;
  33.        windowWidth = 250.0f;
  34.     }
  35.     else
  36.     {
  37.        windowHeight = 250.0f *w/h;
  38.        windowWidth = 250.0f;
  39.     }
  40.     glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
  41.   
  42.     glMatrixMode(GL_MODELVIEW);
  43.     glLoadIdentity();
  44. }
  45.  
  46. void TimerFunction(int value)
  47. {
  48.     if(x1 > windowWidth-size || x1 <0)  xstep = -xstep;  //到边界时,使之反弹
  49.     if(y1 > windowHeight-size || y1 <0)  ystep = -ystep;
  50.     if(x1 > windowWidth-size)  x1 > windowWidth-size-1;
  51.     if(y1 > windowHeight-size) y1 > windowHeight-size-1;
  52.  
  53.     x1 += xstep;    //根据步长修改正方形的位置
  54.     y1 += ystep;
  55.   
  56.     glutPostRedisplay();                //只要窗口大小改变,它就通知GLUT可以进行场景渲染了
  57.     glutTimerFunc(33, TimerFunction, 1);  //因为只激发一次,所以需要重新调用
  58. }
  59.  
  60. void SetupRC(void)
  61. {
  62.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  63. }
  64.  
  65. int main(void)
  66. {
  67.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);    //设置为双缓冲区窗口
  68.     glutCreateWindow("移动的正方形");
  69.  
  70.     glutDisplayFunc(RenderScene);
  71.     glutReshapeFunc(ChangeSize);
  72.     glutTimerFunc(33, TimerFunction, 1);
  73.   
  74.     SetupRC();
  75.     glutMainLoop();
  76. }

  77.      
  78.         


【说明】

    1. 创建一个循环,在每次调用显示回调函数之前改变正方形的位置,使其看起来像在窗口中移动。为了不断调用显示回调函            数,需要使用GLUT的库函数:glutTimerFunc(),该函数用于指定一个定时器回调函数,经过33ms调用一次。

    2. glutSwapBuffers():双缓冲区,在后台缓冲区进行渲染,然后在结束时交换到前台。这种形式能防止观察者看                        到可能伴随着动画帧与动画帧之间闪烁的渲染过程,比较平滑。


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屠变恶龙之人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值