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 sur plusieurs axes


Sujet :

OpenGL

  1. #1
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut Rotation sur plusieurs axes
    Bonjour.

    Je suis actuellement en train d'essayer de faire une rotation sur plusieurs axes mais pas moyen d'y arriver. J'utilise glm pour ce faire et m'y prend actuellement de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glm::mat4 tmp = glm::translate(view_matrix, glm::vec3(m_pos.x(), m_pos.y(), m_pos.z()));
     
    if (m_rot.rotation() != 0.f)
        tmp = glm::rotate(tmp, m_rot.rotation(), glm::vec3(m_rot.x(), m_rot.y(), m_rot.z()));
    Pour le moment ca fonctionne bien mais ca me limite aussi pas mal. Je voudrais faire en sorte de pouvoir faire une rotation de 70 degre sur l'axe X et 180 degre sur l'axe Y par exemple. Pour ce faire, je pensais faire de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp = glm::rotate(tmp, 360.f, glm::vec3(m_rot.x() / 360.f, m_rot.y() / 360.f, m_rot.z() / 360.f));
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tmp = glm::rotate(tmp, m_rot.x(), glm::vec3(1.f, 0.f, 0.f));
    tmp = glm::rotate(tmp, m_rot.y(), glm::vec3(0.f, 1.f, 0.f));
    tmp = glm::rotate(tmp, m_rot.z(), glm::vec3(0.f, 0.f, 1.f));
    Aucune de ces deux methodes ne fonctionne... Un autre point m'est venu a l'esprit : pourquoi mon premier code fonctionne ? Il me semblait qu'il fallait faire la rotation PUIS la translation.

    Merci d'avance pour votre aide !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 047
    Billets dans le blog
    140
    Par défaut
    Bonjour,

    Pour votre premier cas, je ne vois pas qu'elle variante vous utilisez de glm::rotate.
    Quoique, je crois que c'est la version avec la normale.

    Sauf que pour moi, la normale indique l'axe de rotation et non les angles.
    De plus, il se peut que l'angle soit en radians. Ce n'est malheureusement pas indiqué.

    Finalement en faisant ainsi, vous allez rentrer dans le cas de Gimbal Lock.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Dans le premier cas, m_rot.rotation() renvoie un angle en degré et le vec3 passé en paramètre exprime les axes avec des valeurs comprises entre -1 et 1.

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Salut,
    tu peut regarder mon tutoriel sur (py)OpenGL (Qu'on a qualifier de tutoriel sur la géométrie 3D) car tous les exemples implémentent des rotations sur les 3 axes (X, Y, Z) en même temps grâce a une matrice.

    Les codes sont en python mais le livre dont est issue le tutoriel est écrit en C++...

    A toi de voir, si ça se comprend mais je pense que ça peut t'aider, a moins que j'ai pas piger le sujet du post.

  5. #5
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Merci beaucoup ! J'y jetterai un oeil ce soir.

    Non, je pense que t'as bien compris. Pour le moyen, je fais une rotation sur un axe. Ce que je voudrais c'est ajouter la possibilité de modifier chaque angle de rotation séparément. Je pensais que ça allait passer sans problème mais ça n'a pas été le cas...

    En gros, j'ai un modèle 3D animé qui doit faire une rotation de -90° sur l'axe y et je voudrais le faire tourner sur l'axe des x en même temps. Sauf que malheureusement ça le faisait "pencher" (en fait plus x était grand, plus il était dans une position penchée). Donc je vais regarder ton lien avec la plus grand attention !

  6. #6
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    J'ai finalement trouve la solution. Le probleme etait l'ordre d'execution des rotations (logique quand on y songe...). Je mets le code pour les potentiels interesses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    glm::mat4 tmp = glm::translate(view_matrix, glm::vec3(m_pos.x(), m_pos.y(), m_pos.z()));
     
     if (m_rot.y() != 0.f)
        tmp = glm::rotate(tmp, m_rot.y(), glm::vec3(0.f, 1.f, 0.f));
    if (m_rot.x() != 0.f)
        tmp = glm::rotate(tmp, m_rot.x(), glm::vec3(1.f, 0.f, 0.f));
    if (m_rot.z() != 0.f)
        tmp = glm::rotate(tmp, m_rot.z(), glm::vec3(0.f, 0.f, 1.f));

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 047
    Billets dans le blog
    140
    Par défaut
    Oui, je pense que vous aviez le blocage de cardan, dont la vraie solution est d'utiliser des quaternions. Là, en changeant l'ordre, vous n'avez que déplacer le problème. Lorsque vous allez changer la rotation, vous allez retomber dessus.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    C'est ce que je pensais aussi au debut apres avoir regarde ce qu'etait le blocage de cardan mais il semblerait que non... Une rotation de 170 en x et 90 en y fonctionne, tout autant que 170 juste en x ou juste en y (je n'utilise que peu la rotation en z).

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

Discussions similaires

  1. [Débutant] Afficher plusieurs axes dans une interface graphique en cliquant sur un pushButton
    Par safsoufa86 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 22/01/2014, 10h40
  2. Effectuer une rotation sur deux axes
    Par zhouyu dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/11/2012, 16h43
  3. [FAQ] Erreur dans la matrice de rotation sur l'axe Y ?
    Par Zouch-K dans le forum Contribuez
    Réponses: 2
    Dernier message: 17/07/2012, 00h33
  4. Correction de rotation sur trois axes
    Par neoirto dans le forum OpenCV
    Réponses: 0
    Dernier message: 17/03/2012, 12h06
  5. [JpGraph] intitulé axe x sur plusieurs ligne
    Par jdeheul dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 04/03/2011, 15h13

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