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

GLUT Discussion :

Gestion mouvement OpenGl


Sujet :

GLUT

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut Gestion mouvement OpenGl
    Bonjour,

    j'essaye de déplacer un objet de façon fluide à l'aide du clavier ( j'appuie sur 'z' et mon objet avance...).
    Avant j'utilisais glutKeyboardFunc(), et donc dès que j'enfonçais la touche 'z' je jouais avec les incréménents de différentes variables.

    Le problème est que quand on utilise cette technique, l'objet bouge une fois, s'arrete 1/3 de seconde, puis avance de façon s'accadée ( comme quand on reste appuyé sur une touche dans un éditeur de texte ).

    J'ai lu sur le net qu'une solution est d'utiliser glutKeyboardUpFunc(), ainsi j'aurais fais quelquechose comme :
    void enfoncerTouche( unsigned char touche, int x, int y){

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    switch( touche ){
    case 'z' : avancer = true ;
    break ;
    case 'q' : reculer = true ;
    break ;
    case 'q' : tournerGauche = true ;
    break ;
    case 'd' : tournerDroite = true ;
    }
    }
    et donc quand 'z' = true dans une autre fonction je modifie ce qu'il faut pour faire avancer mon objet.
    Cependant j'ai deux problèmes :
    -Comment remettre mes valeur à false ? existe-il une fonction glutKeyboardDownFunc() ?
    -Je ne vois pas trop quand je pourrais faire appel à ma méthode "changeDirection" pour mettre à jour les données, car je suppose que tant qu'on reste appuyer sur l'une de ses touches on reste dans la fonction "enfoncerTouche".

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    -Comment remettre mes valeur à false ? existe-il une fonction glutKeyboardDownFunc() ?
    Ben... glutKeyboardFunc()

    -Je ne vois pas trop quand je pourrais faire appel à ma méthode "changeDirection" pour mettre à jour les données, car je suppose que tant qu'on reste appuyer sur l'une de ses touches on reste dans la fonction "enfoncerTouche"
    Non, ta fonction enfoncerTouche ne sera appelée qu'une seule fois au moment où tu enfonceras la touche (heureusement sinon ça gèlerait complétement le programme).

    Tu avais aussi toutes ces réponses dans la FAQ :
    http://jeux.developpez.com/faq/openg...UT_evt_clavier

  3. #3
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut
    Ah oui juste ^^, en fait, j'avais déjà lu la FAQ, mais je ne l'avais pas bien compris à la première lecture ( je dois passer trop de temps derriere l'écran ).

    j'ai donc changé mon code, et ça marche enfin, merci beaucoup,
    par contre je fais appel à l'affichage dans idle et je ne suis pas sur que ce soit optimal de faire ça.
    Une autre chose qui me perturbe, c'est que la vitesse du jeu varie fortement en fonction de la taille de la fenetre..., mais je vais d'abord aller voir sur la FAQ puis sur le forum si la question n'a pas déjà été posée ^^.

    J'ai donc créé trois fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void relacherTouche( unsigned char touche, int x, int y){
     
    switch( touche ){
    case 'z' : avancer = false ;
    break ;
    case 's' : reculer = false ;
    break ;
    case 'q' : tournerGauche = false ;
    break ;
    case 'd' : tournerDroite = false ;
    }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void enfoncerTouche(unsigned char touche,int x,int y)
    {
     
    switch( touche ){
    case 'z' : avancer = true ;
    break ;
    case 's' : reculer = true ;
    break ;
    case 'q' : tournerGauche = true ;
    break ;
    case 'd' : tournerDroite = true ;
    }
    }
    Le code qui suit fonctionne correctement dans mon ancienne version, je le met juste pour info.
    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 deplacementObjet(){
     
        if( avancer ){
          dx += 0.8*Cos[r]; 
          dz -= 0.8*Sin[r];
        }
        if( tournerGauche ){         
          r =r+8;
            if( r >=360 )
               r=0;
        }  
        if( tournerDroite ){         
          r -=8 ;
           if(r<0)  
              r=359;
        }
        if( reculer ){        
          dx -= 0.8*Cos[r];
          dz += 0.8*Sin[r];
        }
     
    }
    Puis je fais appel à la fonction deplacementObjet dans ma fonction d'affichage de la sorte :

    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
    void affichage()
    {
      /* Prise en compte des déplacements*/
      deplacementObjet();
      /* effacement de l'image avec la couleur de fond */
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      glLoadIdentity();
      gluLookAt(0.0,30.0,0.0,  0.0,0.0,0.0,  1.0,0.0,0.0); 
     
      /*Application des transfos de "deplacement" */
      glPushMatrix();
      glTranslatef(0.0 + dx,0.0,0.0+dz);
      glRotatef(r,0.0,1.0,0.0);
     
      /* Dessin de Teapot/Cube*/
      glColor3f(1.0,0.5,0.0);
      glutSolidTeapot(1.0);
      /*Dessin d'un cube*/
     
      glPopMatrix();
      glPushMatrix(); 
      glTranslatef(0.0 ,-1.0,1.0);
      glColor3f(1.0,0.0,0.0);
      glutWireCube(2.0);  
     
      glFlush();
     
      glutSwapBuffers();
    }
    et pour finir afin de mettre constemment à jour l'affichage et les modifications je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void idle()
    {
    glutPostRedisplay();
     
    }

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    par contre je fais appel à l'affichage dans idle et je ne suis pas sur que ce soit optimal de faire ça
    Si, aucun problème.

    Une autre chose qui me perturbe, c'est que la vitesse du jeu varie fortement en fonction de la taille de la fenetre...
    Si tu es limité par le fillrate (taux de remplissage des pixels -- ce qui arrive souvent), alors il est normal que le framerate soit directement proportionnel à la taille de la fenêtre -- du nombre de pixels.

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Despak
    Puis je fais appel à la fonction deplacementObjet dans ma fonction d'affichage de la sorte :
    Tu ferais mieux de le sortir. Cela te permettra d'afficher les éléments sans les bouger et bouger les éléments sans les afficher.

    Je ne sais pas si le deuxième cas arrive souvent, mais si tu veux mettre le jeu en pause, la séparation facilitera ta vie.

    Aussi pour ton déplacement, prend en compte le temps, ce sera nettement plus intéressant.

    Jc

  6. #6
    Membre averti
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Par défaut
    Pour résoudre les 2 problèmes, tu penses que si je met ma fonction deplacementObjet dans la fonction de glutTimerFunc() comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    glutTimerFunc(60, deplacementObjet(), 0){ 
    // rien à mettre je supp vu que je fais appel à deplacementObjet()
    }

    Ainsi je sors deplacementObjet, et je "temporise" ma méthode .

    ps : j'ai jamais utilisé glutTimerFunc donc je supp que c'est comme ça .

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Despak
    Pour résoudre les 2 problèmes, tu penses que si je met ma fonction deplacementObjet dans la fonction de glutTimerFunc() comme ça :

    glutTimerFunc(60, deplacementObjet(), 0){
    // rien à mettre je supp vu que je fais appel à deplacementObjet()
    }


    Ainsi je sors deplacementObjet, et je "temporise" ma méthode .

    ps : j'ai jamais utilisé glutTimerFunc donc je supp que c'est comme ça .
    Non, je parle de ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        if( avancer ){
          dx += 0.8*Cos[r]; 
          dz -= 0.8*Sin[r];
        }
    Ceci suppose que tu avances au même rythme toujours. Or sur un autre ordinateur, le nombre d'images par seconde ne sera pas la même le perso avancera donc plus rapidement.

    Je te propose donc d'ajouter un facteur temps dans le calcul pour que sur n'importe quel ordi ton perso bouge selon le même rythme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        if( avancer ){
          inter = tempsactuel - ancientemps;
          dx += 0.8*Cos[r] * inter * vitesse; 
          dz -= 0.8*Sin[r] * inter * vitesse;
          ancientemps = tempsactuel;
        }
    Faudra juste trouver une fonction de temps adaptée.
    Jc


    Jc

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2008, 10h36
  2. Concilier gestion avancée de vertices et API OpenGL
    Par GaldorSP dans le forum OpenGL
    Réponses: 4
    Dernier message: 30/08/2005, 13h11
  3. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  4. Gestion de collision et OpenGL
    Par kanux dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 08/01/2005, 21h07
  5. Gestion de la souris sous opengl
    Par MaxPayne dans le forum GLUT
    Réponses: 2
    Dernier message: 05/12/2004, 16h35

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