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 :

Rotation de la caméra


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut Rotation de la caméra
    Bonjour,

    Dans un programme openGl, si on fait un glRotate (ou bien un glTranslate), c la caméra qui fait la rotation (la translation) ou bien la scène??
    Et si la scène qui le fait, alors comment je peux faire une rotation ou une translation avec la caméra

    Merci d'avance

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 127
    Billets dans le blog
    149
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    Bonjour,

    Dans un programme openGl, si on fait un glRotate (ou bien un glTranslate), c la caméra qui fait la rotation (la translation) ou bien la scène??
    Et si la scène qui le fait, alors comment je peux faire une rotation ou une translation avec la caméra

    Merci d'avance
    Bonjour,

    C'est la scène qui bouge, lorsque l'on fait un glRotate.
    Plus précisément, c'est la matrice de monde. La camera se détermine (ou détermine) avec la matrice de vue (gluLookAt(), détermine la matrice de vue).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Bonjour,
    Merci pour la réponse

    Càd ci j'ai un point de coordonnées (1,0,0) et puis je fait une translation de 1 selon X,alors les cordonnées du point deviennent (2,0,0) ou bien reste les mêmes??
    En fait moi je veux faire des zoom, pan, et rotate sans modifier les coordonnées de mes points.

    Merci d'avance

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 127
    Billets dans le blog
    149
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    Bonjour,
    Merci pour la réponse

    Càd ci j'ai un point de coordonnées (1,0,0) et puis je fait une translation de 1 selon X,alors les cordonnées du point deviennent (2,0,0) ou bien reste les mêmes??
    En fait moi je veux faire des zoom, pan, et rotate sans modifier les coordonnées de mes points.

    Merci d'avance
    Les points restent les mêmes, car vous les avez passé grace à un glVertex() ou autre fonction tel que glVertexPointer(). Ils sont uniquement lus.
    Lorsque vous faites un glTranslate() / glRotate*() / glScale() seul une matrice (celle de l'objet) est modifiée. Cette matrice est appliqué, lors du dessin, aux vertexs par une simple opération:
    vertexPosition * matriceModele
    Voilà
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    En fait dans un espace 3D il n'y a pas de caméra à proprement dit. Ton point de vue se situe en fait toujours au centre du monde en (0, 0, 0) et tu ne peux pas le déplacer, par contre tu peux déplacer tous les objets qui composent ta scène ce qui donnera l'impression que c'est ton point de vue qui bouge (c'est une question de référentiel). Voilà ce qu'il se passe en interne en fait.

    Alors après tout dépend de là ou tu place ta transformation. Si tu fais ta transformation avant de dessiner tes objets et de sortes qu'elle s'applique à tous tes objets de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glRotate(...);
    glPushMatrix();
      // je dessine les objets de ma scène ici
    glPopMatrix();
    Alors cette rotation qui va transformer toute ta scène revient à changer l'orientation de ta caméra.

    Si tu veux déplacer ta "caméra" de 5 en X alors tu devra déplacer ta scène de -5 en X. Si tu veux tourner ta caméra de 12 dégrés autour de l'axe Y tu devra tourner ta scène de -12 degrés autour de l'axe -Y. Si tu veux tourner ta caméra et la translater tu devras ... translater puis tourner ta scène avec les propriétés énoncées précédemment.

    En général on encapsule le concept de caméra dans une classe. On lui affecte une matrice qui permet de la placer et l'orienter dans l'espace. Et on utilise cette matrice et la fonction "lookAt" (gluLookAt, glm::lookAt ...) pour transformer facilement la scène pour pouvoir la visualiser d'un certain point de vue, simplement en la passant à OpenGL avant d'afficher sa scène (la matrice "view"). En général la matrice qui permet de placer et d'orienter un objet dans l'espace s'appelle la matrice modelView car elle contient la matrice view qui est en fait la matrice de ta caméra généré par lookAt composée avec la matrice "model" qui place l'objet dans la scène.

    Effectuer des transformations OpenGL ne modifie pas tes points en mémoire. Des points temporaires sont créés par la carte graphique pour y appliquer tes transformations et les afficher mais les données en mémoire ne sont pas modifiées.

    Si tu veux savoir comment bien concevoir ta classe Camera sache qu'il y a beaucoup de topics sur ce forum qui en parle en long et en large (et surement même des tutoriels).

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 618
    Par défaut
    Attention toute fois à bien avoir fait un glMatrixMode(GL_MODELVIEW) pour être sûre de modifier la matrice ModlView, et non la Projection

    Un petit exemple simple pour comprendre ce qu'il se passe:

    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
     
    // met les matrices à l'identité
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
     
    // le vertex se trouve en (0, 0, 0) dans le repère courant et en (0, 0, 0) dans le repère écran (car la "camera" est à sa position d'origine)
    glVertex(0, 0, 0);
     
    // translate le repère courant de 0.5 suivant x
    // noter qu'on modifie la matrice ModelView car on a fait un glMatrixMode(GL_MODELVIEW); en dernier.
    glTranslate(0.5, 0, 0);
     
    // le vertex se trouve en (0, 0, 0) dans le repère courant, mais en 0.5, 0, 0 dans le repère écran (un peu sur la droite)
    glVertex(0, 0, 0);
    Je te conseil de faire un fonction drawTrihedron() qui affiche un trièdre pour comprendre dans quel espace tu es (je n'ai pas testé le code, il a peut être des fautes de frappe mais dans l'idée c'est ça):

    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
     
    void drawTrihedron()
    {
      // dessine l'axe axe X en rouge
      glColor4f(1, 0, 0, 1);
      glBegin(GL_LINES);
      glVertex3f(0, 0, 0);
      glVertex3f(1, 0, 0);
      glEnd();
     
      // dessine l'axe axe Y en vert
      glColor4f(0, 1, 0, 1);
      glBegin(GL_LINES);
      glVertex3f(0, 0, 0);
      glVertex3f(0, 1, 0);
      glEnd();
     
      // dessine l'axe axe Z en bleu
      glColor4f(0, 0, 1, 1);
      glBegin(GL_LINES);
      glVertex3f(0, 0, 0);
      glVertex3f(0, 0, 1);
      glEnd();
    }
    Et affiche ton trièdre pour voir comment est orienté ton espace courant.

    Je te conseil aussi de ne pas utiliser gluLookAt et autre gluPerspective tout de suite, histoire de bien comprendre comment bouge tes repères.

    Commence par faire des petite translation (0.5 sur chacun des axes) et de garder des coordonnée entre 0 et 1. Lorsque tes matrices sont à l'identité, ton espace visible est un cube centrée entre -1 et 1, donc si tu affiche un vertexe à (2, 0, 0) il ne sera pas visible.

  7. #7
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Par défaut
    Merci tout le monde, j'ai commencé à comprendre petit à petit

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

Discussions similaires

  1. Suivi de la rotation de la caméra
    Par neoirto dans le forum OpenCV
    Réponses: 2
    Dernier message: 18/03/2012, 10h53
  2. Rectification de rotation de la caméra
    Par neoirto dans le forum OpenCV
    Réponses: 0
    Dernier message: 08/01/2012, 15h51
  3. Problème lors de rotation de la caméra
    Par cayou66 dans le forum OpenSceneGraph
    Réponses: 8
    Dernier message: 28/08/2009, 11h24
  4. rotation de caméra
    Par alliance dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/02/2007, 03h59
  5. [débutant][c++] Axe de rotation caméra
    Par bornibus dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/02/2005, 10h01

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