2010-12-06 7 views
1

J'ai une simple application OpenGL, qui affiche une ligne. Je stocke x1, y1, x2 et y2 dans les variables globales.Rotation OpenGL en 2D

La fonction de rotation utilise la fonctionnalité feedback, abordée here et la méthode de traduction vers l'origine, suggérée here. Il est prévu de faire pivoter une ligne autour de son centre.

Voici le code:


void rotate(float theta) 
{ 

    GLfloat* buff = new GLfloat[5]; 
    glFeedbackBuffer(5, GL_2D, buff); 
    glRenderMode(GL_FEEDBACK); 

    int center_x = x1 + (x2 - x1)/2; 
    int center_y = y1 + (y2 - y1)/2; 

    glPushMatrix(); 
     glTranslatef(-center_x, -center_y, 0); 
     glRotatef(theta, 0, 0, 1); 
     glTranslatef(center_x, center_y, 0); 
     line(); 
    glPopMatrix(); 

    x1 = (int)buff[1]; 
    y1 = (int)buff[2]; 
    x2 = (int)buff[3]; 
    y2 = (int)buff[4]; 

    delete[] buff; 
    glutPostRedisplay(); 
} 

Cependant, les deux traductions semblent avoir peu d'effet - la ligne tourne toujours autour du coin inférieur gauche de la fenêtre. De plus, la ligne est coupée si elle ne tient pas sur la surface visible (ce qui ne se produit pas avec les traductions commentées - la ligne refuse tout simplement de bouger si elle tombe en dehors de la surface visible).

Pourquoi ce code ne fonctionne-t-il pas? Comment faire pivoter une ligne autour de son centre (ou n'importe quel point arbitraire) en 2D?

Répondre

2

Il me semble que vous traduisez dans la mauvaise direction et que l'origine est placée en dehors de la fenêtre en bas à gauche. Vous voulez déplacer l'origine vers le point que vous voulez traduire - donc si l'origine est en bas à gauche, vous devez traduire + center_x, + center_y. Tournez, traduisez en arrière (-center_x, -center_y), puis dessinez.

+0

En effet, maintenant ça marche, merci! Cependant, comme il tourne, la ligne se déplace lentement vers le coin inférieur gauche de la fenêtre; cela peut-il être évité? –

+0

Vous devez traiter deux centres différents: le centre de la fenêtre et le point milieu de la ligne. Je suppose que vous voulez que le milieu de la ligne soit centré dans la fenêtre. Donc, ce que vous voulez vraiment faire, c'est traduire au centre de la fenêtre, faire pivoter et tracer votre ligne par rapport à l'origine traduite (c'est-à-dire, une ligne dont le point milieu est 0,0). –

+0

ok, mais il y a un problème lorsque les nouvelles coordonnées (résultant des translations + rotation) tombent en dehors de la zone visible. Si tel est le cas, le tampon de retour ne contiendra que les points visibles. Quand je tourne en arrière, la ligne est coupée - et je voudrais récupérer ma ligne intacte. –