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...)Si quelqu'un peut décortiquer ça qu'il n'hésite pas, moi j'avoue que ça me dépasse un peuBon 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;
}
}
}
}
En tout cas merci à Aquadarius pour les remarques / corrections.
Partager