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

Mathématiques Discussion :

[géomérie vectorielle] matrice de rotation et changement de repère


Sujet :

Mathématiques

  1. #1
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut [géomérie vectorielle] matrice de rotation et changement de repère
    Bonjour,

    "Géométrie vectorielle" ça veut peut-être pas dire grand chose mais ça parle bien.
    Concernant un projet de lancer de rayon je tente de rotationner la caméra.


    contexte
    La caméra possède une position (qui, ici, restera fixe, mais en un point quelconque), et deux vecteurs target et up orthonormés.
    Le vecteur target définit la direction dans laquelle regarder.
    Le vecteur up définit la direction du "haut de l'appareil". Globalement, il sert à pencher vers la droite ou vers la gauche.


    Le but
    Étant donné un vecteur newtarget il faut rotationner la caméra de manière à ce que target devienne newtarget et que l'inclinaison droite-gauche reste la même.


    précisions
    Comment définir cette inclinaison ?
    Disons que pour une caméra donnée, c'est l'angle entre le vecteur up et le plan (target, Z).

    Je précise que je considère que Z est vers le haut (même si ça importe peu) et que target ne peut jamais être égale à Z ou -Z (je traiterai le cas spécialement).



    tentative
    J'ai essayé ceci, mais les tests montrent des résultats bizarres (comprendre "incorrectes") :
    1) Calculer la matrice de rotation M1 qui replacerait target en Y sans toucher l'inclinaison droite-gauche. C'est à dire que la matrice "remonte" target jusqu'au plan (X, Y) puis rotationne autour de l'axe Z;
    2) Calculer la matrice M2 qui placerait Y en newtarget sans toucher l'inclinaison non plus
    3) Appliquer M1^-1 . M2 aux vecteurs target et up


    Soit Y et Z les vecteurs (0, 1, 0) et (0, 0, 1)

    Soit le vecteur right = target ^ Z
    Soit le vecteur fake_up = right ^ target
    Soit M1 = (right, target, fake_up) (les vecteurs sont mis en colonne)

    Soit le vecteur right' = newtarget ^ Z
    Soit le vecteur fake_up' = right' ^ newtarget
    Soit M2 = (right', newtarget, fake_up') (les vecteurs sont mis en colonne)

    Appliquer la matrice M1^-1 . M2 devrait être équivalent à replacer le vecteur target de la caméra sur Y, puis l'emmener jusqu'à newtarget.


    Quelqu'un voit une erreur ?
    Quelqu'un a un autre méthode moins tordue ? (si possible sans passer par des angles).



    Merci d'avance.
    Et désolé pour le message un peu long...

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Je suis pas sur d'avoir tout capté...

    Tu veux faire une rotation d'axe vect(target,newtarget) ?

  3. #3
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Erf, je suis un incompris...

    Bon, on va appeler alpha l'angle que fait le vecteur up avec le plan (Z, target) (ce plan est vertical).
    Le but est : étant donné un target', effectuer une rotation de la caméra de manière à ce que après transformation target = target ' et alpha' = alpha.
    Avec alpha' l'angle formé par up' et le plan (Z, target').

    Donc grosso-modo, il faut trouver comment calculer le up'.
    Note : tous les vecteurs sont normés, de plus up et target (resp. up' et target') sont (doivent rester) orthgonaux.


    C'est plus simple comme ça ?

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par Celelibi Voir le message
    Le but est : étant donné un target', effectuer une rotation de la caméra de manière à ce que après transformation target = target ' et alpha' = alpha.
    En une seule rotation ca me parait dur.

    Mais sinon, je vais sans doute me repeter, pour amener target en target' il faut faire une rotation d'axe vect(target,target').

    Ensuite pour faire coïncider les 2 vecteurs up/up' il faut faire une rotation d'axe target (avant la rotation précédente) ou d'axe target' (après la rotation précédente).

    Au fait, pourquoi tu veux trouver la transformation puisque tu connais déjà target' et alpha' ?

  5. #5
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    une rotation d'axe vect(target,target')
    Ah mais oui, si ton "vect()" c'est le produit vectoriel, c'est tout à fait ça. Désolé, je ne suis pas habitué à cette notation.


    En fait je ne connais pas alpha.
    Je ne sais pas trop comment le calculer à partir de target et up.
    Peut-être par combinaison linéaire de deux vecteurs r et u définis de manière :
    r = target ^ Z
    u = r ^ target

    Je voulais trouver la transformation parce que je pensais que c'était le plus simple. Mais je prends toute autre idée.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Je te propose la lecture du chapitre "The Camera Transformation" au lien suivant: http://www.cubic.org/docs/camera.htm

  7. #7
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    J'ai l'impression dans ce document que l'auteur à inversé le sens de colinéaire.
    Si je ne me méprend pas, deux vecteurs u et v sont colinéaires ssi il existe un réel k != 0 tel que u = k*v.


    Sinon, en fait, je pense que ma première technique marchait, bien qu'étant un peu lourde.
    J'avais simplement oublié de normaliser les vecteurs right. En effet, c'est pas parce que u et v sont normalisés que u^v est normalisé.

    En fait, je viens de coder la technique qui consiste à calculer l'angle (appelé roll dans le document de cubic), placer la nouvelle caméra "comme je peux" avec le vecteur up dans le plan (Z, target') puis réappliquer l'angle roll.
    Sauf que j'ai pas réellement calculé l'angle roll, j'ai juste gardé ses sin et cos.

    ça donne un truc du genre :
    right = target ^ Z
    // Je normalise right
    u = right ^ target
    a = up . right // produit scalaire qui me donne le sin de l'angle
    b = up . u // b = cos(apha)

    right' = target' ^ Z
    // Je normalise right'
    u' = right' ^ target'
    up' = a * u' + b * right'

    Je sais pas si c'est clair. :p
    ^ c'est le produit vectoriel.
    . c'est le produit scalaire.
    * produit par un scalaire.

  8. #8
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    En fait, cette méthode échoue lamentablement si j'essaye de regarder en Z ou -Z.

    J'essaye maintenant de trouver la matrice qui me fera une rotation d'axe vect(target, target').

    Je crois que j'ai besoin de rappels d'algèbre linéaire. Les matrices de passage, tout ça, c'est loin...

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par Celelibi Voir le message
    J'essaye maintenant de trouver la matrice qui me fera une rotation d'axe vect(target, target').
    C'est assez simple avec les quaternions:
    http://jeux.developpez.com/faq/matqu...uaternions#Q56

    Sinon ca va etre plus compliqué a écrire. Tu peux chercher "axis angle rotation matrix" sur Google pour avoir les formules.

  10. #10
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    La méthode des quaternions a le problème de ne pas permettre les petites rotations, essentiellement à cause du produit vectoriel qui donne pas grand chose (littéralement) quand le vecteur source est quasiment colinéaire avec le vecteur cible.
    De plus, il est pas super facile de calculer sin(a/2) et cos(a/2) quand je n'ai que les vecteurs.

    Du coup j'ai eut l'idée de calculer cette rotation autrement.
    J'exprime le vecteur up dans la base (axe, axe^target, target). Ce qui revient à calculer l'angle axe, up.
    Normalement, après rotation d'axe target^target' cet angle c'est le même que celui entre axe et up'. Donc je calcule up' à partir de combinaisons de linéaires des vecteurs (axe, axe^target', target').

    Je sais pas si c'est clair, mais c'est plutôt intuitif. :p
    C'est certainement une simplification de la méthode des quaternions dans mon cas particulier.

Discussions similaires

  1. Decomposition matrice de rotation
    Par harsh dans le forum Mathématiques
    Réponses: 5
    Dernier message: 24/09/2010, 15h16
  2. Matrice rotation, changement de repère
    Par stick25 dans le forum MATLAB
    Réponses: 5
    Dernier message: 03/06/2010, 17h53
  3. angle d'euler et matrice de rotation
    Par mat_monroe dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/05/2005, 11h06
  4. [Débutant]maths et matrices de rotation ...
    Par ptidrone dans le forum DirectX
    Réponses: 7
    Dernier message: 21/07/2004, 17h00
  5. matrice et rotation
    Par charly dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 07/12/2002, 17h59

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