Para mi proyecto necesitaba para girar un rectángulo. Pensé, que iba a ser fácil, pero estoy llegando a un comportamiento impredecible al ejecutarlo..

Aquí está el código:

    glPushMatrix();
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBegin(GL_QUADS);

        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0, 0);
        glTexCoord2f(1.0f, 0.0f);
        glVertex2f(width_sprite_, 0);
        glTexCoord2f(1.0f, 1.0f);
        glVertex2f(width_sprite_, height_sprite_);
        glTexCoord2f(0.0f, 1.0f);
        glVertex2f(0, height_sprite_);

    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();

El problema con eso, es que mi rectángulo es hacer una traducción en algún lugar de la ventana mientras se gira. En otras palabras, el rectángulo no mantener la posición : vec_vehicle_position_.x y vec_vehicle_position_.y.

¿Cuál es el problema ?

Gracias

4 Comentarios

  1. 10

    Usted necesita para invertir el orden de sus transformaciones:

    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);

    se convierte en

    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0);
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f);
    • Muchas gracias, funciona !
  2. 9

    Para la elaboración de las respuestas anteriores.

    Transformaciones en OpenGL se realizan a través de la multiplicación de la matriz. En el ejemplo se tiene:

    M_r_ – la transformación de rotación

    M_t_ – la traducción transformar

    v un vértice

    y aplicados en el orden:

    M_r_ * M_t_ * v

    El uso de paréntesis para aclarar:

    ( M_r_ * ( M_t_ * v ) )

    Vemos que el vértice es transformado por el más cerca de la matriz en primer lugar, que es en este caso la traducción. Puede ser un poco de sentido común, porque esto requiere especificar las transformaciones en el orden opuesto de lo que usted quiere que ellos aplican en. Pero si se piensa en cómo las transformaciones de las que se colocan en la matriz de la pila se debe de esperar que, con un poco más de sentido (la pila está pre-multiplicados juntos).

    De ahí que con el fin de obtener el resultado deseado que usted necesita para especificar las transformaciones en el orden opuesto.

    • En efecto 🙂 Gracias por la actualización !
  3. 3

    Inertiatic siempre una muy buena respuesta. Desde la perspectiva del código, sus transformaciones se suceden en el orden inverso al que aparecen. En otras palabras, se transforma más cerca del dibujo actual código se aplicará por primera vez.

    Por ejemplo:

    glRotate();

    glTranslate();

    glScale();

    drawMyThing();

    Será la primera escala de su cosa, a continuación, traducir, entonces gire. Efectivamente necesidad de «leer el código hacia atrás» para averiguar que transforma están siendo aplicados en qué orden. También hay que tener en mente cuál es el estado de estas transformaciones es cuando usted push y pop de la modelo-vista de la pila.

Dejar respuesta

Please enter your comment!
Please enter your name here