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 :

Gestion du clavier


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut Gestion du clavier
    Salut,
    J’ai un problème avec les interuption glut :^/
    J’aimerai pouvoir me déplacer dans ma scène 3d. Pour cela, un simple « glTranslatef » suffi seulement, quel interuption utiliser ? Si j’utilise glutKeyboardFunc, le déplacement n’est pas celui souété car il faut attendre un certain moment avec la touche enfoncé avent que la fonction ce lance en boucle.
    Une solution sous glu été d’utiliser les interruptions WM_KEYDOWN et WM_KEYUP dans WindowProc pour détecter l’appuie et le relâchement. Seulement, je ne croi pas qu’il existe un équivalent d’une interruption de relâchement d’une touche sous glut :^/
    Dans un ancien poste, shenron666 m’avait dit que glu et glut pouvaient fonctionner ensemble ce que d’ailleurs je fais. Mais es qu’il est aussi possible d’utilier en meme temps des interuption de glu et glut dans le meme programme ? car je n’ai pas reussi a faire cela :^/
    Ou bien si cela n’est pas possible existe-t-il un sollution a mon problème ?

    Merci

    Code actuelle :
    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
     
    int main(int argc,char **argv)
    {
      glutInit(&argc,argv);
      glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
      glutInitWindowPosition(200,200);
      glutInitWindowSize(640,480);
      glutCreateWindow("window");
     
      // Initialisation d'OpenGL
      glClearColor(0.0,0.0,0.0,0.0);
      glColor3f(1.0,1.0,1.0);
      glEnable(GL_DEPTH_TEST);
     
      // enregistrement des fonctions de rappel
      glutReshapeFunc(Reshape);
      glutDisplayFunc(Draw);
      glutKeyboardFunc(GestionClavier);  	
     
      // Entree dans la boucle principale glut
      glutMainLoop();
      return 0;
    }
     
    void GestionClavier(unsigned char key, int x, int y)
    {
      If (key == ‘z’)
        y++ ;
    }

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut, jette un coup d'oeil dans la doc à glutSetKeyRepeat(GLUT_KEY_REPEAT_OFF); je crois que ca peut t'aider.
    Sans oublier de le remettre à on avant de quitter.

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    C'est l'inverse faut le mettre à on et ensuite le remettre à off.

  4. #4
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ok, merci pour tes réponses =) malheureusement, il y a encore un petit souci... avec cette solution, il est impossible de resté appuyé sur plusieurs touche a la foi... aurai tu une autre solution pour résoudre ce problème ?

    Merci

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 606
    Par défaut
    mauvaise solution à la base, tu ne dois pas réagir en fonction d'une touche qui reste appuyée, si tu regardes dans les tutoriaux sur le net, voici comment ils font :

    tu as un buffer qui va contenir les infos dont tu as besoin, disons que tu veux les 4 directions, tu crées un
    bool buffer[4] = {false}; // 0->3 = Haut-Bas-Gauche-Droite
    ta fonction qui détecte l'appui sur les touches du clavier va modifier dans ce buffer le booléen qui correspond à la touche appuyée
    il faut une fonction callback GestionClavier qui soit appelée lorsqu'une touche est appuyée et relachée
    lorsque la touche haut sera appuyée, GestionClavier va faire buffer[0] = true;
    et lorsque la touche Haut sera relachée, GestionClavier va remettre à false le booléen
    dans ta boucle principale tu regardes quelles touches sont appuyées
    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.

  6. #6
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    shenron666> Oui exactement, le probleme est justement la...
    glut n'a pas, ou je n'ai pas vu en tout cas, d'événement qui correspond a la touche relâchée :’(

  7. #7
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ha si ! Tien...
    Il existe une fonction pour détecter le relâchement d'une touche :
    - glutKeyboardUpFunc(...);
    - glutSpecialUpFunc(...);
    Je croyais quelle n'exister pas sur glut car la dernier foi j'avais passé plusieurs heur a chercher cette fonction et je ne l'avais pas trouvé.

    Merci pour votre aide =)

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 606
    Par défaut
    glutKeyboardUpFunc :

    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
    bool bufferClavier[4] = {false};
     
    int main(int argc,char **argv) 
    { 
      glutInit(&argc,argv); 
      glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
      glutInitWindowPosition(200,200); 
      glutInitWindowSize(640,480); 
      glutCreateWindow("window"); 
     
      // Initialisation d'OpenGL 
      glClearColor(0.0,0.0,0.0,0.0); 
      glColor3f(1.0,1.0,1.0); 
      glEnable(GL_DEPTH_TEST); 
     
      // enregistrement des fonctions de rappel 
      glutReshapeFunc(Reshape); 
      glutDisplayFunc(Draw); 
      glutKeyboardFunc(ClavierKeyPress); // callback touche appuyée
      glutKeyboardUpFunc(ClavierKeyRelease); // callback touche relachée
      // Entree dans la boucle principale glut 
      glutMainLoop(); 
      return 0; 
    } 
     
    void GestionClavier(unsigned char key, bool press) 
    { 
      If (key == ‘z’) 
        bufferClavier[0] = press; 
    } 
     
    void ClavierKeyPress(unsigned char key, int x, int y) 
    {
      GestionClavier(key, true);
    }
     
    void ClavierKeyRelease(unsigned char key, int x, int y) 
    {
      GestionClavier(key, false);
    }
    EDIT : tu as trouvé tout seul
    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 éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    ^^ oui, mais merci quand même pour cette exemple =)
    Par contre j'ai une petite dergniere question...
    Je suppose donc qu'il faudra mètre une fonction du tipe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void deplacement(void)
    {
        if (bufferClavier[0] == 1)
        {
            translatx = translaty + 0.1;
        }
    }
    et placer cette fonction dans l'événement glutDisplayFunc(...);
    Seulement, dans se cas, la rapidité du processeur graphique influera sur la rapidité de déplacement non ?
    Et suivent ou on se trouve dans la scène, si il y a beaucoup d'élément a afficher ou pas, la fréquence d'exécution de glutDisplayFunc(...); fluctuera, et la rapidité de déplacement fluctuera aussi... qu’en pense tu ?

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 606
    Par défaut
    Pour éviter que la vitesse de déplacement ne soit dépendante de la puissance de la machine, tu dois mesurer le temps avec des appels à GetTickCount() (sous Win32) qui va récupérer le temps en millisecondes écoulé depuis le lancement de windows

    je te donne un exemple à la volée, c'est basique et il vaut mieux passer par une classe si ton programme devient complexe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void deplacement(void) 
    {
        static DWORD lastTime = GetTickCount(); // un static qui conservera sa valeur après chaque appel
     
        DWORD newTime = GetTickCount(); // on récupère le temps actuel
        float moveFactor = (newTime - lastTime) / 1000.f; // on calcule un facteur basé sur le temps écoulé
        lastTime = newTime; // on mémorise le moment du dernier appel
     
        if (bufferClavier[0] == 1) 
        { 
            translatx = translaty + (1 * moveFactor); // on se déplace à 1 unité par seconde réelle
        } 
    }
    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.

  11. #11
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Ok, merci pour l'astuce =)

  12. #12
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    et sous glut c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    glutGet(GLUT_ELAPSED_TIME);
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 606
    Par défaut
    Toujours bon à savoir
    Thanks
    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.

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

Discussions similaires

  1. Gestion du clavier
    Par - Glop - dans le forum Général Python
    Réponses: 7
    Dernier message: 21/06/2006, 20h17
  2. [C#] Gestion évenements clavier
    Par Tips dans le forum Windows Forms
    Réponses: 9
    Dernier message: 19/04/2006, 21h29
  3. [MFC][VC++.NET]gestion évènement clavier
    Par Rafoo dans le forum MFC
    Réponses: 2
    Dernier message: 14/12/2005, 10h29
  4. gestion du Clavier
    Par benthebest dans le forum MFC
    Réponses: 13
    Dernier message: 07/05/2005, 23h39
  5. [MX]Optimisation de la gestion du clavier
    Par yacinechaouche dans le forum Flash
    Réponses: 8
    Dernier message: 18/04/2004, 03h13

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