Notifications
Article
Struktura Quaternion - jak definiujemy parametr x, y, z i w
Updated 5 months ago
132
0
Structura Quaternion - jak definiujemy parametr x, y, z i w

Jak interpretować wizualizacje quaternionów

Przygotowałem wizualizacje quaternionów, które pomogą nam zrozumieć ich działanie. W internecie możecie znaleźć podobne wizualizacje. Wytłumaczę wam teraz co prezentują te wizualizacje.
Poniżej znajduję się przykład takiej wizualizacji.

Fioletowa strzałka pokazuje oś obrotu. Grot strzałki pokazuję w którą stronę zwrócona jest oś obrotu.

Miedzy czerwoną strzałką a pomarańczową widać przerywaną linię, która wizualizuję kąt o jaki obróciliśmy ciało.

Tu ważna uwaga.
Aby mierzyć kąt musimy mieć jakiś punkt odniesienia. Najlepiej wybrać jakiś wektor wskazujący określony kierunek.
W tym przykładzie moim punktem odniesienia jest czerwona oś lokalnego układu współrzędnych Kostki (transform.right).
W tym przykładzie czerwona strzałka była początkowo skierowana w prawo w globalnym układzie współrzędnych (Vector3.right). Nieobrócony wektor reprezentuje zerową rotacje czyli Quaternion.identity.

Po obróceniu ciała czerwona oś lokalnego układu współrzędnych zmieniła swój kierunek. Jeśli połączymy wszystkie punkty przez które przechodził grot strzałki między początkową a końcową pozycją, to otrzymamy łuk reprezentujący kąt między tymi dwoma wektorami oraz trajektorie obrotu wektora.

Punkt odniesienia możemy wybierać dowolnie czyli możemy wybrać dowolny wektor.
Jeśli wybierzemy różne wektory to ich obroty będą się różnić jedynie trajektorią, ale zawsze będą się one odbywać wokół tej samej osi obrotu i obracać o ten sam kąt .
Poniżej przykład gdzie obracam osie lokalnego układu współrzędnych ciała:
  • transform.right
  • transform.up
  • transform.forward
Trajektoria obrotu każdego z wektorów jest inna. Ale każdy z nich obracany jest o taki sam quaternion (czyli o taki sam kąt wokół tej samej osi obrotu).

Wiemy jak definiujemy wizualizacje, przyjrzyjmy się teraz dokładniej strukturze Quaternion.

Zaczynamy

Konstruktory i inne metody służące do zmiany wartości parametrów w quaternionie.

Każda instancja quaternionu przechowuje 4 wartości typu float o nazwach x, y, z i w.
Do czego dokładnie służą poszczególne parametry powiem wam później.
Skupię się pierw jak tworzyć, odczytywać i zmieniać wartości parametrów quaternionów.
Quaterniony możecie tworzyć z pomocą konstruktorów.
Pierwszy konstruktor wygląda tak.
Podajemy w nim wartości poszczególnych parametrów. Ja ustawiłem wartości 0, 0, 0 dla składowych x, y, z i wartość 1 dla parametru w.
Te wartości parametrów kwaternionu oznaczają brak obrotu. Czyli tak zdefiniowany quaternion przechowuję zerową rotacje.
Zerową rotacje możecie także zapisać z pomocą właściwości identity.
Powyższe zapisy czyli za pomocą konstruktora (new Quaternion(0,0,0,1) i za pomocą właściwości identity są sobie równoważne.
Structura Quaternion posiada też drugi konstruktor - bezparametrowy.
Ten konstruktor zwraca zerową rotacje czyli dokładnie to samo co dwa wcześniejsza zapisy.

Jak można zmieniać wartości poszczególnych parametrów w danej instancji quaternionu?

Bardzo prosto.
Możemy skorzystać z metody Set() i przypisać wartości poszczególnych składowych.
Możecie też odwołać się bezpośrednio do poszczególnych składowych. Pozwala to na odczytanie jak i przypisanie wartości poszczególnych składowych.
Możecie też się odwołać podając nr indeksu parametru.

Jakie wartości mogą przyjmować te parametry?

Każdy z parametrów może przyjmować wartości tylko z przedziału od -1 do 1.
Wynika to z tego, że kwaterniony są znormalizowane czyli długość quaternionu jest równa 1. To standard, że quaterniony są normalizowane dlatego zwykle jak gdzieś podawane są wartości poszczególnych parametrów to będą one przyjmować wartości z przedziału od -1 do 1.
Gdybyście sami definiowali wartości parametrów w quaternionie to pamiętajcie aby znormalizować tak utworzony quaternion.
Możecie to zrobić na dwa sposoby.
Jeśli skorzystacie z wielkości normalized to zostanie zwrócony znormalizowany quaternion. Ta właściwość nie zmieni wartości quaternionu na którym zostanie wywołana.

Możecie też wywołać metodę Normalize(). Ta metoda normalizuję quaternion na którym została wywołana. Ta metoda nic nie zwraca.



Jak wyobrazić sobie rotacje z pomocą quaternionów?

Gdy obracamy jakimś ciało to zawsze będzie ono obracać się wokół jakiejś osi obrotu (oś obrotu - axis).

Obrót ciała wokół takiej osi możemy zmierzyć określając kąt o jaki takie ciało się obróciło (kąt - angle).
Każdy z quaternionów reprezentuję pewną oś obrotu i kąt o jaki się obracamy wokół tej osi.
Na wikipedii możecie znaleźć artykuł na temat wyrażania rotacji z pomocą osi obrotu i kąta o jaki ciało się obróci. Jeśli was interesuję matematyka stojąca za tą reprezentacją obrotu zajrzyjcie na tą stronę. https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation

Jak matematycznie zdefiniowany jest quaternion?

Quaternion jak każde inne pojęcie matematyczne posiada pewien wzór, który definiuje jego wartość. Quaterniony można zapisać na wiele sposobów. Najczęściej spotyka się zapis z pomocą liczb zespolonych.
Jako, że w tej serii nie omawiam szczegółowo matematyki skorzystam z innego sposobu opisu quaternionów.
Wartość quaternionu możemy opisać z pomocą poniższego wzoru.
gdzie:
q - quaternion,
θ - kąt obrotu o jaki obracamy się wokół osi obrotu.
v – wektor reprezentujący bezwzględny kierunek osi obrotu wokół, której się obracamy. v jest wektorem jednostkowym czyli jego długość wynosi 1.
Uwaga! Gdy definiujemy kierunek osi obrotu możemy go określić jako względny albo bezwzględny. - bezwzględny kierunek osi obrotu - kierunek osi bez uwzględnienia sinusa połowy kąta obrotu, jest on niezależny od wartości kąta obrotu - względny kierunek osi obrotu - kierunek osi po wymnożeniu przez sinus połowy kąta obrotu W dalszej części artykułu będę korzystał z określenia "oś obrotu" dla uproszczenia. Względność / bezwzględność kierunku osi obrotu dedukujcie na bazie istnienia bądź braku sinusa połowy kąta obrotu podczas obliczeń kierunku osi.

Wektor v jest możemy rozłożyć na 3 składowe - Vx, V y, V z
Gdy przekształcimy nieco pierwsze równanie otrzymamy :
Na początku wspominałem, że każdy quaternion składa się z 4 parametrów o nazwie x, y, z i w. Wartość każdego z parametrów można opisać następującymi wzorami.
Zapewne w chwili obecnej ten opis matematyczny niewiele wam mówi dlatego też przyjrzymy się bliżej poszczególnym parametrom w quaternionie.

Znaczenie parametrów x, y, z i w

Jeśli chodzi o ustawianie poszczególnych składowych quaternionów to wątpię abyście kiedykolwiek musieli ustawiać ich wartości samodzielnie. Do tworzenia quaternionów służą inne metody ze struktury quaternion o których opowiem wam później. Mimo to warto poznać i zrozumieć znaczenie poszczególnych składowych quaternionu.

Test działania parametru x, y i z.

Tu mam przygotowany skrypt, który pozwala mi zmieniać wartości składowych quaternionu.
Za pomocą tych suwaków będziemy zmieniać wartości składowych quaternionu.
A tu w Inspectorze wyświetla się utworzony quaternion.
Będę obracał wektor skierowany w prawo czyli Vector3.right o zdefiniowany z pomocą parametrów x, y, z i w quaternion.

Do czego służą paramerty x,y,z?

Te parametry decydują o kierunku osi obrotu (axis). Potraktujcie te 3 składowe jako składowe wektora, który określa kierunek osi obrotu.
Zwróćcie uwagę na wartości tych 3 parametrów i kierunek osi obrotu.
Gdy zmieniam wartości składowych x, y, z zmieniam także kierunek osi obrotu. Parametry x, y, z odpowiadają za kierunek osi obrotu.

Gdy parametr w=0 (czyli quaterniony reprezentujące rotacje o równe 180°)

W powyższym przykładzie ustawiłem wartość parametru w na 0 aby wartości parametrów x,y,z odpowiadały dokładnie składowych wektora osi obrotu (axis).

Jest to sytuacja idealna gdy quaternion reprezentuję rotacje o 180° (dla takiej rotacji parametr w = 0). Wcześniej pokazywałem wam wzory, które prezentują jak zmieniają się wartości parametrów w zależności od kąta obrotu.
Z tych wzorów wynika, że ostateczna długość i kierunek wektora osi obrotu (czyli v) w quaternionie zależy od funkcji sinus połowy kąta obrotu.
Czyli wartości parametru x, y i z quaternionu zależą od sinusa połowy kąta obrotu ( czyli θ/2 ).
Sinus połowy kąta obrotu zmienia się jak pokazano na poniższym rysunku.
Zauważcie, że ten sinus przyjmuje maksymalną wartość czyli 1 dla 180° . Dla tego kąta obrotu parametry x, y, z będą reprezentować znormalizowany wektor osi obrotu (jak pokazano na poniższym rysunku).

Gdy parametr w!=0 (czyli quaterniony reprezentujące rotacje różne od niż o 180° )

Dla pozostałych kątów obrotu parametr x, y, z będą także reprezentować kierunek osi obrotu (względny). Składowe wektora osi obrotu (bezwzględnej) będą przemnożone przez sinus połowy konta obrotu a tym samym względna oś obrotu nie będzie znormalizowana (czyli będzie miała długość mniejszą niż 1).
Zobaczcie jak zmieniają się wartości parametru x, y, z gdy zmieniamy kąt obrotu. Ich wartości zmieniają się cały czas proporcjonalnie do sinusa połowy kąta obrotu.

Dla rotacji innych niż o równe 180° , będziemy musieli znormalizować wektor utworzony z parametru x, y, z quaternionu aby uzyskać kierunek osi obrotu (względny).
Quaternion exampleQuaternion; Vector3 xyzNormalized = new Vector3(exampleQuaternion.x, exampleQuaternion.y, exampleQuaternion.z).normalized;
Na poniższym rysunku możecie zobaczyć, że wektor utworzony ze składowych x, y, i z po normalizacji jest równy wektorowi wskazującemu kierunek osi obrotu.
Podsumowując, wektor utworzony ze składowej x, y i z po normalizacji będzie reprezentować oś obrotu (względną).

Przypadek gdy kąt obrotu jest równy 0°

Przypadkiem szczególnym jest także zerowa rotacja. Sinus dla kąta 0° wynosi 0, tym samym dla takiej rotacji nie jesteśmy w stanie określić kierunku osi obrotu.




W którą stronę obrotu wartość kąta wzrasta?

Zanim przejdę dalej do omawiania parametru w musicie wiedzieć, w którą stronę będą wzrastać wartości kątów podczas obrotu.
Unity korzysta z lewoskrętnego układu współrzędnych z osią y skierowaną w górę. W Unity osie układu współrzędnych są rozstawione w taki sposób.
Jeśli chcecie wiedzieć w którą stronę będę wzrastać wartości kątów to skorzystajcie z reguły lewej dłoni.
Ustawcie kciuk lewej dłoni zgodnie z kierunkiem osi obrotu a następnie obróćcie palcami tak aby końce palców poruszały się do przodu. Tak możecie wyznaczyć kierunek obrotu w którym wartości kątów będą wzrastać.
W przypadku tej wizualizacji także ustawiam kciuk lewej dłoni zgodnie z kierunkiem osi obrotu i obracam palcami. W tym właśnie kierunku rosną wartości kąta obrotu a w przeciwnym maleją.

Do czego służy parametr w?

Jak można było wcześniej zauważyć ten parametr przechowuję informacje o tym o jaki kąt obracamy ciało/wektor wokół osi obrotu.
Z poniższych wzorów wynika, że kąt obrotu wokół osi obrotu wpływa na wartość parametru "w".
Działa to też w drugą stronę. Ustawiając odpowiednią wartość parametru "w" określamy o jaki kąt obracamy się wokół osi obrotu.
(Długość wektora osi obrotu nie ma znaczenia gdy tworzymy quaternion, liczy się tylko jego kierunek. Z tego też powodu parametr x, y, z nie mają wpływu na wartość kąta obrotu ale kąt obrotu może mieć wpływ na wartość parametru x, y, z o czym mówiłem w poprzednim podrozdziale)

Jak odczytywać wartości parametru w?

Tu mam rysunek pomocniczy.
Kilka słów jak odczytywać tabele.
Z lewej strony tabeli macie informacje o jaki kąt się obracamy wokół osi obrotu. Wartości kątów są przedstawione w postaci rotacji i orientacji.

Kilka słów na temat rotacji i orientacji

Gdy obracamy ciała należy wyróżnić pojęcie rotacji i orientacji jako dwa sposoby określające sposób obrotu.
Przypominam, że rotacja to obrót, w którym ma znaczenie trasa przebyta w celu obrócenia ciała a orientacja to obrót w którym ma znaczenie najkrótsza droga do określonego obrotu.
Na tym rysunku chce obrócić wektor skierowany w prawo (Vector3.right) o +270° stopni aby ostatecznie wektor był skierowany w dół.
W przypadku rotacji obrót zostanie wykonany przeciwnie do ruchu wskazówek zegara bo liczy się trasa do uzyskania obrotu o 270° stopni.
A w przypadku orientacji obrót zostanie wykonany zgodnie z ruchem wskazówek zegara bo to najkrótsza trasa do uzyskania obrotu wektora o 270 stopni. Więcej na temat tych pojęć mówiłem w odcinku o klasie Transform, link do filmu znajdziecie w spisie treści na temat struktury Quaternion.
Wróćmy do tematu tabeli. Z lewej strony tabeli macie informacje o jaki kąt się obracamy wokół osi obrotu. Wartości kątów są przedstawione w postaci rotacji i orientacji.
W tej kolumnie znajdują się informacje o wartości parametru w dla danego kąta.
Jak dobrze się przyjrzycie zależności miedzy wartością kąta a wartością parametru w to zauważycie, że parametr "w" zmienia się jak kosinus połowy tego kąta.
W ostatniej kolumnie znajdują się informacje o tym dla jakiego kosinusa jest zwracana dana wartość parametru "w".
Kąt w każdym z kosinusów jest połową kąta obrotu.
Jak sami widzicie wartość parametru "w" da się bardzo łatwo odczytać jeśli ma się tablice z wartościami funkcji kosinus dla odpowiednich kątów.
Z prawej strony mamy rysunek pomocniczy przedstawiający wartości kątów i odpowiadające im wartości parametru "w". Oś obrotu na tym rysunku jest skierowana do przodu. Przyjrzyjcie się poszczególnym wartościom parametru "w".

Na co jeszcze warto zwracać uwagę w przypadku parametrze "w"?

Znak parametru w (przedział wartości kątów od 0° do 360°)

Tu macie przykładową wizualizacje quaternionu.

W większości z przygotowanych przeze mnie wizualizacji, wartość kątów podaje jako orientacje czyli wartości kątów uwzględniają kierunek obrotu abyśmy mogli zobaczyć najmniejszą wartość kąta i kierunek obrotu niezbędny do uzyskania określonej orientacji.
Zwróćcie uwagę na związek między znakiem przy wartości parametru "w" i znakiem przy kącie w kolumnie "Orientacja".
Na bazie informacji w tabeli łatwo zauważyć, że znak przy wartości parametru "w" określa kierunek obrotu niezbędny do najszybszego uzyskania danej rotacji (czy obracamy się się zgodnie z regułą lewej dłoni czy w przeciwnym kierunku).

Quaterniony a kąty większe niż 360°

Teraz zobaczmy co się stanie ze składowymi quaternionu gdy będziemy wybierać wartości kątów z poza przedziału od zera do 360°.
Na początek przyjrzyjcie się jak zmienia się wartość parametru "w" w przedziale 0° - 720°

Dla 0° parametr w przyjmuje wartość 1. W przedziale od 0°-360° maleje, a w przedziale 360°-720° rośnie.
Wartość parametru "w" jest związana z wartością kosinusa połowy kąta obrotu. A tym samym jeden pełny cykl kosinusa nie zajmuję 360° stopni a 720°.
Zwróćcie uwagę, na kierunek osi obrotu gdy kąt staje się większy niż 360° i większy niż 720°

Gdy kąt stał się większy niż 360° (względna) oś obrotu zmieniła kierunek na przeciwny. Wartości parametrów x, y, z zostały wymnożone razy -1 tym samym (względna) oś obrotu zmieniła kierunek na przeciwny.
Gdy kąt obrotu staje się większy niż 720° to (względna) oś ponownie zmienia kierunek. Kierunek (względnej) osi obrotu będzie zmieniać się cyklicznie co 360°.
Wcześniej przy omawianiu parametrów x, y , z mówiłem, że kierunek (względnej) osi obrotu jest związany z sinusem połowy kąta obrotu. Z poniższego rysunku widać, że dla kątów obrotu powyżej 360° kierunek (względne) osi obrotu zmieni się na przeciwny (bo sinus będzie zwracał ujemne wartości).
Zmiana kierunku (względnej) osi jest niezbędna z racji tego, że wartość parametru "w" zmienia się jak kosinus połowy kąta obrotu.
Jeśli byśmy co 360° nie zmieniali kierunku (względnej) osi obrotu to ciało zaczęło by obracać się w przeciwnym kierunku.
Poniżej film pokazujący sytuacje gdy obracamy ciało od 0° do 720° ale nie zmienia się kierunek (względnej) osi obrotu.

Ciało zamiast obracać się dalej po 360°, zaczęło obracać się do bazowej rotacji .

Podsumowanie

W tym artykule poznaliście budowę quaternionu. Zrozumienie działania poszczególnych parametrów nie jest tak trudne jak się wydaję. Ta wiedza przyda się do zrozumienia pozostałych właściwości i metod ze struktury Quaternion z dalszych części artykułu.
Tags:
Rafał Tadajewski
I haven't duck. I took dino. - Programmer
10
Comments