OpenGL门动画

时间:2011-08-18 20:43:31

标签: opengl animation

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

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();
}

1 个答案:

答案 0 :(得分:4)

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

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