glRotatef работает с несколькими объектами

1

В основном я хочу открыть Дверь, и я подумал об использовании glRotatef. Моя проблема в том, что она затрагивает каждый объект, который нарисован после него. Кто-нибудь знает, как остановить это?

Door.class

    public static void draw(Texture door) {  

    door.bind();
    if(Door_Test.state == "out" && d != 90){
        glRotatef(i, 0, 1, 0);
        i+=5;
    }
    glBegin(GL_QUADS);  
        glColor3f(1f, 1f, 1f);glTexCoord2f(0,0);glVertex3f(-2,3, -15);
        glColor3f(1f, 1f, 1f);glTexCoord2f(0,1);glVertex3f(-2,-3, -15);
        glColor3f(1f, 1f, 1f);glTexCoord2f(1,1);glVertex3f(2,-3, -15);
        glColor3f(1f, 1f, 1f);glTexCoord2f(1,0);glVertex3f(2,3, -15);
    glEnd();

}
Теги:
opengl
lwjgl

2 ответа

2
Лучший ответ

Когда вы вращаетесь, он вращает всю сцену. Поэтому, чтобы повернуть один объект, вы вращаете всю сцену, рисуете свой объект, а затем поворачиваете экран назад.

glRotatef(i, 0, 1, 0);

// Draw object.

glRotatef(-i, 0, 1, 0);

Как отметил Ретро Коради, если вы постоянно это делаете, у вас могут быть ошибки округления с плавающей запятой, которые накапливаются с течением времени. Ответ HolyBlackCat предлагает лучшее решение.

  • 0
    Thx это работает: D Единственное, что осталось, это вращается вокруг ложной оси ^^
  • 0
    Обратите внимание, что если вы делаете это несколько раз, это все равно может изменить ваше преобразование с течением времени из-за ошибок округления. Подход в другом ответе, использующий glPushMatrix() и glPopMatrix() , лучше IMHO.
Показать ещё 1 комментарий
4

Обычный способ сделать это:

glPushMatrix();
glRotatef(/*...*/);
// Drawing commands here
glPopMatrix();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню