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 :

Bouger un objet avec glTranslate et gérer la caméra


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut Bouger un objet avec glTranslate et gérer la caméra
    Bonjour à tous,

    Voila ma question,

    Lorsque l'on bouge un objet avec glTranslate sur l'axe Z celui ci s'éloigne de plus en plus de nous et devient de plus en plus petit pour finir par disparaitre.

    Comment doit-on faire pour que la caméra reste derriere l'objet (à la maniére d'un jeu de course de voiture par exemple) car dans mon cas la caméra reste stationnaire ?

    Des fonctions comme glulookAt, glPushMatrix et glPopMatrix peuvent-elles servir dans ce cas ?

    Merci d'avance,

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    Tout est relatif.

    une voiture qui se deplace de 1 m en avant donne exactement la meme chose qu une camera qui s'eloigne de 1 m de la voiture.

    Le but de la matrice modelview, c est de prendre un vertex exprime dans le repere de l objet (local) et de l exprimer dans le repere de la camera.

    En general, on ne connait pas directement cette transformation , mais on connait :

    - la transformation voiture -> repere global (et reciproquement)
    - la transformation camera -> repere global (et reciproquement)

    la transformee que tu cherches est donc une concatenation des deux transformee :

    voiture -> global -> camera.

    Dans ton cas, tu aura simplement :

    glTranslatef(0,0,z);
    glTranslatef(0,0,-z);

    Donc en conclusion, avec une telle transformation, on ne voit pas que la voiture se deplace sans la presence de decors.


    gluLookAt(..) peut te permettre de position ta camera, et d indiquer vers ou elle regarde, donc cette fonction peut t aider.

    Quand a push/pop Matrix , elles sont utiles, mais leur utilisation ou non ne changera rien a ton probleme.

    Note: Placer ta camera juste derriere ta voiture avec se genre de transformation ne rendra pas un mouvement tres naturel, etant donne que la camera est STRICTEMENT immobile par rapport au vehicule

  3. #3
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut
    Merci bcp pour ta réponse,

    Donc en résumé si je place un objet au loin et que j'utilise
    glTranslatef(0,0,z);
    glTranslatef(0,0,-z);
    alors la voiture se rapprochera de l'objet "en restant de la même taille"
    (l'objet au loin deviendra lui de plus en plus gros).

    Mais en fait je me demande si on fait glTranslatef(0,0,z); puis glTranslatef(0,0,-z); cela ne s'annule t'il pas ?
    Peut-être que le glTranslate ne se fait pas sur la voiture mais plus au niveau du décors ?

    Dis moi si je me plante...

    merci

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    glTranslatef(0,0,z); // changement repere : globale -> local camera

    glTranslatef(0,0,-z); // changement repere : local voiture -> globale


    effectivement, ca s'annule et c'est finalement se qu on veut (on veut que la camera reste derriere la voiture ... ici le deplacement est carrement strict mais bon, c'est pas un probleme trivial la gestion d une camera*)


    en fait, dans le double glTranslate() precedent:

    la camera avance de X metres ainsi que la voiture (ligne 1)
    la voiture avance de X metres ainsi que la voiture (ligne 2)



    note:

    quand tu ecris :

    glTranslate(...A...)
    glTranslate(...B...)

    les vertex qui tu transmet dans glBegin()/End subissent d'abors la transformation B , puis la transformation A.

    On peut ecrire le pseudo-code de la facon suivante.

    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
     
    RenderScene(){
     
      glLoadIdentity();
     
      camera->setTransformGlobalToLocal();
     
      glPushMatrix();
         voiture->setTransformLocalToGlobal();
         voiture->draw();
      glPopMatrix();
     
     
      glPushMatrix();
         decors->setTransformLocalToGlobal();
         decors->draw();
      glPopMatrix();
     
    }











    *imagine une voiture qui roule sur une route bosselee, la camera va sauter avec ... il faut donc lisser le mouvement de la camera ... ou fournir un sac en plastique

  5. #5
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut
    Dans quelle mesure glPushMatrix et glPopMatrix interviennent-elles dans ton pseudo code ?

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    En fait, tu dois faire.

    Global->camera
    Local voiture->Global


    puis

    Global->camera
    Local decors->Global


    en se rappelant que le vertex subissent les transformations dans l ordre inverse ou elle apparaissent dans le code (ie. du bas vers le haut).


    comme la premiere partie (Global->camera) est commune pour tout objet de la chaine, au creer un "point de sauvegarde de l etat de la matrice courante"

    (glPush) On le restaure ensuite (Pop)


    on naurait aussi bien pu ecrire :

    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
     
     
    RenderScene(){
     
      glLoadIdentity(); 
      camera->setTransformGlobalToLocal();
      voiture->setTransformLocalToGlobal();
      voiture->draw();
     
     
      glLoadIdentity(); 
      camera->setTransformGlobalToLocal();
      decors->setTransformLocalToGlobal();
      decors->draw();
     
    }

  7. #7
    Membre confirmé
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 126
    Par défaut
    ok je vois,

    sa me parait plutôt logique une fois la solution sous les yeux...

    merci encore de ton aide

    a+

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    normalement, a ce moment, l admin du forum se manifeste et te demande de placer le post sur RESOLU

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

Discussions similaires

  1. Bouger une fenêtre avec un objet.
    Par LeoBeutel dans le forum Cpcdos
    Réponses: 3
    Dernier message: 27/03/2015, 23h29
  2. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 14h44
  3. nommer un objet avec une variable
    Par fatcat dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2005, 17h16
  4. Réponses: 2
    Dernier message: 05/07/2005, 18h40
  5. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 13h22

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