Jestem fizykiem i uczyłem się programowania i spotkałem wielu ludzi używających kwaternionów do rotacji, zamiast pisać rzeczy w postaci macierzy / wektorów.
W fizyce są bardzo dobre powody, dla których nie używamy kwaternionów (pomimo dziwacznej historii, która czasami opowiada się o Hamilton / Gibbs / etc). Fizyka wymaga, aby nasze opisy miały dobre zachowanie analityczne (ma to precyzyjnie zdefiniowane znaczenie, ale na pewne raczej techniczne sposoby, które wykraczają daleko poza to, czego uczy się na normalnych zajęciach wprowadzających, więc nie będę wchodził w żadne szczegóły). Okazuje się, że kwaternionie nie mają tak przyjemnego zachowania, więc nie są przydatne, a wektory / macierze tak, więc ich używamy.
Jednak ograniczone do sztywnych obrotów i opisów, które nie używają żadnych struktur analitycznych, obroty 3D można opisać równoważnie w obie strony (lub na kilka innych sposobów).
Ogólnie rzecz biorąc, chcemy po prostu odwzorować punkt X = (x, y, z) na nowy punkt X '= (x', y ', z') podlegający ograniczeniu, że X 2 = X ' 2 . I jest wiele rzeczy, które to robią.
Naiwnym sposobem jest po prostu narysowanie trójkątów, które to definiuje i użycie trygonometrii lub użycie izomorfizmu między punktem (x, y, z) a wektorem (x, y, z) i funkcją f (X) = X 'i macierz MX = X ', lub używając kwaternionów lub rzutując składowe starego wektora wzdłuż nowego inną metodą (x, y, z) T. (a, b, c) (x', y ', z ') itp.
Z matematycznego punktu widzenia wszystkie te opisy są równoważne w tym ustawieniu (jako twierdzenie). Wszystkie mają taką samą liczbę stopni swobody, taką samą liczbę wiązań itd.
Dlaczego więc quaternions wydają się być preferowane w stosunku do wektorów?
Zwykłe powody, które widzę, to brak blokady gimbala lub problemy numeryczne.
Argument braku blokady gimbala wydaje się dziwny, ponieważ jest to tylko problem kątów Eulera. Jest to również problem tylko ze współrzędnymi (podobnie jak osobliwość przy r = 0 we współrzędnych biegunowych (jakobian traci rangę)), co oznacza, że jest to tylko problem lokalny i można go rozwiązać, zmieniając współrzędne, obracając się poza degeneracją, lub używając dwóch nakładających się układów współrzędnych.
Jestem mniej pewien co do kwestii liczbowych, ponieważ nie wiem szczegółowo, jak oba te (i jakiekolwiek alternatywy) zostaną zaimplementowane. Czytałem, że ponowna normalizacja kwaternionu jest łatwiejsza niż zrobienie tego dla macierzy rotacji, ale jest to prawdą tylko dla macierzy ogólnej; obrót ma dodatkowe ograniczenia, które to trywializują (które są wbudowane w definicję kwaternionów) (w rzeczywistości musi to być prawdą, ponieważ mają one taką samą liczbę stopni swobody).
Więc jaki jest powód używania kwaternionów zamiast wektorów lub innych alternatyw?
Odpowiedzi:
Blokada gimbala to jeden z powodów, chociaż, jak mówisz, jest to tylko problem z kątami Eulera i można go łatwo rozwiązać. Kąty Eulera są nadal używane, gdy problemem jest pamięć, ponieważ wystarczy zapisać tylko 3 liczby.
W przypadku kwaternionów w porównaniu z macierzą rotacji 3x3 kwaternion ma przewagę pod względem rozmiaru (4 skalary w porównaniu z 9) i szybkości (mnożenie kwaternionów jest znacznie szybsze niż mnożenie macierzy 3x3).
Zauważ, że wszystkie te reprezentacje obrotów są używane w praktyce. Kąty Eulera używają najmniej pamięci; matryce zajmują więcej pamięci, ale nie cierpią na blokadę gimbala i mają dobre właściwości analityczne; a quaternions zapewniają dobrą równowagę obu, są lekkie, ale wolne od blokady Gimbal.
źródło
Cóż, ja też jestem fizykiem. Są też sytuacje, w których kwaternionie po prostu kołyszą się! Na przykład sferyczne harmoniczne. Masz dwa rozpraszające się atomy, wymieniając elektron: jaki jest transfer spinu orbitalnego? W przypadku kwaternionów jest to po prostu mnożenie, czyli sumowanie wykładników funkcji bazowych SH wyrażonych jako kwaternionów. (Umieszczenie Wielomianów Legendre'a w notacji kwaternionów jest jednak nieco uciążliwe).
Ale zgadzam się, nie są one uniwersalnym narzędziem, a zwłaszcza w mechanice sztywnego nadwozia byłyby bardzo uciążliwe w użyciu. Jednak aby zacytować odpowiedź Bertranda Russella w pytaniu studenta, ile matematyki musi znać fizyk: „Jak najwięcej!”
Zresztą: Dlaczego kochamy kwaternianie w grafice komputerowej? Ponieważ mają wiele atrakcyjnych właściwości. Po pierwsze można je ładnie interpolować, co jest ważne, jeśli animujemy obracające się rzeczy, takie jak kończyny wokół stawu. Z kwaternionem jest to po prostu mnożenie i normalizacja przez skalar. Wyrażenie tego za pomocą macierzy wymaga oszacowania sin i cos, a następnie zbudowania macierzy rotacji. Następnie mnożenie wektora przez kwaternion jest nadal tańsze, ponieważ przechodzenie przez pełne mnożenie macierzy wektorów jest również tańsze, jeśli później doda się tłumaczenie. Jeśli weźmiesz pod uwagę szkieletowy system animacji postaci ludzkiej, w którym trzeba ocenić wiele translacji / obrotów dla dużej liczby wierzchołków, ma to ogromny wpływ.
Innym miłym efektem ubocznym używania kwaternionów jest to, że każda transformacja z natury jest ortonormalna. W przypadku macierzy translacji należy ponownie zortonormalizować co kilka kroków animacji z powodu błędów liczbowych zaokrągleń.
źródło
Wiele aplikacji 3D, takich jak używanie kątów Eulera do definiowania orientacji obiektu. W szczególności dla symulatorów lotu stanowią one teoretycznie użyteczny sposób przechowywania orientacji w sposób, który można łatwo modyfikować.
Powinieneś także mieć świadomość, że rzeczy takie jak „przełączanie współrzędnych, obracanie poza degeneracją lub używanie dwóch nakładających się układów współrzędnych” wymagają wysiłku. Wysiłek oznacza kod. A kod oznacza wydajność. Utraty wydajności, jeśli nie masz na nie jest dobrą rzeczą dla wielu aplikacjach 3D. W końcu, co można zyskać dzięki tym wszystkim sztuczkom, jeśli samo użycie kwaternionów zapewni ci wszystko, czego potrzebujesz.
Problemy liczbowe pojawiają się, gdy mamy do czynienia z wieloma kolejnymi obrotami orientacji. Wyobraź sobie, że masz obiekt w kosmosie. I za każdym razem wprowadzasz do niego małą zmianę odchylenia. Po każdej zmianie musisz ponownie znormalizować orientację; w przeciwnym razie problemy z precyzją wkradną się i wszystko zepsują.
Jeśli używasz macierzy, za każdym razem, gdy wykonujesz mnożenie macierzy, musisz ponownie ortonormalizować macierz. Macierz, którą ortonormalizujesz, nie jest jeszcze macierzą rotacji, więc nie byłbym zbyt pewien co do tej łatwej ortonormalizacji. Jednak mogę być tego pewien:
Nie będzie tak szybka jak normalizacja wektora 4D. To właśnie używają kwaternionów do normalizacji po kolejnych obrotach.
Normalizacja kwaternionów jest tania. Nawet wyspecjalizowana normalizacja macierzy rotacji nie będzie tak tania. Ponownie liczy się wydajność.
Jest też inna kwestia, której macierze nie radzą sobie łatwo: interpolacja między dwoma różnymi orientacjami.
Kiedy masz do czynienia z postacią 3D, często masz do czynienia z serią transformacji określających położenie każdej kości w postaci. Ta hierarchia kości reprezentuje postać w określonej pozie.
W większości systemów animacji, aby obliczyć pozy dla postaci w określonym czasie, dokonuje się interpolacji między transformacjami. Wymaga to interpolacji odpowiednich przekształceń.
Interpolacja dwóch macierzy jest ... nietrywialna. Przynajmniej tak jest, jeśli chcesz czegoś, co na końcu przypomina macierz rotacji. W końcu celem interpolacji jest wytworzenie czegoś pośredniego między dwoma transformacjami.
W przypadku kwaternionów wszystko, czego potrzebujesz, to lerp 4D, po którym następuje normalizacja. To wszystko: weź dwa kwaterniony i liniowo interpoluj składniki. Normalizuj wynik.
Jeśli chcesz interpolacji lepszej jakości (a czasami tak jest), możesz wydobyć lerp sferyczny . To sprawia, że interpolacja zachowuje się lepiej dla bardziej odmiennych orientacji. Ta matematyka jest znacznie trudniejsza i wymaga więcej operacji na macierzach niż na kwaternionach.
źródło
Opinia: Quaternions są fajne.
Macierz rotacji: Niewielka wada : Mnożenie macierzy jest ~ 2 razy wolniejsze niż kwaternionów. Niewielka zaleta : Mnożenie macierzy i wektorów jest ~ 2 razy szybsze i duże. Ogromna wada : normalizacja! Ghram-Shmit jest asymetryczny, co nie daje dokładnej odpowiedzi wyższego rzędu podczas wykonywania równań różniczkowych. Bardziej wyrafinowane metody są bardzo złożone i kosztowne.
Oś (kąt = długość osi) Niewielka zaleta : Mała. Umiarkowana wada : mnożenie i stosowanie do wektora jest powolne z trygonometrią. Umiarkowana wada : Osobliwość bieguna północnego na długości = 2 * pi, ponieważ wszystkie kierunki osi nic nie robią. Więcej kodu (i debugowanie), aby automatycznie przeskalować go, gdy zbliży się do 2pi.
źródło
My absolutnie nie tylko chcemy. Istnieje bardzo ważna subtelność, której wielu ludzi brakuje . Konstrukcja, o której mówisz (narysuj trójkąty i użyj triggera itp.) Prawidłowo obróci jeden wektor w drugi. Ale jest nieskończenie wiele obrotów, które to zrobią. W szczególności mogę przyjść po wykonaniu obrotu, a następnie obrócić cały system wokół wektora X '. To wcale nie zmieni pozycji X '. Połączenie twojego obrotu i mojego jest równoważne z innym pojedynczym obrotem (ponieważ obroty tworzą grupę ). Ogólnie rzecz biorąc, musisz być w stanie reprezentować każdą taką rotację.
Okazuje się, że można to zrobić za pomocą samego wektora. (To jest reprezentacja kąta osi obrotów ). Jednak łączenie obrotów w reprezentacji kąta osi jest trudne. Quaternions ułatwiają, a także wiele innych rzeczy. Zasadniczo kwaternianie mają wszystkie zalety innych reprezentacji i nie mają żadnych wad. (Chociaż przyznam, że mogą istnieć konkretne aplikacje, dla których inna reprezentacja może być lepsza.)
źródło
I to są dobre powody.
Jak już zdajesz się rozumieć, kwaterniony kodują pojedynczy obrót wokół dowolnej osi, w przeciwieństwie do trzech kolejnych obrotów w przestrzeni Eulera 3. To sprawia, że kwaternionie są odporne na blokadę gimbala .
Ponadto niektóre formy interpolacji stają się przyjemne i łatwe do wykonania, takie jak SLERP .
Z punktu widzenia wydajności, dlaczego Twoje rozwiązanie jest lepsze?
Mógłbym kontynuować, ale kwaterniony to tylko jedno z możliwych narzędzi. Jeśli nie odpowiadają Twoim potrzebom, nie używaj ich.
źródło
Warto pamiętać, że wszystkie właściwości związane z obrotem nie są tak naprawdę właściwościami kwaternionów: są one właściwościami parametryzacji Eulera-Rodriguesa , która jest rzeczywistą 4-elementową strukturą używaną do opisania obrotu 3D.
Ich związek z kwaternionami wynika wyłącznie z pracy Cayleya „O niektórych wynikach związanych z kwaternionami”, w której autor obserwuje korelację między mnożeniem kwaternionów a kombinacją parametrów Eulera-Rodriguesa. Umożliwiło to zastosowanie aspektów teorii kwaternionów do reprezentacji obrotów, a zwłaszcza do interpolacji między nimi.
Możesz przeczytać artykuł tutaj: https://archive.org/details/collmathpapers01caylrich . Ale w tamtym czasie nie było żadnego związku między kwaternionami a rotacją i Cayley był raczej zaskoczony, gdy stwierdził:
Jednak nie ma nic wewnętrznego w Quaternions, co daje jakiekolwiek korzyści rotacji. Quaternions nie unikają blokady gimbala; Robią to parametryzacje Eulera-Rodriguesa. Bardzo niewiele programów komputerowych wykonujących rotację prawdopodobnie rzeczywiście implementuje typy Quaternion, które są złożonymi wartościami matematycznymi pierwszej klasy. Niestety, wydaje się, że gdzieś wyciekło niezrozumienie roli kwaternionów, co spowodowało, że wielu zdezorientowanych studentów grafiki uczyło się szczegółów złożonej matematyki z wieloma wyimaginowanymi stałymi, a następnie zastanawiało się, dlaczego rozwiązuje to problemy z rotacją.
źródło
Odpowiedź, którą ktoś mógłby przeczytać: są żmudne problemy ze wszystkimi reprezentacjami. Quaternions są mniejsze niż macierze, ale mnożenie kwaternionów nie jest zwykłym wektorowym iloczynem skalarnym lub czymś podobnym, iw rzeczywistości zajmuje więcej czasu na komputerze niż iloczyn skalarny dwóch macierzy 3x3. (Komputery bardzo dobrze radzą sobie ze zwykłymi matrycami)
Matryce mają jednak inne irytujące cechy. Na przykład na dłuższą metę nie są stabilnymi stworzeniami. Podczas modelowania obrotów w przestrzeni 3D, zwykle gromadzi się obroty jeden na drugim w macierz orientacji, czyli tylko pojedynczą macierz obrotu przechowującą orientację ramki odniesienia. Proces ten w trakcie milionów dodawania spowoduje, że macierz O odejdzie od ścisłej formy macierzy rotacyjnej. Można to obejść, okresowo rekonfigurując macierz, ale są warunki, w których nie jest to banalne. Mianowicie przypadek braku rotacji macierzy tożsamości.
Chciałbyś znaleźć reprezentację kąta osi (lub reprezentację kwaternionów) obrotu, a następnie odtworzyć macierz do tego. Większość algorytmów tworzy wektor zerowy, a następnie napotyka w tym przypadku podział na zero. W tego typu przypadkach generalnie kiepskim pomysłem jest również unikanie takich przypadków z typem rozwiązań „jeśli 0 to ...”, ponieważ a) widelce są powolne ib) nadal można skończyć z epsilonem maszynowym poza osobliwości i kończą się przerażającymi błędami.
źródło