使用glTranslate的OpenGL动画

时间:2013-03-21 13:15:59

标签: opengl translation

我正在尝试使用glTranslate以平滑的动作向左移动,然后向右移动。

我使用以下代码使用OpenGL绘制正方形:

    void drawEnemy (RECT rect){
    glPushMatrix();

    //move enemy left then right
    glTranslatef(+right, 0.0, 0.0); //animate right
    glTranslatef(-left, 0.0, 0.0); //animate left

    glBegin(GL_QUADS);
    glColor3f(238, 0.0, 0.0);
        glVertex3f(rect.x, rect.y, 0.0);
    glColor3f(128, 0.0, 128);
        glVertex3f(rect.x, rect.y+rect.h, 0.0);
    glColor3f(238, 0.0, 0.0);
        glVertex3f(rect.x+rect.w, rect.y+rect.h, 0.0);
    glColor3f(128, 0.0, 128);
        glVertex3f(rect.x+rect.w, rect.y, 0.0);
        glEnd();
    glPopMatrix();
    }

我试图控制它所覆盖的x轴的长度,然后使用此代码以相反的方向返回:

    void timer(int t)
    {   
    right +=0.5f;
    if(right>=platform1.x+platform1.w)
        right-=0.5f;

    left+=0.5f;
    if(left<=platform1.x)
        left-=0.5f;

    glutPostRedisplay();
    glutTimerFunc(25,timer,0);
    }

我知道Opengl只是一个图形包,并不一定用于动画,但出于自学习的目的,我真的希望尽可能简单地实现。

目前该计划使广场永远正确。

2 个答案:

答案 0 :(得分:3)

为什么您将自己的动作表达为两个(leftright)的组合?这似乎过于复杂。

只需使用一个posX变量,然后根据按键增加/减少它。

答案 1 :(得分:2)

看看这行代码:

if(left<=platform1.x)
    left-=0.5f;

如果left = 0platform1.x = 1会怎样?

修改

听起来你想要的是跟踪当前位置和你移动的方向,如下所示:

double dir = 1;
double x = platform1.x;

void timer(int t) { 
   x += dir;
   if(x < platform1.x || x > platform1.x + platform1.w) {
      dir = -dir;
      x += dir;
   }
   ...
}

void drawEnemy(RECT rect) {
   ...
   glTranslatef(x, 0.0, 0.0);
   ...
}