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

Contribuez Discussion :

[FAQ] [MQ] Corrections


Sujet :

Contribuez

  1. #1
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut [FAQ] [MQ] Corrections
    Reçu par MP :

    Avant tout je tiens à vous adresser mes respects pour tout ce que vous faites bénévolement, c'est merveilleux.

    Le FAQ de la 2D et 3D et des jeux est très bien conçu, chapeau. Il m'a beaucoup aidé et sorti de plein d'ennuis.

    Mais cette fois il a failli me mettre dans l'ennui ... Eh oui c'est dommage, il y a une erreur dans la question de transformation d'une matrice de rotation en quaternion... la trace qu'il faut comparer à 0 n'est pas la simple trace (T) (somme des trois éléments de la diagonale) mais c'est c'est plutôt T+1... mes calculs personnels en sont arrivés là, mais encore j'ai trouvé deux références qui donnent la même chose, (au pire vous pouvez vérifier vous-même) je vous donne les liens :

    http://membres.lycos.fr/javamus/articles/mqfaq.html
    http://artemmis.univ-mrs.fr/cybermec...TERN1.htm#cas1

    j'espère que je ne raconte pas de bêtises (vu l'heure).
    AÏE AÏE AÏE je crois que ça ve beaucoup plus loin qu'un simple 1 oublié !!!

    Il faut tout corriger, le S du cas T+1 négatif n'est pas bon du tout !! c'est urgent !!

    Le premier lien que je vous ai donné utilise exactement la même méthode, vous devriez vous en inspirer.

    (au fait je n'ai pas compris une chose, quand on cherche le plus grand de la diagonale est ce que c'est en valeur absolue ou pas ? je sais, je sais, j'avais commencé mes calculs mais je me suis embrouillé, juste assez pour voir les erreurs...)
    Bon je sais que je vous casse les pieds à la fin, j'ai remarqué des tas de fautes dans les deux pages... alors je ne sais pas ce qui se passe, j'ai fait ma propre version aussi... en m'appuyant sur la matrice, alors je vous envoie mon code (en C) (avec q[0] c'est W, q[1] c'est X, q[2] c'est Y et q[3] c'est Z) J'espère que ça vous aidera... et s'il y a une faute dites le moi s'il vous plait.

    De toute manière, un selon moi un seul mot d'ordre : tout vérifier (ne serait ce que parce que vos deux versions ne correspondent pas du tout... ni même avec la mienne (bien regarder les signes et vous verrez les différences)) de mon côté je suis sûr à 95% de la mienne


    Double T; //pseudo trace de la matrice de rotation
    T=1+r(0,0)+r(1,1)+r(2,2);
    if (T>0)//trace positive
    {
    Double S;
    S=0.5/sqrt(T);
    q[0]=0.25/S;
    q[1]=(r(2,1)-r(1,2))*S;
    q[2]=(r(0,2)-r(2,0))*S;
    q[3]=(r(1,0)-r(0,1))*S;
    }
    else //trace négative
    {
    if ((r(0,0)>r(1,1))&&(r(0,0)>r(2,2))//r(0,0) est le plus grand
    {
    T=1+r(0,0)-r(1,1)-r(2,2);
    Double S;
    S=0.5/sqrt(T);
    q[0]=(r(2,1)-r(1,2))*S;
    q[1]=0.25/S;
    q[2]=(r(0,1)+r(1,0))*S;
    q[3]=(r(2,0)+r(0,2))*S;
    }
    else
    {
    if ((r(1,1)>r(0,0))&&(r(1,1)>r(2,2))//r(1,1) est le plus grand
    {
    T=1-r(0,0)+r(1,1)-r(2,2));
    Double S;
    S=0.5/sqrt(T);
    q[0]=(r(0,2)-r(2,0))*S;
    q[1]=(r(0,1)+r(1,0))*S;
    q[2]=0.25/S;
    q[3]=(r(2,1)+r(1,2))*S;
    }
    else
    {
    if ((r(2,2)>r(1,1))&&(r(2,2)>r(0,0))//r(2,2) est le plus grand
    {
    T=1-r(0,0)-r(1,1)+r(2,2));
    Double S;
    S=0.5/sqrt(T);
    q[0]=(r(1,0)+r(0,1))*S;
    q[1]=(r(2,0)+r(0,2))*S;
    q[2]=(r(2,1)+r(1,2))*S;
    q[3]=0.25/S;
    }
    }
    }
    }
    Si quelqu'un peut décortiquer ça qu'il n'hésite pas, moi j'avoue que ça me dépasse un peu

    En tout cas merci à Aquadarius pour les remarques / corrections.

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Mais de rien Laurent Gomila, comparé à ce que vous tous faites ce n'est rien du tout... et désolé de vous avoir bombardé de MP (en plus il y avaiy plusieurs fois les mêmes MP.... ma connexion faisait des siennes alors je ne savais pas si j'avais envoyé ou pas)...en plus il était 4 heures du matin, et je n'ai bien assez bien cherché pour trouver ce forum lol...

    Au fait vous avez oublié un MP (oui il y en avait 4) il vient juste avant le dernier le voici :

    Bon j'espère que c'est le dernier message, apparemment il y a l'erreur sur l'autre lien aussi, je ne vais rien lui envoyer à lui, pas pour le moment du moins, mais à vous si... je crois qu'il faut me suivre

    on a l'equation

    4X² = 1 + M0,0² - M1,1² - M2,2²

    pour la trouver ce n'est pas compliqué, faites juste le remplacement des Mi,i par leurs expressions en fonction des composantes du quaternion

    continuons... pour le cas où la pseudo trace (T+1) est négative et le premier élément de la diagonale est le plus grand (je ne sais toujours pas si c'est en valeur absolue ou pas lol)

    S= sqrt( 1 + M0,0² - M1,1² - M2,2² ) * 2

    donc sans aucun problème on peut dire que
    4X²= S²/4 donc X = S * 0.25 (à un signe près ... mais dans ce cas précis c'est positif, de toute manière on s'en fout) mais ce n'est pas du tout ça qui est écrit... pitié corrigez ça ! ou expliquez moi ce qui cloche !
    J'ai une petite correction à faire dans mon code source... pour le dernier cas : r(2,2) est le plus grand (au fait pour ceux qui n'ont pas compris r(i,j) c'est Mij du tutoriel...)

    alors je disais pour le dernier cas : q[0]=(r(1,0)-r(0,1))*S au lieu de q[0]=(r(1,0)+r(0,1))*S; (le signe...)

    merci j'attends les correction ou critiques

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