2009-06-17 6 views
5

Pour mon projet, je devais faire pivoter un rectangle. Je pensais, ce serait facile, mais je reçois un comportement imprévisible lors de l'exécution .. ilC++/OpenGL - Rotation d'un rectangle

Voici le code:

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

Le problème, est que mon rectangle fait quelque part une traduction dans la fenêtre en tournant. En d'autres termes, le rectangle ne conserve pas la position: vec_vehicle_position_.x et vec_vehicle_position_.y.

Quel est le problème?

Merci

Répondre

10

Vous devez retourner l'ordre de vos transformations:

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

devient

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

Merci beaucoup, ça marche! –

1

Assurez-vous que la rotation est appliquée avant la traduction.

9

Pour élaborer sur les réponses précédentes.

Les transformations dans OpenGL sont effectuées via une multiplication matricielle. Dans votre exemple, vous avez:

M_r_ - la transformation de rotation

M_t_ - la traduction de transformation

v - un sommet

et vous les aviez appliqué dans l'ordre:

M_r_ * M_t_ * v

Utilisation de parenthèses pour clarifier:

(M_r_ * (M_t_ * v))

Nous voyons que le sommet est transformé par la matrice plus proche en premier, qui est dans ce cas la traduction. Cela peut être un peu contre-intuitif parce que cela vous oblige à spécifier les transformations dans l'ordre inverse de celui dans lequel vous voulez les appliquer. Mais si vous pensez à la façon dont les transformations sont placées sur la pile de matrice, vous devriez avoir un peu plus de sens (la pile est pré-multipliée ensemble).

Par conséquent, pour obtenir le résultat souhaité, vous devez spécifier les transformations dans l'ordre inverse.

+0

En effet :) Merci pour la mise à jour! –

3

Inertiatic fourni une très bonne réponse. Du point de vue du code, vos transformations se produiront dans l'ordre inverse de leur apparition. En d'autres termes, les transformations les plus proches du code de dessin réel seront appliquées en premier.

Par exemple:
glRotate();
glTranslate();
glScale();
drawMyThing();

va d'abord faire évoluer votre chose, puis le traduire, puis faites-le pivoter.Vous devez effectivement «lire votre code à l'envers» pour déterminer quelles transformations sont appliquées dans quel ordre. Gardez également à l'esprit l'état de ces transformations lorsque vous appuyez sur la pile de vues du modèle et que vous l'exposez.