Ich versuche einige Unit-Tests zu schreiben und stelle fest, dass ich nicht weiß, wie man Quaternionen vergleicht. Ich muss wissen, ob zwei Quaternionen dieselbe Ausrichtung darstellen (das Objekt würde in dieselbe Richtung weisen). Mit einer vektorähnlichen Position würde ich einfach die Teile vergleichen und prüfen, ob sie nahe genug sind, aber für Quaternionen können die Werte sehr unterschiedlich sein.
Wie kann ich zwei Quaternionen vergleichen?
mathematics
edA-qa mort-ora-y
quelle
quelle
q
und-q
). Der naive (rechnerisch) Weg wäre, beide Quaternionen auf denselben Vektor anzuwenden und zuAntworten:
Wenn Ihre beiden Quaternionen
q1
und sindq2
, stellen sie dieselbe Rotation dar, wenn eine dieser beiden Bedingungen gilt:q1
ist komponentenweise ungefähr gleichq2
ORq1
ist komponentenweise ungefähr gleich-q2
Wenn Sie dies wissen, können Sie einen ziemlich simplen Gleichheitstester schreiben, der Ihrem Ziel entspricht.
quelle
q
und-q
repräsentieren die gleiche Ausrichtung (die angefordert wurde), aber nicht die gleiche Drehung. Dies ist beim Interpolieren von entscheidender Bedeutung.q
und-q
als Winkelachsen-Rotationsoperator negiert . Technisch gesehen ist der Effekt dieser Rotationen also der gleiche, obwohl dies bei den Bedienern nicht der Fall ist. Und, ja, wenn SLERPING, muss man sicherstellen,q1
undq2
liegen auf derselben Hemisphäre des S3 Hypershäre , um für die Slerp den kürzesten Weg zu nehmen.2pi-angle
, also dreht es den langen Weg um die negierten Achsen. Manchmal ist es das, was Sie wollen; Es ist nur etwas, das man beachten muss,q1 dot q2 > 0
das zu einer kurzen Kurveq1 dot q2 < 0
führt und zu einer langen Kurve führt.Nur weil es nicht erwähnt wurde. Da Quaternionen, die für die räumliche Orientierung verwendet werden, immer die Einheitslänge haben (oder sein sollten), funktioniert auch das Folgende.
Dabei ist EPS ein Fudge-Faktor, um kleine Fehler aufgrund der begrenzten Gleitkommapräzision zu berücksichtigen. Wenn (und nur wenn) beide Quaternionen dann
q1 = +- q2
und damit die gleiche Ausrichtung habenq1.dot(q2) = +- 1
. Wenn Sie sicherstellen möchten, dass sie die gleiche Drehung haben (und nicht nur die Ausrichtung), entfernen Sie dieabs
.quelle
Quaternionen werden als 4 Floats oder Doubles gespeichert, die oft als x, y, z und w bezeichnet werden, wobei die ersten drei eine Achse und w den Rotationsgrad um diese Achse darstellen.
Ein naiver Ansatz wäre, nur diese Zahlen von zwei Quaternionen auf Gleichheit zu vergleichen. Da Gleitkommaberechnungen jedoch einen Fehler beinhalten, sollten Sie mindestens einen Fehler verwenden, der häufig als eps (für epsilon) bezeichnet wird, und jede Komponente wie vergleichen
Ein besserer Test wäre, das Punktprodukt der beiden Quaternionen zu berechnen und zu testen, ob es nahe bei 1,0 liegt. Sie sollten die Gleichung der Quaternionen mit sin und cos nachschlagen und nur zwei Quaternionen punktieren, dann sollten Sie leicht erkennen, warum dies funktioniert.
quelle
Basierend auf all den Vorschlägen zur Verwendung von Dot und eps fand ich, dass using (in unit):
hat gut funktioniert, ohne dass ich mich für die Größe des EPS entscheiden musste.
quelle