使用opengl和c ++使用动画(在一段时间之后逐个翻译)翻译三角形

时间:2014-08-28 16:22:33

标签: c++ opengl animation glut

我想在opengl中制作一个太空入侵者游戏。所以我想到用三角形创造敌人。在制作游戏之前,我想试试动画。我有三角形。我想用动画将它翻译成某个点(即三角形在一段时间后被翻译。它应该看起来好像在移动)。在到达左边的某个点后,我想把它翻译成同样的位置或距离正确。该过程应该继续,直到屏幕打开。我用过睡眠功能。但它没有用。没有显示动画。仅在不同的平移位置绘制平移的三角形。帮助我。

这是我的代码 -

#include "windows.h"
#include <gl/glut.h>
#include<stdio.h>

void init( void )
{
    printf( "OpenGL version: %s\n", (char*)glGetString(GL_VERSION));
    printf( "OpenGL renderer: %s\n", (char*)glGetString(GL_RENDERER));

    //Configure basic OpenGL settings

    glClearColor(1.0, 1.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,640.0,0.0,480.0);
    glColor3f(1.0,0.0,0.0);
glPointSize(3);
}

void house(int x, int y,int z)
{
  glPushMatrix();
  glTranslatef(x, y,z);
  glBegin (GL_LINES);    
     glVertex2i (0,30);
     glVertex2i (15,60);
      glVertex2i (15,60);
       glVertex2i (30,30);
        glVertex2i (30,30);
        glVertex2i (0,30);
        glEnd();
        //Sleep(200);
  glPopMatrix();
    //glutSwapBuffers();
}


// Main drawing routine. Called repeatedly by GLUT's main loop
void display( void )
{
    //Clear the screen and set our initial view matrix

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);


    int i;
    for(i = 10; i < 350; i = i + 50)
  {
    house(i,20,0);
    Sleep(200);
  }

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 glFlush();

}

// Entry point - GLUT setup and initialization
int main( int argc, char** argv )
{

   glutInit( &argc, argv );
   glutInitDisplayMode (GLUT_DEPTH | GLUT_SINGLE| GLUT_RGB);
   glutInitWindowSize (800, 600);
   glutInitWindowPosition (100, 100);
   glutCreateWindow( "OpenGL Test" );

   glutDisplayFunc( display );


   init();

   glutMainLoop();

   return 0;
}

1 个答案:

答案 0 :(得分:1)

main()中,您已将display()声明为display callback function。当GLUT确定需要重新绘制窗口或者例如通过函数glutPostRedisplay()重新绘制窗口时,它将调用此函数。

显示功能应该在特定时间点调用重绘窗口。 glFlush()将强制执行GL命令。

问题是你的动画循环在重绘函数内,最后调用glFlush(),一次显示结果。你不要告诉GLUT重绘窗户。这就是你不能看到动画的原因。

出于本教程的目的,我建议您为房屋绘图的初始位置定义一个全局变量。当然,一旦你理解了这一切是如何运作的,你就必须立即改进这一点。

static int pos = 10;    // temporary work around, just for the demo  

然后定义一个定时器函数,在一段时间后调用。这将是动画的核心,通过调用glutPostRedisplay()来组织移动和重绘窗口:

void timerfunc(int value)    // handle animation 
{
    pos += 50;               // update the postion 
    if (pos<350)             // as in your originial loop 
        glutTimerFunc(200, timerfunc, 0);  // plan next occurence
    glutPostRedisplay();     // redraw the window
}
在发布main()之前glutMainLoop()中的

Activate your timer function

glutTimerFunc(200, timerfunc, 0);       // call a timer function 
glutMainLoop();                      // this call is already in your code

您的显示功能可以更改为:

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    house(pos, 20, 0);   // draw the house at its last calculated position 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glFlush();
}

然后它以动画方式工作!