Jak ujawnili Nathan Reed i teodron, receptą na obrót wektora v o czwartorzędową jednostkę długości q jest:
1) Utwórz czysty czwartorzęd p z v . Oznacza to po prostu dodanie czwartej współrzędnej 0:
p = ( vx, vy,vz, 0 ) ⇔ p = ( v , 0 )
2) Pomnóż go wstępnie przez q, a następnie pomnóż go przez koniugat q * :
p′=q× p ×q∗
3) Spowoduje to powstanie kolejnego czystego czwartorzędu, który można odwrócić do wektora:
v′= ( p′x, p′y, p′z)
Ten wektor jest obrócony o .v′vq
To działa, ale dalekie od optymalnego . Mnożenia czwartorzędu oznaczają tony operacji. Byłem ciekawy różnych wdrożeń, takich jak ten , i postanowiłem dowiedzieć się, skąd one pochodzą. Oto moje ustalenia.
Możemy również opisać q jako połączenie trójwymiarowego wektora u i skalara s :
q= ( ux, uy, uz, s ) ⇔ q= ( u , s )
Zgodnie z regułami mnożenia czwartorzędu i ponieważ koniugat czwartorzędu o długości jednostki jest po prostu odwrotny, otrzymujemy:
p′= qp q∗= ( u , s ) ( v , 0 ) ( - u , s )= ( s v + u × v , - u ⋅ v ) ( - u , s )= ( ( - u ⋅ v ) ( - u ) + s ( s v + u × v ) + ( s v + u × v ) × ( - u ) , … ) = ( ( u ⋅ v ) u + s2)v+s(u×v)+sv×(−u)+(u×v)×(−u),…)
Część skalarna (elipsy) daje zero, jak wyszczególniono tutaj . Interesująca jest część wektorowa, AKA nasz obrócony wektor v ' . Można to uprościć za pomocą podstawowych tożsamości wektorowych :
v′= ( u ⋅ v ) u + s2)v + s ( u × v ) + s ( u × v ) + u × ( u × v )= ( u ⋅ v ) u + s2)v + 2 s ( u × v ) + ( u ⋅ v ) u - ( u ⋅ u ) v= 2 ( u ⋅ v ) u + ( s2)- u ⋅ u ) v + 2 s ( u × v )
Jest to teraz o wiele bardziej optymalne ; dwa produkty kropkowe, produkt krzyżowy i kilka dodatków: około połowa operacji. Co dałoby coś takiego w kodzie źródłowym (przy założeniu jakiejś ogólnej biblioteki matematycznej wektorowej):
void rotate_vector_by_quaternion(const Vector3& v, const Quaternion& q, Vector3& vprime)
{
// Extract the vector part of the quaternion
Vector3 u(q.x, q.y, q.z);
// Extract the scalar part of the quaternion
float s = q.w;
// Do the math
vprime = 2.0f * dot(u, v) * u
+ (s*s - dot(u, u)) * v
+ 2.0f * s * cross(u, v);
}
vprime = v + ((cross(u, v) * s) + cross(u, cross(u, v)) * 2.0f
czy to podobna optymalizacja? Wygląda nieco podobnie, ale nie jest taki sam - używa tylko produktów krzyżowych, bez produktów kropkowych. Oryginalny kod źródłowy można znaleźć w pliku type_quat.inl oficjalnego repozytorium GLM, woperator*
którym znajduje się czwartorzęd i wektor (vec<3, T, Q> operator*(qua<T, Q> const& q, vec<3, T, Q> const& v)
)Przede wszystkim q ^ (-1) nie jest -q / magnituda (q); to q * / (magnituda (q)) ^ 2 (q * to koniugat; który neguje wszystkie składniki oprócz rzeczywistego). Oczywiście możesz pominąć podział według wielkości, jeśli wszystkie twoje czwartorzędy są już znormalizowane, co zwykle byłoby w systemie rotacji.
Jeśli chodzi o mnożenie przez wektor, wystarczy rozszerzyć wektor do czwartorzędu, ustawiając rzeczywisty komponent quatu na zero, a jego komponenty ijk na xyz wektora. Następnie wykonujesz mnożenie czwartorzędu, aby uzyskać v ', a następnie ponownie rozpakuj komponenty ijk. (Rzeczywista część v 'powinna zawsze wychodzić na zero, plus lub minus jakiś błąd zmiennoprzecinkowy.)
źródło
Pierwsza obserwacja: Odwrotność
q
nie jest-q/magnitude(q)
, to jest całkowicie błędne. Obroty z czwartorzędami sugerują, że te ekwiwalenty liczby zespolonej 4D mają normę jednostkową, a zatem leżą na sferze jednostki S3 w tej przestrzeni 4D. Fakt, że quat jest jednolity, oznacza, że jego normą jest,norm(q)^2=q*conjugate(q)=1
a to oznacza, że odwrotność quatu jest jego koniugatem.Jeśli czwartorzędowa jednostka jest zapisana jako
q=(w,x,y,z)
= (cos (t), sin (t) v ), to jej sprzężeniem jestconjugate(q)=(w,-x,-y,-z)
= (cos (t), - sin (t) v ), gdzie t jest połową kąta obrotu v jest osią obrotu (oczywiście jako wektor jednostkowy).Kiedy ten koleś z Hamilton zdecydował się bawić z ekwiwalentami liczb zespolonych w wyższych wymiarach, natknął się również na kilka dobrych właściwości. Na przykład, jeśli zastosujesz całkowicie czysty czwartorzęd
q=(0,x,y,z)
(bez części skalarnej w !), Możesz uznać to badziewie za wektor (to tak naprawdę quat na temat tego, co ludzie mogliby nazwać równikiem sfery S3, która jest sferą S2! ! - zginanie rzeczy, jeśli weźmiemy pod uwagę fakt, że ludzie w XIX wieku upośledzeni technicznie wydają się nam w dzisiejszych czasach kowbojami EyePhone). Hamilton przyjął ten wektor w swojej quat:v=(0,x,y,z)
przeprowadził serię eksperymentów, biorąc pod uwagę właściwości geometryczne quatów. Krótko mówiąc:gdzie
Uwaga: sprzężenie q * (0, v) * (q) musi być kolejnym quatem formy (0, v '). Nie będę omawiał tego pozornie skomplikowanego wyjaśnienia, dlaczego tak się dzieje, ale jeśli obrócisz za pomocą tej metody czysty wyimaginowany czwartorzęd (lub w naszym przypadku wektor!), Musisz uzyskać podobny rodzaj przedmiotu: czysty wyimaginowany quat. i bierzesz jego wymyśloną część jako wynik. Oto wspaniały świat rotacji z czwartorzędami w łupinie orzecha (ty).
UWAGA : ktokolwiek wskakuje z tą nadużywaną frazą: quaty są dobre, ponieważ unikają blokady gimbala ... powinni najpierw odblokować swoją wyobraźnię !! Quaty są jedynie „eleganckim” aparatem matematycznym, którego można całkowicie uniknąć, stosując inne podejścia, przy czym moim zdaniem całkowicie geometrycznie równoważne jest podejście do kąta osi.
KOD : biblioteka C ++, którą według mnie jest dość uproszczona, ale ma wszystkie operacje na matrycy, wektorze i quatach, których powinien potrzebować eksperymentator grafiki 3D bez konieczności marnowania więcej niż 15 minut na naukę. Za pomocą tego możesz przetestować to, co tu napisałem w 15 minut, jeśli nie jesteś nowicjuszem w C ++. Powodzenia!
źródło
Oto alternatywny sposób transformacji wektora o czwartorzędu. Jest to sposób, w jaki MS robi to w środowisku xna. http://pastebin.com/fAFp6NnN
źródło
Próbowałem to rozwiązać ręcznie i wymyśliłem następujące równanie / metodę:
Byłbym wdzięczny, gdyby ktoś spojrzał na pochodzenie mt, którego użyłem http://pastebin.com/8QHQqGbv Sugerowałbym skopiowanie do edytora tekstowego, który obsługuje przewijanie boczne
w mojej notacji użyłem q ^ (- 1), aby oznaczać koniugat, a nie odwrotność i różne identyfikatory, ale mam nadzieję, że można go śledzić. Myślę, że większość ma rację, szczególnie gdy udowadnianie, że prawdziwa część wektora zniknie.
źródło