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 d'un repère à un autre


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut Rotation d'un repère à un autre
    Bonjour,

    Je suis actuellement en DUT Informatique, et j'ai un projet OpenGL (un jeu vidéo) à faire. C'est un jeu de shoot spatiale en vue cockpit

    Mon problème vient du fait que je voudrait attacher le cockpit à la caméra.
    Pour désigner mon vaisseaux (et tout les mobiles), j'ai 3 vecteurs dans ma classe Mobile : Direction (0,1,0 de base), normal(0,0,1), orthogonal(1,0,0), tout les trois normé, qui forme donc une nouvelle base vectorielle.

    Quand le vaisseau se déplace les vecteurs subissent une rotation : autour de l'axe normal pour mouvement de souris horizontale, autour de l'orthogonal pour les verticaux, et autour de la direction pour le roulis.

    Mes déplacements doivent être bien codé puisque quand dans le gluLookAt j'utilise position du mobile, position + direction, normal, ma vue se deplace très bien dans ma scene, fluide, sans probleme.

    Le probleme vient quand je veut placer le modèle 3D, je n'arrive pas a trouver les bon angle et axe pour les glRotate...

    - Y'a t'il des équations pour pouvoir faire correspondre les axe d'un repère (celui de l'objet quand il est en 0,0,0, regardant vers 0,1,0 et avec pour normal 0,0,1) à ceux d'un autre (celui de mon mobile)? Matrice etc... exprimer les coordonnée des points de mon modèle dans celle de mon mobile je sais faire, un bête changement de repère, mais les repositionnées ensuite? (sachant que mon modèle est charger sous forme de liste d'affichage, je ne peut pas changer directement les coordonnées de mes points...)

    - Sinon une astuce pour trouver les angles qui permettrait de faire les rotations de manière a repositionner le repère de l'objet comme celui du mobile?

    Je sais que c'est simple normalement, mais la je sèche, peut être de trop y travailler dessus, donc je prendrai n'importe quelle début de pistes. Même si mon explication est peut être un peu confuse.

    Merci d'avance!

  2. #2
    Invité
    Invité(e)
    Par défaut
    J'ai eu le même problème que toi il y a des années, ca s'appelle le gimbal lock. Tu ne peux pas t'en sortir avec un glRotate, il te faut utiliser les quaternions.

    C'est à dire que chacun de tes mobiles à un quaternion que tu peux éventuellement transformer en matrice 3x3 pour trouver les vecteurs droite, haut et avant (ce seront les colonnes de la matrice).

  3. #3
    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
    Je te conseillerais d'oublier tes vecteurs et d'utiliser une matrice pour le positionnement et l'orientation de ton objet (au début tu vas croire que ça va être plus compliqué et plus long et enfaite quand tu vois que tout roule parfaitement avec tu pourras plus t'en passer), et quand tu dois faire des rotations tu fais tes calculs avec des quaternions pour éviter le gimbal lock comme décris par ponce.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Par défaut
    Le problème étant que le jeu est pas mal avancé, et ça nous referais recorder une bonne partie si on devait repasser par une matrice...Mais si il faut on aura pas vraiment le choix. Seulement je ne voit pas du tout la forme que cette matrice devrait avoir...

    N'y a t'il pas une façon de trouver un axe unique entre les deux systèmes qui serait l'axe de rotation? De manière à ne faire qu'un seul glRotate? Le gros avantage de mon système à 3 vecteurs, c'est que je peux facilement faire les rotation avec de bête matrice de rotation autour d'un axe arbitraire, ce qui justement m'évite le gimbal lock. La preuve ma camera elle se déplace très bien dans ma scène, sans jamais se bloquer, je peux faire des looping etc...

    En tout cas merci de vos réponse.

    EDIT: J'ai peu être une piste, une idée qui m'est venu, mais je ne sais aps si elle est valable :

    Si j'additionne les deux vecteurs "coupant" le système ( le vecteur (1,1,1) pour le système de coordonnée basique par exemple) je vais obtenir un 3eme vecteurs qui sera l'axe de rotation entre les deux non? Si je fait faire une rotation de mon système basique autour de cette axe (qui le coupe par (0,0,0), puisque ce sont tout des vecteur, donc avec la même "origine") je devrait obtenir mon autre système de coordonné. Le problème maintenant, c'est de trouvé l'angle de rotation pour passé de mon 1er système à mon deuxième, et ça je ne sais pas si on peut le retrouver...

    EDIT 2 :




    un petit schéma pour mieux comprendre : comment calculer l'angle qui par rotation autour du vecteur noir permet de passer d'un vecteur bleu à l'autre.

  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
    Euh nan ! utilise plutôt le produit vectorielle ! cela te donnera un vecteur : la normale au plan créé par tes deux vecteurs bleus et tu peux t'en servir comme d'un axe de rotation. M'enfin j'ai pas tous compris à ton problème mais ce genre de calculs me laisse penser que tu t'y prends pas de la bonne façon

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 176
    Par défaut
    L'autre solution c'est d'oublier le lookAt, et de deplacer ton monde entier a la place de la camera+ cockpit



    Sinon techniquement tu dois pouvoir recuperer la matrice que genere ton lookAt,

    Après normalement, tu push, tu charge cette matrice, tu charge ton modele, tu pop, et normalement il est a la bonne place.

    Ceci dit faudra ptet charger l'inverse de la matrice ou la transposée, ça remonte un peu et je crois qu'il y avait une feinte, mais rien de bien méchant.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sirithang Voir le message
    N'y a t'il pas une façon de trouver un axe unique entre les deux systèmes qui serait l'axe de rotation? De manière à ne faire qu'un seul glRotate?
    Tu ne peux pas t'en sortir avec en faisant un appel à glRotate.

    Une bonne idée est de garder l'état précédent de ta rotation, faire des petites rotations de tes vecteurs les uns autour des autres puis orthonormaliser ton repère (dans le cas de trois vecteurs, vérifier qu'ils sont orthogonaux et unitaires). C'est ce que tu fait puisque tu y arrive pour la caméra.

    Tu pourra trouver alors la matrice world de ton objet en mettant ces trois vecteurs en colonne. Puis glMultMatrix().

    Après tu peux utiliser ce que tu veux pour représenter ta rotation elle-même : trois vecteur unitaires, quaternion, ou matrice 3x3. Donc oublies les quaternions ou les matrices si tu n'en veux pas.

    (EDIT : ca ne marche que pour des petites rotations successives, l'orthonormalisation ne marche que sous cette hypothèse).
    Dernière modification par Invité ; 02/03/2010 à 10h37.

Discussions similaires

  1. Calcul rotation translation changement repère
    Par on2101 dans le forum Mathématiques
    Réponses: 2
    Dernier message: 03/11/2011, 20h11
  2. Matrice rotation, changement de repère
    Par stick25 dans le forum MATLAB
    Réponses: 5
    Dernier message: 03/06/2010, 17h53
  3. Rotation d'un cube à partir du repère global
    Par MugenGL dans le forum OpenGL
    Réponses: 1
    Dernier message: 03/05/2008, 17h11
  4. Repère local, repère global et rotation
    Par Licorna dans le forum Mathématiques
    Réponses: 3
    Dernier message: 10/05/2007, 21h56
  5. Réponses: 4
    Dernier message: 20/03/2006, 21h26

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