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 :

Gluunproject : mauvaise coordonnées après rotation


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur d'étude et réalisation
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'étude et réalisation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut Gluunproject : mauvaise coordonnées après rotation
    Bonjour,

    J'aimerais obtenir les coordonnées de ma souris dans ma scène 3D, cette partie je réussi à la faire grâce à la méthode 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
     GLdouble modelview[16];
        GLdouble projection[16];
        GLint viewport[4]; 
     
        // On remplis nos variables par les données d'OpenGL
        glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
        glGetDoublev(GL_PROJECTION_MATRIX, projection);
        glGetIntegerv(GL_VIEWPORT, viewport);
     
    	double wx1, wy1, wz1;
        GLfloat winY = viewport[3] - (GLint) y - 1;
     
     
    	GLint response = gluUnProject( x, winY, 0.0, modelview, projection, viewport, &wx1, &wy1, &wz1);
    Cette méthode fonctionne que quand je n'effectue pas de rotation. A partir du moment où je vais effectuer une rotation, et bien les coordonnées en X et en Y obtenues sont aberrantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glRotatef((GLfloat)angle,(GLfloat) ax,(GLfloat) ay,(GLfloat) az);		// Appel la methode de rotaion d'openGL
    Si quelqu'un voit d'où pourrait venir mon problème je lui en serais très reconnaissant, merci.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Par défaut
    Bonjour,

    Pouvez-vous nous poster le code où vous effectuez une rotation? Et nous préciser le genre de résultats que vous obtenez avec et sans cette dernière?

    -Omalab

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur d'étude et réalisation
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'étude et réalisation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    Voici le code qui exécute la rotation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    m_CameraQuat.GetAxisAngle(axis, angle);		// recupere l'angle et les axes de rotation a partir du quaternion global
     
     
    	float ax, ay, az;
    	// recupere les valeurs de l'Axe3D
    	ax = axis.getX();
    	ay = axis.getY();
    	az = axis.getZ();	
    	angle = angle *180/M_PI;
     
    	glTranslatef((GLfloat)m_CentreRotation.getX(),(GLfloat)m_CentreRotation.getY(),(GLfloat)m_CentreRotation.getZ()); 
    	glRotatef((GLfloat)angle,(GLfloat) ax,(GLfloat) ay,(GLfloat) az);		// Appel la methode de rotaion d'openGL
    	glTranslatef(-(GLfloat)m_CentreRotation.getX(),-(GLfloat)m_CentreRotation.getY(),-(GLfloat)m_CentreRotation.getZ());
    (je calcule mon angle de rotation en passant les angles d’Euler à mon quaternion et celui ci me redonne l'axe et angle de rotation).

    Et le code qui modifie les valeurs de rotation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    m_DeltaAnglex = (m_XOrigin - x);
    		m_DeltaAngley = (m_YOrigin - y);
    		m_XOrigin = x;
    		m_YOrigin = y;
    		m_Anglex=m_DeltaAnglex;
    		m_Angley=m_DeltaAngley;
    Pour les résultats, en cliquant au même endroit avant et après rotation :
    avant, x = -1,4767, y = -0.1343
    après, x = 153.61, y = -4.29

    Je calcule ma profondeur à partir de la moyenne de mon nuage de points affichés ( z = 72.9 ). Il est normal que les coordonnées ne soit pas les même vu que le repère a changé mais 153 fais quand même beaucoup de changement pour une petite rotation..

    Voila si ça peut vous aider

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Par défaut
    Pour moi le problème pourrait venir du fait que votre rotation est encadré par deux translations. Les transformations OpenGL fonctionnant sur le principe de piles de matrices, il se peut que vous n'ayez pas codé ce que vous voulez réellement obtenir. Cela reste à vérifier mais il me semble qu'une rotation s'applique sur le repère et non sur l'objet en lui même. SI tel est le cas il semblerait que la seconde translation ne vous fasse pas revenir au point initial où vous vous trouviez avant la première. (et encore une fois attention au fonctionnement en pile, la première translation qui s'applique au repère est celles ayant des composantes négatives)

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur d'étude et réalisation
    Inscrit en
    Avril 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur d'étude et réalisation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 22
    Par défaut
    En effet elle s'applique sur le repère, mais à l'origine les deux translation me servent pour simuler une rotation autour d'un point plutôt que d'un axe. Le sens de mes translation est donc choisi pour une certaine raison.
    J'ai quand même essayé d'enlever une translation afin de tester le résultat et j'obtiens la même chose.
    Je ne sais plus trop où chercher à vrai dire, au début j'ai pensé à ma matrice modelView qui n'était pas mise à jour, mais il semblerait que ça ne soit pas le cas, donc je suis à cours de pistes

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Par défaut
    J'avoue être perplexe également.. Visuellement la transformation est conforme à ce que vous attendez?

    Toujours dans la rubrique "le soucis vient de la pile de matrices", il manque dans ce que vous nous avez donné la matrice identité comme base de calcul. J'ai également lu attentivement votre réponse, je ne met pas en doute que vos composantes de rotations aient été choisie avec une bonne raison en tête mais je répète qu'effectuer une translation de 2 unité selon X sur votre repère, le faire pivoter puis lui appliquer une translation de -2 unités selon l'axe X ne vous fait pas revenir au point où vous étiez au départ... De ce fait les coordonnées de votre souris dans le nouveau repère ne peuvent être justes...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2008, 15h02
  2. Dimension d'une image après rotation
    Par Tyler Durden dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 03/02/2007, 19h08
  3. Réponses: 8
    Dernier message: 01/02/2007, 10h58
  4. AVL : calcul du déséquilibre après rotation
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/02/2006, 21h34

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