2011-08-18 35 views
-3

我正在尝试使门动画,以便如果我按下按钮,门就会打开。在编译的那一刻,当我按下按钮时,它会移动相机,然后我无法再控制相机。代码有什么问题?OpenGL门动画

glPushMatrix; 
glTranslatef (door_Xpos,0.0, 0.0); 
glRotatef (door_Angle, 1,0,0); 

glBegin(GL_QUADS); 

//Door left 
glColor3f(0.2f, 0.2f, 0.2f); 
glVertex3f(-10.0, 0.0, -25.0); 
glColor3f(0.4f, 0.4f, 0.4f); 
glVertex3f(-10.0, 15.0, -25.0); 
glColor3f(0.6f, 0.6f, 0.6f); 
glVertex3f(0.0, 15.0, -25.0); 
glColor3f(0.8f, 0.8f, 0.8f); 
glVertex3f(0.0, 0.0, -25.0); 

//door right 
glColor3f(0.2f, 0.2f, 0.2f); 
glVertex3f(10.0, 0.0, -25.0); 
glColor3f(0.4f, 0.4f, 0.4f); 
glVertex3f(10.0, 15.0, -25.0); 
glColor3f(0.6f, 0.6f, 0.6f); 
glVertex3f(0.0, 15.0, -25.0); 
glColor3f(0.8f, 0.8f, 0.8f); 
glVertex3f(0.0, 0.0, -25.0); 

glPopMatrix; 

void keyboard(unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 
     case 'a': 
     case 'A': 
      glTranslatef(5.0, 0.0, 0.0); 
      break; 

     case 'd': 
     case 'D': 
      glTranslatef(-5.0, 0.0, 0.0); 
      break; 

     case 'w': 
     case 'W': 
      glTranslatef(0.0, 0.0, 5.0); 
      break; 

     case 's': 
     case 'S': 
      glTranslatef(0.0, 0.0, -5.0); 
      break; 

     case 't': 
     case 'T': 
      if (is_depth) 
      { 
       is_depth = 0; 
       glDisable(GL_DEPTH_TEST); 
      } 
      else 
      { 
       is_depth = 1; 
       glEnable(GL_DEPTH_TEST); 
      } 

     #Fall-through... 
     case 'o': 
     case 'O': 
      door_Xpos += 90.0; 
      break; 
    } 
    display(); 
} 

回答

4

OpenGL是不是一个场景图,glTranslateglRotate和类似的不走动的对象,他们改变应用到绘制到屏幕上的三角形的转变。因此,在事件处理程序中调用矩阵操作函数是没有意义的。实际上,大多数OpenGL函数(包括矩阵操作)都将从显示屏函数中调用。这条规则的唯一例外是数据上传,如纹理或缓冲区对象数据。

尝试根据由事件处理程序设置的变量在显示功能中设置动画。