glRotatef не работает должным образом - PullRequest
3 голосов
/ 15 июня 2011

Я новичок в openGl. Я делаю очень простые вещи. Просто хочу повернуть объект вокруг оси х на 20,0 градусов. Но вместо вращения он движется вверх ногами.

Может кто-нибудь помочь мне, где я делаю неправильно.

Ниже мой код,

void drawScene(){

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glColor3f(1.0f, 0.0f, 0.0f);
    glPushMatrix();
    //glTranslatef(1.0f,0.0f,0.0f);
    glRotatef(20.0f,1.0f,0.0f,0.0f);

    glBegin(GL_QUADS);
    glVertex3f(-0.7f, -0.5f, -5.0f);
    glVertex3f(0.7f, -0.5f, -5.0f);
    glVertex3f(0.4f, 0.5f, -5.0f);
    glVertex3f(-0.4f, 0.5f, -5.0f);
    glEnd();
    glPopMatrix();

        glutSwapBuffers();
    }

Ответы [ 2 ]

10 голосов
/ 15 июня 2011

Вращения всегда происходят относительно системы координат получаемых вершин.Ваш объект кажется плоскостью, которая находится на уровне -5,0 по оси Z.Матрица вращения вращается вокруг начала координат (0, 0, 0) системы координат.Поскольку ваш объект не центрирован в начале координат, он будет вращаться вокруг источника.

Типичный способ справиться с этим - перевести объект в начало координат, выполнить вращение, а затем перевести его обратно.В вашем случае это будет выглядеть так:

glTranslatef(0.0f, 0.0f, -5.0f); //Translate back to the original location.
glRotatef(...);                  //Rotate.
glTranslatef(0.0f, 0.0, 5.0f);   //Translate to the origin

Обратите внимание, что вы всегда должны читать последовательные операции преобразования снизу вверх.

Обновление

Следует отметить, что вышеупомянутое решение является скорее пробелом.Типичный способ сделать это - модели построены вокруг источника.Эта система координат обычно называется «пространством модели».

Вы поворачиваете точки в пространстве модели, а затем переводите их в положение в мире, где вы их хотите.Единственная причина, по которой нам пришлось переместить ее в исходный код в приведенном выше коде, заключалась в том, что модель не была построена в пространстве модели, поэтому нам пришлось переместить ее в пространство модели.

0 голосов
/ 15 июня 2011

Вы можете увидеть эффект вашего вращения, если вы центрируете свой объект по координатным осям.В каждом из ваших вызовов glVertex3f измените значение Z с -0,5f на 0.f, и вы увидите поворот вокруг оси X, который вы ожидали.

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