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

  1. #1
    Membre à l'essai
    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
    Points : 16
    Points
    16
    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 régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    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 à l'essai
    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
    Points : 16
    Points
    16
    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 régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    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 à l'essai
    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
    Points : 16
    Points
    16
    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 régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2014
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    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...

  7. #7
    Membre averti Avatar de honosstoa
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 194
    Points : 354
    Points
    354
    Par défaut
    Salut,

    j'avais eu le même problème avec mon jeu: http://www.developpez.net/forums/d13...escorteur-1-a/
    La caméra doit suivre le perso et tourner autour (et les ennemis doivent avoir leur propre rotation...)

    Comme le dit Omalab ta 2e translation ne te fais pas revenir au point de départ, pour ça j'avais 2 trucs: (j'espère que ça t'aide un peu sinon j'aurais l'air bête ^^ )
    - tu calcules toi même la translation inverse, moi j'avais qu'une rotation suivant l'axe normal au sol donc c'était pas trop dur, toi si ta 3 axes ça sera moins marrant.

    -soit tu fais:
    -ta translation
    -ta rotation
    -tu affiche/ou calcules ce que tu veux
    -ta rotation inverse
    -ta translation inverse
    -affichage d'objets statique et calculs de tout plein de choses ^^
    moi j'avais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    deplacer_ennemi(personnage[0].posx+100,personnage[0].posz);// calcul du chemin des ennemis
     
     	 gluLookAt(personnage[0].posx-4,1+y,personnage[0].posz,   personnage[0].posx-2,0.9+y+vuey,personnage[0].posz      ,0,1,0);//la camera suit le perso
        glTranslatef (personnage[0].posx+100,0,personnage[0].posz );//distance camera/perso
        glRotated(angley,0,1,0);// angle de la camera: TOUT doit tourner autour du perso
        glRotated(90-angley+angle*180/3.14,0,1,0);   //angle propre au personnage 
    //afficher perso	
    afficher_anim(tabperso,tabperso_place,tabperso_max,anim,anim_place,anim_max2,texture2,SDL_GetTicks(),personnage[0].debutanim,personnage[0].etat,personnage[0].infoanim[personnage[0].etat],1);  
        glRotated(angley-90-angle*180/3.14,0,1,0);
        glTranslatef (-personnage[0].posx-100,0,-personnage[0].posz ); //après ça on peut afficher le reste
        dessiner_repere();
        afficher_sauvegarde(tabmap,tabmap_place,tabmap_max,texture1);//affichage de la map
    Bon maintenant avec unity j'ai plus trop de soucis...

  8. #8
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Et bien oui justement ma transformation est parfaite. Je n'ai pas trouvé d'autre moyen de "simuler" la rotation autour d'un point dans un espace 3D étant donné qu'un rotation 3D se fait autour d'un axe, du coup c'était la meilleure méthode pour le moment. Je suis tout de même preneur si vous avez une autre manière

    Ma matrice modelview est initialisée à l'identité juste avant la rotation. Je comprend que mes coordonnées ne soit pas les même ce qui es normal puisque l'on fait une rotation.
    Mais le truc c'est que pourquoi dans le plan XY (si on ne fait pas de rotation donc) cela marche bien..

    honosstoa, je vais essayer de faire ce que tu me dis mais le truc c'est que je n'utilise pas glulookat ^^ c'est un peu plus chiant en fait j'ai juste un point de position de la camera et un point de rotation et je fais mes transformations à partir de cela,
    Merci pour le coup de main quand même!

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par RMaxime Voir le message
    Et bien oui justement ma transformation est parfaite.
    Donc si ce qui est visible est bon, c'est ce que l'on ne voit pas qui déconne : le repère.

    Difficile d'être plus clair que cela, votre rotation est ce qu'elle est et si elle répond à votre besoin aucune raison d'en changer. Vous devez seulement calculer les coordonnées dans le même repère si voulez pouvoir les comparer (sinon cela reviendrait à comparer des carottes avec des patates et ce n'est pas du tout pareil... Mais alors pas du tout). Si implémenter la solution de honosstoa ne vous tente pas plus que ça (et je vous comprends, les maths c'est mauvais pour la santé) vous pouvez peut-être regarder du coté des commandes telles que Push/PopMatrix?

  10. #10
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    C'est que j'ai du mal à visualiser donc pas facile mais la je vois bien ce que vous dites. Le truc c'est que si je met un push et popMatrix et bien la transformation ne sera pas visible du coup.

    Je vais essayer de voir en fonction des repères mais vraiment pas facile à visualiser surtout quand on aime pas les maths en effet
    Peut être que si je sauve ma matrice d'origine je pourrais revenir à une bonne rotation, je vais tenté ^^.

  11. #11
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Du coup j'ai testé en faisant simplement une rotation autour du centre (0, 0, 0) et le problème est le même, le gluunproject ne retrouve pas les bonnes coordonnées quand je fais une rotation donc le problème ne vient pas de mes translation..
    Petit mystère là ..

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par RMaxime Voir le message
    Du coup j'ai testé en faisant simplement une rotation autour du centre (0, 0, 0) et le problème est le même, le gluunproject ne retrouve pas les bonnes coordonnées quand je fais une rotation donc le problème ne vient pas de mes translation..
    Petit mystère là ..
    Le repère subis tout de même une transformation, pour moi cela ne confirme ni n'infirme rien.

    Je ne comprends pas votre test fonctionnel alors je vais vous donner un exemple. Mettons que vous vous ayez affiché sur votre écran un carré rouge au centre de votre quart supérieur droit. Vous cliquez en son centre et obtenez les coordonnées mettons : (0.5, 0.5) si les bornes de votre écran sont [-1;1].

    Vous appliquez à votre repère une rotation autour du centre de l'écran (0, 0) en gros de pi/2 (intuitivement) ce qui devrait vous faire visualiser un carré au centre de votre quart inférieur gauche. Vous cliquez alors une nouvelle fois en son centre et vous relevez les coordonnées.

    Vous attendez vous à obtenir (-0.5 ,- 0.5) ou des coordonnées identiques (0.5 , 0.5) ?

  13. #13
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut
    Oui, je suis bien d'accord je me rends bien compte que je n'ai pas du bien assimiler cela, pour moi le carré serait de coordonnée similaire.
    J'explique mon raisonnement, si je fais une rotation je change la matrice modèle view (dites moi si je me trompe) et donc la rotation se fait bien dans le repère objet, or comme je fait une rotation de pi/2 et bien l'axe des X devrait se retrouver verticale (et le carré en 0.5, 0.5 mais bien a gauche) non ?

    Dans mon application je fais la rotation et je reconstruit le nuage de points après, je ne sais pas si ça peut jouer quelque chose.

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

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

    Informations forums :
    Inscription : Avril 2014
    Messages : 46
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par RMaxime Voir le message
    Oui, je suis bien d'accord je me rends bien compte que je n'ai pas du bien assimiler cela, pour moi le carré serait de coordonnée similaire.
    J'explique mon raisonnement, si je fais une rotation je change la matrice modèle view (dites moi si je me trompe) et donc la rotation se fait bien dans le repère objet, or comme je fait une rotation de pi/2 et bien l'axe des X devrait se retrouver verticale (et le carré en 0.5, 0.5 mais bien a gauche) non ?
    Oui j'aurais tendance a penser comme ça aussi.

    Dans mon application je fais la rotation et je reconstruit le nuage de points après, je ne sais pas si ça peut jouer quelque chose.
    Il faut alors s'assurer que la transformation est toujours effective au moment où votre fonction pour récupérer vos coordonnées souris est appelée.

    Je commence à être à court d'idée désolé.

  15. #15
    Membre à l'essai
    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
    Points : 16
    Points
    16
    Par défaut Edit
    Oui oui elle l'ai !

    Ce n'est pas grave merci quand même, j'ai mieux compris le système de matrice du coup. Je ne vois pas non plus ou chercher maintenant, tant pis.

    Je vous souhaite une bonne continuation, et merci pour l'aide

    Bon et bien j'ai trouvé le problème, un truc vraiment bête !
    En fait la rotation s'effectuait parfaitement, c'est juste que j'affichais un point (pour le centre de rotation) et c'est celui ci qui ne s'affichait pas au bon endroit (problème de profondeur), cela ne m'était pas du tout venu à l'esprit.

+ 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 84mickael 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