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

  1. #1
    Membre à l'essai
    Déplacement Caméras à l'aide du pavé directionnelle
    Bonjour à tous,

    Mon soucis est que je n'arrive pas a me déplacer dans environnement ou se trouve mon objet.J'ai créé une fonction ci-dessous mais elle n'est pas fonctionnelle et je ne sais pas ou est le problème .
    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
    void OpenGL::keyPressEvent(QKeyEvent *event)
    {
     
               if(event->key() == Qt::Key_Up)
               {
                   glRotatef(1,-1,0,0);
               }
                if(event->key() == Qt::Key_Down)
                {
                  glRotatef(1,1,0,0);
                }
                if(event->key() ==  Qt::Key_Left)
                {
                  glRotatef(1,0,-1,0);
                }
                if(event->key() ==  Qt::Key_Right)
                {
                    glRotatef(1,0,1,0);
                }
     
     
    }


    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    concernant ce code :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     if(event->key() ==  Qt::Key_Left)
                {
                  glRotatef(1,0,-1,0);
                }

    j'aurais plutôt vu

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     if(event->key() ==  Qt::Key_Left)
                {
                  glRotatef(0,1,0,0);
                }

    car si on veut faire tourner la vue courante c'est selon l'axe des Y ( précision importante : je raisonne dans une logique Direct 3d or avec Open GL c'est peut-être différent)
    Ensuite si on veut faire une rotation c'est selon un seul axe donc logiquement que ce soit sur x,y,z une valeur et une seule doit être égale à un les autres à zéro
    Pour finir vous effectuez des rotations sur la matrice courante mais il n'y a pas de sélection de la matrice courante (je suppose GL_MODELVIEW )
    La théorie, c'est quand on sait tout et que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
    ( A Einstein)

  3. #3
    Membre à l'essai
    Pour le GLrotate je suis presque sur que c'est comme cela pour OpenGL, j'ai essayé d'ajouter la matrice MODELVIEW mais rien n'y fais

  4. #4
    Expert éminent
    Il faudrait se mettre à jour et ne pas utiliser glRotatef qui est une fonction obsolète.
    Sinon a mes lointain souvenir glRotatef utilise des angles en degré (et non en radiant) du coup faire une rotation de 1 degré ça doit pas être super visible

  5. #5
    Membre à l'essai
    j'utilise une ancienne version d'open gl c'est pour cela que j'utilise glRotate

  6. #6
    Expert éminent
    C'est pas une raison , j'ai fait une lib qui gère du vieux matos , pour les vielles version d'OpenGL je n'utilise pas glrotatef/gltranslatef et tout le bazar , tu peux utiliser "glLoadMatrixf" à la place.
    (Pareil pour glBegin/glTriangle/glEnd etc etc , tu peux utiliser les VA ).

  7. #7
    Membre à l'essai
    Bonjour,

    J'ai revu mon code j'ai finalement fait un switch case pour gérer la rotation, je voulais savoir ce que je dois mettre en paramètre lorsque je fais l’appelle à la fonction depuis une autre classe.
    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
    void OpenGL::keyPressEvent(QKeyEvent *event)
    {
        float mat[16];
          glGetFloatv (GL_MODELVIEW_MATRIX,mat);
     
      switch(event->key())
             {
                 case Qt::Key_Left:
                     glRotatef(1,0,-1,0);
                     break;
     
                 case Qt::Key_Right:
                       glRotatef(1,0,1,0);
                     break;
     
                 case Qt::Key_Down:
                     glRotatef(1,1,0,0);
                     break;
     
                 case Qt::Key_Up:
                     glRotatef(1,-1,0,0);
                     break;
             }
     
    }

  8. #8
    Expert éminent sénior
    Qu'entends-tu par "vieille version d'OpenGL" ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  9. #9
    Membre à l'essai
    j'utilise un programme déja fais et je dois l'améliorer c'est pour cela que je ne voudrais pas tous changer, donc je dois m'adapter

  10. #10
    Expert éminent
    Citation Envoyé par dragonjoker59 Voir le message
    Qu'entends-tu par "vieille version d'OpenGL" ?
    Moi je parle de la version 1 et 2

  11. #11
    Expert éminent sénior
    Ben en OpenGL 2, tu avais déjà les shaders, et le pipeline fixe était déjà en dépréciation

    EDIT:
    C'est juste tellement n'importe quoi, d'utiliser des API dépréciées depuis plus de 20 ans...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  12. #12
    Membre à l'essai
    je veux juste savoir ce que je dois mettre en paramètre lorsque que je fais l'appelle de cette fonction depuis une autre classe

  13. #13
    Membre averti
    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
    void OpenGL::keyPressEvent(QKeyEvent *event)
    {
     
               if(event->key() == Qt::Key_Up)
               {
                   glRotatef(1,-1,0,0);
               }
                if(event->key() == Qt::Key_Down)
                {
                  glRotatef(1,1,0,0);
                }
                if(event->key() ==  Qt::Key_Left)
                {
                  glRotatef(1,0,-1,0);
                }
                if(event->key() ==  Qt::Key_Right)
                {
                    glRotatef(1,0,1,0);
                }
     
     
    }


    Je vais répondre à ta problématique. Déjà, fait gaffe aux paramètres de GlRotate, le premier est l'angle en degrés et les autres c'est x y z.
    Si il n'y a pas de rotation c'est parce que OpenGL applique la rotation nul part visiblement. Tu l'appliques pas à la matrice de vue de ta camera.
    Tu peux obtenir ta matrice de vue avec view = glGetFloatv(GL_MODELVIEW_MATRIX).
    Juste avant de passer dans les conditions, il faudra charger une matrice identité avec glLoadIdentity(). Tu appliques tes transformations (dans ton cas des rotations) en fonction de tes conditions que tu as écrites.
    Enfin tu multiplies ta matrice créée avec la matrice vue de la caméra.
    Tu fais à la fin glMultMatrix(view).
    Et il faut pas oublier de mettre à jour view avec view = glGetFloatv(GL_MODELVIEW_MATRIX) comme au début.
    Bon, c'est de la programmation graphique vielle école. Comme on te l'a dit ça se fait plus trop... Et tant mieux parce que je trouve ça moins explicite que de programmer en OpenGL "moderne".