IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[OpenGL] la rotation ?


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut [OpenGL] la rotation ?
    Bonjour,
    J'ai un problème pour réaliser une rotation en OpenGL au centre du rectangle.
    J'ai esayé avec glRotatef(ang,0.0,0.0,1.0); le problème l'orignie de la rotation n'est pas au centre du rectangle.
    Comment définir le centre du rectanble, ou il faut-il utiliser les cos(), sin() ; si oui comment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void Draw_Box(int Texture,float X0,float Y0,float X1,float Y1, int Calque, float ang)
    {
    glPushMatrix();
    // glRotatef(ang,0.0,0.0,1.0);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, g_Texture[Texture]);
     
    glBegin(GL_QUADS); 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(-SCREEN_X/2+X1*cos(ang),  SCREEN_Y/2-Y1*sin(ang),  -SCREEN_X+Calque);
     glTexCoord2f(1.0f, 1.0f); glVertex3f(-SCREEN_X/2+X1*cos(ang),  SCREEN_Y/2-Y0*sin(ang),  -SCREEN_X+Calque); 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(-SCREEN_X/2+X0*cos(ang),  SCREEN_Y/2-Y0*sin(ang),  -SCREEN_X+Calque);
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-SCREEN_X/2+X0*cos(ang),  SCREEN_Y/2-Y1*sin(ang),  -SCREEN_X+Calque);
    glEnd();
     
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
    glPopMatrix();
    }
    Merci Beaucoup

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    Le problème avec glRotate, c’est assez compliqué quand on a beaucoup de rectangles.
    Donc, je pense qu’avec les cos, sin, ça sera plus simple.

    Voici les 4 points du rectangle :
    Point A (X0,Y1)
    Point B(X1,Y1)
    Point C(X1,Y0)
    Point D(X0,Y0)

    J’ai un problème avec mes formules mathématiques. Ça ne tourne pas comme il faut.

    float CX = (X0 + X1) / 2;
    float CY = (Y0 + Y1) / 2;

    X0 = CX+((X0 - CX)*cos(ang) - (Y0 - CY)*sin(ang));
    Y0 = CY+((X0 - CX)*sin(ang) - (Y0 - CY)*cos(ang));

    X1 = CX+((X1 - CX)*cos(ang) - (Y1 - CY)*sin(ang));
    Y1 = CY+((X1 - CX)*sin(ang) - (Y1 - CY)*cos(ang));

    Merci beaucoup
    @+

  3. #3
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    salut,

    pourquoi ne pas translater ton rectangle au centre de la scene avant de le faire tourner? En ramenant le centre du rectangle au centre de la scene, ca devient ton centre de rotation.

    Apres il faut jouer avec les push/popMatrix pour ne pas affecter les autres objets mais c'est quand meme plus simple que de s'amuser avec la trigo. En gros ca donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();  
    
    glPushMatrix(); // sauvegarder la matrice courante
    
    glTranslatef() // translation du rectangle pour le ramener à sa position initiale
    glRotatef(...) // rotation du rectangle
    glTranslatef() // translation du rectangle pour le ramener au centre (à faire, dans le code, APRES la rotation, mais dans les faits la rotation se fera avant car les operations matricielles se font "à l'envers")
    
    ... // dessin du rectangle
    
    glPopMatrix();
    et ca devrait marcher (fais bien gaffe que les opérations matricielles se font dans l'ordre inverse de celui d'appel)

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    Salut,
    Bon, je vais essayer. Ça ne va pas être simple de retrouver sa position initiale avec tous ses rectangles. Ce n’est pas gagné.
    img6.jpg
    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    un petit tutorial ?

  6. #6
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    un petit tutorial ?
    sur quoi? comment faire une translation ou une rotation? Si c'est ca je pense qu'il y a assez d'exemples de partout, c'est quand même l'un des 1ers trucs qu'on est "sensé" apprendre en OpenGL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ça ne va pas être simple de retrouver sa position initiale avec tous ses rectangles.
    Ta position "initiale" c'est l'origine (0,0,0). tu as deux possibilités

    1 ) si tu connais la position du centre de ton rectangle (cx, cx cz), il te suffit de faire un glTranslate(-cx, -cy, -cz) pour le ramener à l'origine

    2) si tu ne connais que les coordonnées des coins de ton rectangle, tu t'en sers pour calculer les coordonnées du centre, puis tu fais comme en 1)

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    merci beaucoup

  8. #8
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 568
    Par défaut
    normalement, à chaque fois qu'on dessine la scène, on part toujours de zéro
    on refait les mêmes translations et les memes rotations
    on n'affecte pas les données des objets mais les données que l'on va passer à ces translations et ces rotations
    donc si tu dois retrouver ta position initiale, il suffit de remettre ces paramètres à leur valeur initiale

    regardes n'importe quel tutoriel montrant l'animation d'un cube qui tourne
    on ne fait pas tourner les coordonnées du cube
    on fait évoluer l'angle de la rotation à appliquer au cube
    Tutoriel NEHE en français : Rotations
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    c'est bon, ça fonctionne bien.
    j'ai réalisé un petit exemple pour comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    glPushMatrix();
     
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, g_Texture[99]);
     
    glTranslatef(150,150,0);
    glRotatef(ZZ0,0.0,.0,1.0);
    glTranslatef(-150,-150,0);
     
    glBegin(GL_QUADS);	
    glTexCoord2f(0.0f, 0.0f); glVertex3f(100  ,100  ,Calque);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(100  ,200  ,Calque);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(200  ,200  ,Calque);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(200  ,100  ,Calque);
    glEnd();
     
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glDisable(GL_DEPTH_TEST);
     
    glPopMatrix();
    Merci encore
    @+

  10. #10
    Membre chevronné
    Inscrit en
    Février 2008
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Février 2008
    Messages : 413
    Par défaut
    c'est bon, ça fonctionne bien.
    Super

    Juste un truc: si tous tes objets sont texturés, laisse GL_TEXTURE_2D en enable tout le long, plutot que de l'activer puis le couper pour chaque rectangle dessiné. Idem pour le DEPTH_TEST.

    D'une maniere générale, tout ce qui change les états OpenGL (glEnable / disable) est à minimiser si possible pour gagner en performances

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 67
    Par défaut
    ok ShevchenKik

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. OpenGL et rotation
    Par angioedema dans le forum C++
    Réponses: 7
    Dernier message: 13/06/2013, 23h55
  2. [OpenGL] probleme rotations/ translations
    Par Daemonkii dans le forum Windows
    Réponses: 4
    Dernier message: 16/12/2007, 17h42
  3. Réponses: 2
    Dernier message: 15/06/2007, 08h49
  4. [OpenGl] Problème rotation d'un rectangle
    Par dib258 dans le forum SDL
    Réponses: 2
    Dernier message: 20/12/2006, 17h02
  5. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo