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

Physique Discussion :

Translation et quaternions : trouver la nouvelle position


Sujet :

Physique

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Translation et quaternions : trouver la nouvelle position
    Bonjour,
    J'ai un objet 3D positionné en (pX,pY,Pz). Cet objet a un sens d'orientation exprimé par le quaternion (qW,qX,qY,qZ). Je souhaite déplacer d'une longueur L mon objet vers son sens d'orientation. Cela semble simple mais je me perd dans mes recherches qui n'aboutissent pas. Est ce que quelqu'un pourrait me venir en aide ?
    Rappel des données dont je dispose :
    - Quaternion (W,X,Y,Z)
    - Position initiale de l'objet (pX,pY,Pz)
    - Longueur de la translation L
    ==> Quelle est la nouvelle position de mon objet ?
    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    bonjour, pour ma part je transforme le quaternion en matrice de rotation (D3DXMatrixRotationQuaternion pour l'api directx) et ensuite selon l'orientation de base de ton objet la direction du sens d'orientation se situera soit dans une ligne de cette matrice (directx) ou colonne (opengl).

    voilà le code que j'utilise personnellement dans un de mes projets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    D3DXMatrixRotationQuaternion(&this->m_matOrientation, &this->m_qOrientation);
     
    	this->m_vDirection.x = this->m_matOrientation._11;
    	this->m_vDirection.y = this->m_matOrientation._12;
    	this->m_vDirection.z = this->m_matOrientation._13;
     
    	this->m_vUp.x = this->m_matOrientation._21;
    	this->m_vUp.y = this->m_matOrientation._22;
    	this->m_vUp.z = this->m_matOrientation._23;
     
    	this->m_vRight.x = this->m_matOrientation._31;
    	this->m_vRight.y = this->m_matOrientation._32;
    	this->m_vRight.z = this->m_matOrientation._33;

  3. #3
    Membre habitué Avatar de Polyfructol
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Avril 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Avril 2007
    Messages : 131
    Points : 157
    Points
    157
    Par défaut
    Il faut d'abord chercher à récupérer le vecteur de mouvement (la translation a effectuer) comme ceci :

    Soit v ton vecteur de translation (0, 0, L) :

    p += q * v;

    Je dis ça de souvenir et je n'ai plus la formule de la multiplication d'un quaternion avec un vecteur en tête, mais c'est facilement trouvable.

    En espérant t'aider

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide !
    Pour la multiplication d'un quaternion par un vecteur, j'ai trouvé sur http://www.euclideanspace.com/maths/...orms/index.htm
    w = 0.7071
    x = 0
    y = 0
    z = 0.7071

    p1.x = 1
    p1.y = 0
    p1.z = 0

    p2.x = w*w*p1.x + 2*y*w*p1.z - 2*z*w*p1.y + x*x*p1.x + 2*y*x*p1.y + 2*z*x*p1.z - z*z*p1.x - y*y*p1.x;
    p2.y = 2*x*y*p1.x + y*y*p1.y + 2*z*y*p1.z + 2*w*z*p1.x - z*z*p1.y + w*w*p1.y - 2*x*w*p1.z - x*x*p1.y;
    p2.z = 2*x*z*p1.x + 2*y*z*p1.y + z*z*p1.z - 2*w*y*p1.x - y*y*p1.z + 2*w*x*p1.y - x*x*p1.z + w*w*p1.z;
    Je vais essayer de voir ce que ça donne. J'avoue ne pas être à l'aise avec les maths (vous aurez deviné) alors on va voir, je vous tiens au jus.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Finalement je suis plutôt parti sur la proposition de stardeath.
    1. Convertir quaternion en matrice 3x3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double mat[16];		// numérotée en colonne puis ligne 												
    mat[0]  = 1 - 2 * ( (Y*Y) + (Z*Z) );
    mat[1]  =     2 * ( (X*Y) - (Z*W) );
    mat[2]  =     2 * ( (X*Z) + (Y*W) );
    mat[4]  =     2 * ( (X*Y) + (Z*W) );
    mat[5]  = 1 - 2 * ( (X*X) + (Z*Z) );
    mat[6]  =     2 * ( (Y*Z) - (X*W) );
    mat[8]  =     2 * ( (X*Z) - (Y*W) );
    mat[9]  =     2 * ( (Y*Z) + (X*W) );
    mat[10] = 1 - 2 * ( (X*X) + (Y*Y) );
    mat[3]  = mat[7] = mat[11] = 0;
    mat[15] = 1;
    2. Récupérer les 3 composantes du vecteur de direction
    Dans mon cas openGL, pour x c'est la première colonne (c'était donc pas la peine de tout convertir mais bon...)

    3. Calculer la nouvelle position par rapport à ma distance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    newpos_x = posX + (distance*mat[0]);
    newpos_y = posY + (distance*mat[1]);
    newpos_z = posZ + (distance*mat[2]);
    Et voilà le travail, c'était effectivement très simple mais quel soulagement d'y arriver!
    Merci les boss !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2010, 00h09
  2. [script.aculo.us] Drag drop sauvegarde de la nouvelle position
    Par Khleo dans le forum Bibliothèques & Frameworks
    Réponses: 10
    Dernier message: 27/11/2009, 18h41
  3. Déplacement de div : Enregistrer nouvelle position ?
    Par titoftit dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/07/2007, 09h28

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