J'essaie d'écrire des tests unitaires et je réalise que je ne sais pas comparer les quaternions. J'ai besoin de savoir si deux quaternions représentent la même orientation (l'objet serait orienté de la même manière). Avec une position de type vecteur, je comparerais simplement les pièces et vérifierais qu'elles sont suffisamment proches, mais pour les quaternions, les valeurs peuvent être très différentes.
Comment comparer deux quaternions?
mathematics
edA-qa mort-ora-y
la source
la source
q
et-q
). La manière naïve (en termes de calcul) serait d'appliquer les deux quaternions au même vecteur et de voir si leurs résultats vectoriels sont différents.Réponses:
Si vos deux quaternions sont
q1
etq2
, ils représentent la même rotation si l'une de ces deux conditions est vérifiée:q1
est sage à peu près égal àq2
OUq1
est sage composant environ égal à-q2
Sachant cela, vous pouvez écrire un testeur d'égalité assez simpliste qui convient à votre objectif.
la source
q
et-q
représentent la même orientation (qui était demandée), mais pas la même rotation. Ceci est crucial lors de l'interpolation.q
et-q
lorsqu'il est représenté comme un opérateur de rotation axe-axe. Donc, en effet, techniquement, l'effet de ces rotations est le même, bien que les opérateurs ne le soient pas. Et, oui, lorsque SLERPING, il faut s'assurerq1
etq2
se coucher sur le même hémisphère de l'hypersphère S3 afin que le slerp prenne le chemin le plus court.2pi-angle
, donc il tourne le long chemin autour des axes niés. Parfois, c'est ce que vous voulez; c'est juste quelque chose dont il faut être conscient,q1 dot q2 > 0
entraîne le virage court,q1 dot q2 < 0
prend le virage long.Tout simplement parce que cela n'a pas été mentionné. Étant donné que les quaternions utilisés pour l'orientation spatiale ont toujours une longueur unitaire (ou devraient l'être), les éléments suivants fonctionneront également.
où EPS est un facteur de fudge pour permettre de petites erreurs dues à une précision limitée en virgule flottante. Si (et seulement si) les deux quaternions représentent la même orientation alors
q1 = +- q2
, et doncq1.dot(q2) = +- 1
. Si vous souhaitez vous assurer qu'il s'agit bien de la même rotation (plutôt que de la seule orientation), supprimez leabs
.la source
Les quaternions sont stockés sous forme de 4 flotteurs ou doubles, souvent appelés x, y, z et w, où les trois premiers représentent un axe et w le degré de rotation autour de cet axe.
Une approche naïve serait de simplement comparer ces nombres de deux quaternions pour l'égalité. Cependant, comme les calculs en virgule flottante impliquent une erreur, vous devez au moins utiliser une erreur, souvent appelée eps (pour epsilon) et comparer chaque composant comme
Un meilleur test serait de calculer le produit scalaire des deux quaternions et de tester s'il est proche de 1,0. Vous devriez rechercher l'équation des quaternions avec sin et cos et juste parsemer deux quaternions, alors vous devriez facilement voir pourquoi cela fonctionne.
la source
Sur la base de toutes les suggestions d'utilisation de Dot et eps, j'ai trouvé qu'en utilisant (à l'unité):
a bien fonctionné sans que je doive prendre une décision pour la taille de eps.
la source