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 cube à partir du repère global


Sujet :

OpenGL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Rotation d'un cube à partir du repère global
    Bonjour à tous.

    Je suis actuellement en train de développer un moteur physique 3D (seulement sur des cubes de même taille donc assez basique) et je viens tout juste de trouver la cause de tous mes problèmes.

    En effet j'ai besoin de placer chaque cube dans ma boucle de rendu en fonction de ses coordonnées (jusque là, pas de problème), et de ses angles de rotations rx, ry, rz par rapport aux trois axes X, Y, Z du repère global fixe.

    Le problème étant que chaque rotation modifie le repère et que les rotations suivantes ont donc lieux dans le repère local.

    Mon code initial était donc le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glPushMatrix();
    glTranslated(x, y, z);
    glRotated(rx, 1, 0, 0);
    glRotated(ry, 0, 1, 0);
    glRotated(rz, 0, 0, 1);
    glutSolidCube(SIZE);
    glPopMatrix();
    J'ai vu qu'il y avait plusieurs sujet qui traitait de ce problème mais aucun ne donne de solution qui me convienne.

    Le problème peut soit-disant être résolu grâce aux quaternions, en multipliant le quaternion de rotation à effectuer avec le quaternion courant, puis en transformant ce nouveau quaternion en matrice de rotation qu'il suffit d'appliqer.

    Malheuresement j'ai besoin de travailler en permanence sur les angles du repère global pour mon moteur physique donc j'aimerai construire à chaque nouvel affichage une matrice de rotation à partir de ces angles.

    J'ai donc pensé à cette solution :
    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
     
    CreateQuaternion(id, 0, 1, 0, 0);
    CreateQuaternion(rotx, rx, 1, 0, 0);
    CreateQuaternion(roty, ry, 0, 1, 0);
    CreateQuaternion(rotz, rz, 0, 0, 1);
    MultQuaternions(rot3, rotx, id); 
    MultQuaternions(rot2, roty, rot3); 
    MultQuaternions(rot, rotz, rot2);
    QuaternionToMatrix(rot, rotmatrix);
     
    glPushMatrix();
    glTranslated(x, y, z);
    glMultMatrixd(rotmatrix);
    glutSolidCube(SIZE);
    glPopMatrix();
    Mais sans résultat, les rotations dépendent encore du repère local.

    J'ai enfin pensé à une dernière solution, qui est d'effectuer ma 1ère rotation selon l'axe X normalement, puis de faire ma rotation selon Y en donnant les nouvelles coordonnées d'un vecteur de l'axe Y.

    Ce qui donne quelques chose de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    glPushMatrix();
    glTranslated(x, y, z);
    glRotated(rx, 1, 0, 0);
    glRotated(ry, 0, cos(rx), -sin(rx));
    glRotated(rz, "fonction compliquée de rx et ry", "compliqué", "et compliqué");
    glutSolidCube(SIZE);
    glPopMatrix();
    Je me suis certainement trompé dans les coordonnées du vecteur de l'axe Z global dans le repère local après 2 rotations, mais même en supprimant la dernière rotation, la rotation selon Y continue à dépendre du repère local et je n'arrive pas du tout à comprendre pourquoi...


    Edit : Après avoir réessayé cette 3ème solution, la rotation selon Y se fait parfaitement bien, c'est en fait la rotation selon X qui dépend du repère local ! Je crois vaguement comprendre pourquoi mais j'ai vraiment aucune idée pour y résoudre pour le moment.


    Si quelqu'un a une solution, ou pourquoi pas une matrice de rotation toute prête, je serais très intéressé, d'autant plus que je commence à désespérer...

    J'avais pas vraiment l'intention de rester coincé sur un problème graphique pour réaliser mon moteur physique!

    Merci d'avance!

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    je rencontre actuellement un problème similaire
    as-tu trouvé une solution ?

Discussions similaires

  1. [Transformer] Cube à partir d'une requête SQL
    Par Nadine dans le forum Cognos
    Réponses: 2
    Dernier message: 29/10/2008, 09h19
  2. Rotation d'un cube map
    Par ShevchenKik dans le forum OpenGL
    Réponses: 1
    Dernier message: 08/02/2008, 16h28
  3. Réponses: 4
    Dernier message: 15/10/2007, 18h56
  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. Construire un cube à partir de deux sommets opposé et un troisième point.
    Par Pragmateek dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 03/09/2006, 19h19

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