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 :

Problème de rotations


Sujet :

OpenGL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Points : 17
    Points
    17
    Par défaut Problème de rotations
    Bonjour à tous !

    J'ai un problème avec les rotations sous openGl, je n'arrive pas à faire tourner une "forme" (comme je les appelles dans mon code) sur elle même .

    J'ai pourtant essayé plusieurs techniques en changeant la position du repère ou en jouant avec popmatrix() et pushmatrix() mais j'ai vraiment du mal.

    Si quelqu'un a une idée je suis preneur de tout conseils !

    Je mets ici une partie de mon code, notamment la classe "forme" et le main :

    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
    Forme::Forme(int x, int y, char choix, char echelle )//on décide de la position de départ en déclarant l'objet
    {
        m_choix = choix;
        m_echelle = echelle;
        m_degres = 0;
        m_rotation = 0;
        m_translation = 0;
        m_coordonnes[0] = x;
        m_coordonnes[1] = y;
     
        setCoordonnes(x,y);
        glPushMatrix();
        glTranslated(m_coordonnes[0],m_coordonnes[1], 0);
        creationForme(m_choix, m_echelle);
     
    }
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    int main(int argc, char *argv[])
    {
        bool continuer = 1;
        double tempsA = 0, tempsP = 0, tempsA2 = 0, tempsP2 = 0;
        int i, largeur, hauteur;
        int coordonne[2];
        bool collision = 0;
        Forme carre1(500,500,1,2);
        Forme carre2(500,350,1,3);
     
     
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Un joli \"carr\u00E9\"",NULL);
        SDL_SetVideoMode(LARGEUR_ECRAN, HAUTEUR_ECRAN, 32, SDL_OPENGL);
     
        SDL_Event event;
     
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );
        gluOrtho2D(0,LARGEUR_ECRAN,0,HAUTEUR_ECRAN);
     
     
     
        while(continuer)
        {
            collision = carre2.collision(coordonne[0], coordonne[1], largeur, hauteur);//on test si il y a collision
     
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;
                case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_UP:
                    tempsA = SDL_GetTicks();
                    if (tempsA - tempsP > 20) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle*/
                    {
                        if(collision == 0)
                        {
                            carre1.changerPos(0,1);
                        }
                        else{carre1.changerPos(0,-3);}
                        tempsP = tempsA ;
                    }
                    break;
                    case SDLK_LEFT:
                    tempsA2 = SDL_GetTicks();
                    if (tempsA2 - tempsP2 > 20) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle*/
                    {
                        if(collision == 0)
                        {
                            carre1.changerPos(-1,0);
                        }
                        else{carre1.changerPos(3,0);}
                        tempsP2 = tempsA2 ;
                    }
                    break;
                    case SDLK_RIGHT:
                    tempsA2 = SDL_GetTicks();
                    if (tempsA2 - tempsP2 > 20) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle*/
                    {
                        if(collision == 0)
                        {
                            carre2.rotation(1);
                        }
                        else{carre1.changerPos(-3,0);}
                        tempsP2 = tempsA2 ;
                    }
                    break;
                    case SDLK_DOWN:
                    tempsA2 = SDL_GetTicks();
                    if (tempsA2 - tempsP2 > 20) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle*/
                    {
                        if(collision == 0)
                        {
                            carre1.changerPos(0,-1);
                        }
                        else{carre1.changerPos(0,3);}
                        tempsP2 = tempsA2 ;
                    }
                    break;
                    case SDLK_SPACE:
                    tempsA2 = SDL_GetTicks();
                    if (tempsA2 - tempsP2 > 20) /* Si 30 ms se sont écoulées depuis le dernier tour de boucle*/
                    {
                        if(collision == 0)
                        {
                            carre2.changerPos(0,1);
                        }
                        else{carre2.changerPos(0,-3);}
                        tempsP2 = tempsA2 ;
                    }
                    break;
                }
                break;
            }
     
     
     
     
        glClear( GL_COLOR_BUFFER_BIT );
        glMatrixMode( GL_MODELVIEW );
        carre1.refreshForme();
        carre2.refreshForme();
     
        coordonne[0] = carre1.getCoorX();
        coordonne[1] = carre1.getCoorY();
        largeur = carre1.getLargeur();
        hauteur = carre1.getHauteur();
     
        glFlush();
        SDL_GL_SwapBuffers();
     
        }
     
     
        SDL_Quit();
     
        return 0;
    }
    Si quelqu'un à une solution je suis preneur
    Merci d'avance !

  2. #2
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Je suppose que carre1.refreshForme(); gère aussi le rendu du carré.
    Par tourner sur elle même tu sous entend tourner par rapport un axe de rotation ? Parce que dans le code que tu as mis je ne vois aucune rotation, juste des translations, donc c'est pas possible d'obtenir des rotations avec une translation (à par translatin triviale ou rotation triviale, étant donné qu'une translation non triviale n'as pas de point fixe, alors qu'une rotation fixe une droite).
    Enfin quelle version d'OpenGL utilise tu ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Points : 17
    Points
    17
    Par défaut
    J'utilise la dernière, celle qui est installée par défaut.

    J'aimerai que la forme tourne sur elle même. En gros je cherche à déplacer le repère pour le mettre au milieu de la forme
    concernée et ensuite faire une rotation, le problème est que je bloque à ce niveau.
    Pour le code voici la méthode "position" qui effectue les différentes actions sur les formes.

    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
    23
    24
    25
    26
    27
    void Forme::positionForme(int x, int y)
    {
        int degres = m_degres;
     
            setCoordonnes(x,y);
            glPushMatrix();
     
            if(m_translation == 0 && m_rotation == 0)
            {
                glTranslated(m_coordonnes[0],m_coordonnes[1], 0);
            }
            else if(m_translation == 1)
            {
                glTranslated(m_coordonnes[0],m_coordonnes[1], 0);
            }
            else if(m_rotation == 1)
            {
     
                glTranslated(m_coordonnes[0],m_coordonnes[1], 0);
     
     
                m_rotation = 0;
            }
     
            glRotated(degres,0,0,1);
     
    }
    Merci encore à vous !

  4. #4
    Membre actif Avatar de monwarez
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 144
    Points : 293
    Points
    293
    Par défaut
    Lorsque tu fais glMatrixMode(GL_MODELVIEW); je ne vois pas un appel à glLoadIdentity(); donc c'est peut être pour cette raison que ça ne marche pas comme prévu. (après c'est une supposition, je n'utilise plus les glRotatef,glTranslatef depuis longtemps, j'utilise la bibliothèque glm à la place).
    Ensuite pour ta forme, où est placé l'origine du repère ? Car si l'origine du repère se trouve au milieu de la forme, il ne reste plus qu'à faire une rotation.
    Il faut bien avoir à l'esprit que le rendu d'un objet se fait après le placement du repère, donc si le repère n'est pas bien placé(le repère de la forme) il faudrait construire une matrice de passage P entre les deux repères puis de faire une rotation sur un axe

    soit M la matrice de modelview de l'objet, soit R la rotation voulue, et P la matrice de passage entre les deux repère
    alors il existe A tel que M = P A P^{-1}, et donc en posant A' = R A (la rotation voulue), on a M' = P R A P^{-1}, or A = P^{-1} M P d'où M' = P R P^{-1} M (ce qui est le résultat attendu: on a P R P^{-1} qui est la matrice de rotation dans le bon repère)
    La matrice M' sera la matrice à utiliser.

    Pour la matrice de passage, ce sera la matrice de translation entre les deux repères (plus éventuellement une rotation). Par exemple
    main.pdf
    Pour les opérations matricielle je conseille la bibliothèque glm

    Lorsque j'ai demandé pour la version d'OpenGL je sous-entendais quelle version des shaders utilisée , core profile, compatibility profile etc...

Discussions similaires

  1. Problème de rotation
    Par Syphon dans le forum Flash
    Réponses: 9
    Dernier message: 11/01/2007, 10h27
  2. Problème de rotation => "rideau noir"
    Par alex6891 dans le forum OpenGL
    Réponses: 19
    Dernier message: 29/07/2006, 21h25
  3. Réponses: 4
    Dernier message: 20/03/2006, 21h26
  4. [OpenGL] problème de rotation 3D
    Par ReiVon dans le forum OpenGL
    Réponses: 3
    Dernier message: 11/04/2005, 09h47
  5. Problème de rotation
    Par Francky033 dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 16h38

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