OpenGL дверная анимация - PullRequest
       0

OpenGL дверная анимация

0 голосов
/ 19 августа 2011

Я пытаюсь оживить дверь, чтобы, если я нажму кнопку, дверь откроется. В данный момент он компилируется, и когда я нажимаю кнопку, он перемещает камеру, и я больше не могу управлять камерой. Что не так с кодом?

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 Ответ

4 голосов
/ 19 августа 2011

OpenGL - это не граф сцены, glTranslate , glRotate и подобные объекты не перемещают объекты, они изменяют преобразование, применяемое к треугольникам, нарисованным на экране. Таким образом, нет смысла вызывать функции матричной манипуляции в обработчике событий. На самом деле большинство функций OpenGL, включая матричные манипуляции, должны вызываться из функции display . Единственное исключение из этого правила - загрузка данных, таких как текстуры или данные объекта буфера.

Попробуйте анимировать вашу дверь из функции дисплея на основе переменных , установленных обработчиками событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...