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

Moteurs 3D Discussion :

[OGL]Représentation des transformation


Sujet :

Moteurs 3D

  1. #1
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut [OGL]Représentation des transformation
    Bonsoir à tous!

    Bon, mon moteur avance bien, mais je bloque sur une question de conception.

    Comment représenter les transformations dans mon moteur? Pour le moment, je stock un vecteur pour la position, un pour la rotation et un pour l'échelle.

    J'utilise ensuite tout ça à coup de glTranslate/Rotate/Scale. Tout fonctionne.

    Maintenant, durant mes cours, mes profs insistent sur l'importance et la vitesse de l'algèbre linéaire. OK, c'est bien beau tout ça, mais au final, par exemple si je veux appliquer une rotation à un objet, vaut-il mieux appliquer un quaternion? Une matrice?

    Bref, même si je comprend bien les matrices de transformation, les quaternion, les angles d'Euler, je n'arrive pas à voir lequel/lesquels de ces outils utiliser pour représenter mes objets ou comment les faire fonctionner ensemble....

    Si j'ai une classe Objet par exemple avec la liste des points/faces dans l'espace local, quel est le plus efficace pour représenter les transformations qu'ils doivent subir avant l'affichage et mettre à jour cela?

    Ce que je vois:
    * Continuer avec des vecteurs, pas pratique quand on arrive à implémenter des rotations
    * Utiliser uniquement une matrice
    * Utiliser un mélange de tout ça.

    Bref, je nage...

    Merci d'avance,
    seeme

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    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 : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Salut,

    Je te conseil d'utiliser des matrices et de tous passer en coordonnées homogènes (google est ton amis si tu ne sais pas ce que c'est ). Très grossièrement, les coordonnées homogène te permettent de gérer toutes les transformations (rotation, homothétie, translation, etc...) grâce à des matrices 4x4. Appliquer une transformation à un vecteur revient à multiplier ce vecteur par la matrice. Composer 2 transformations revient à multiplier 2 matrices, etc...

    Les moteurs graphiques évolué utilisent en général des quaternions surtout pour des raisons de performances et stabilité numérique. Etant donné que tout quaternions peut être modélisé par une matrice de transformation (l'inverse n'étant pas vrai !), autant utiliser uniquement des matrice qui sont plus simple à manipuler.

    Donc fait des recherches sur les coordonnée homogène et préfère des appels glMultMatrix au lieu des glTranslate, rotate etc... Ca te donne plus de maitrise et de compréhension sur ce que tu fait.

    Bon courage
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  3. #3
    Membre éprouvé 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
    Points : 1 087
    Points
    1 087
    Par défaut
    Pour stocker les transformations, utilise des matrices homogènes (4x4) comme expliqué ci-dessus (côté OpenGL ça te simplifie la tâche tu n'as qu'à faire un glMultMatrixf(...) au lieu de glTranslatef, glRotatef, glScalef).

    Par contre, et c'est là ou je diverge de pyros, je t'encourage vivement à utiliser les quaternions pour gérer tes rotations. Si le format final d'une transformation est une matrice, l'application d'une rotation doit être un quaternion. En gros si tu as un objet qui à une matrice "model" (la matrice qui contient les transformations de ton objet) et que tu dois lui appliquer une rotation, alors tu dois passer par un quaternion pour calculer la matrice résultante.
    model *= quaternion;
    Outre les qualités des quaternions décrites précédemment, leur intérêt majeur est d'éviter le gimbal lock lors des rotations, qui peut être un effet vraiment indésirable lorsque l'on tourne sur plusieurs axes.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    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 : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    alors tu dois passer par un quaternion pour calculer la matrice résultante.
    Cela marche aussi en utilisant une matrice de rotation.

    De plus, le gimbal lock est un problème lié aux angle d'Euler, et non au matrices. L'argument avancé en général est qu'un quaternion défini une rotation atour d'un axe précis, alors qu'une matrice défini une rotation autour d'un des axe X, Y ou Z. Ce qui est faux, une matrice peut très bien définir une rotation autour d'un axe arbitraire (Ok, ça demande plus de boulot mais il suffit d'exprimer la matrice de rotation dans un repère adéquat).
    Le problème vient du fait que bien souvent on utilise des matrices de rotation calquées sur les angles d'Euler, d'où le problème de gimbal lock qu'on attribut trop hativement aux matrices.

    Je reste cependant d'accord avec oxyde356 pour dire que les quaternions sont particulièrement bien adapté aux rotations, mais je pense qu'il faut d'abord maitriser les matrices de transformations avant de passer aux quaternions qui restent, pour moi, seulement une optimisation.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  5. #5
    Membre éprouvé 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
    Points : 1 087
    Points
    1 087
    Par défaut
    Oui, c'est histoire d'éviter cette erreur qui tient plus à l'oubli de la réelle puissance des matrices qu'autre chose. Erreur qui risque d'arriver si seeme est débutant dans ce domaine.

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/11/2006, 02h15
  2. [Maths] Calculs invariants à des transformations
    Par mathieu_t dans le forum Mathématiques
    Réponses: 16
    Dernier message: 26/04/2006, 18h50
  3. [XSL]ordre des transformations...
    Par snoop dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 30/03/2006, 11h20
  4. reprsentation des données
    Par zidenne dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/11/2005, 08h24
  5. [Normes] représentation des pourcentages
    Par Bowen dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 19/10/2004, 14h42

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