Figury geometryczne, których obrazy są tworzone w grafice komputerowej, mogą leżeć w różnych przestrzeniach (np. nieeuklidesowych), ale ostateczna reprezentacja powstaje w afinicznej przestrzeni euklidesowej, a w każdym razie z tą przestrzenią są związane sposoby reprezentowania obrazów przez różne urządzenia. Warto więc przypomnieć, co to jest.
Aksjomatyczne określenie przestrzeni afinicznej jest następujące: jeśli mamy pewien zbiór i przestrzeń liniową , oraz działanie odejmowania punktów, które parze punktów i przyporządkowuje pewien wektor , takie że
dla każdego i istnieje dokładnie jeden punkt spełniający równanie , oraz
dla dowolnych punktów zachodzi tak zwana równość trójkąta: ,
to zbiór nazywa się przestrzenią afiniczną, a przestrzeń jej przestrzenią wektorów swobodnych. Wymiar przestrzeni afinicznej jest równy wymiarowi przestrzeni . Związki między punktami przestrzeni i wektorami swobodnymi są takie:
— różnica punktów jest wektorem, | |||
— suma punktu i wektora jest punktem. |
Przestrzeń afiniczna jest rzeczywista, jeśli jej przestrzeń wektorów swobodnych jest przestrzenią liniową nad ciałem liczb rzeczywistych i w grafice tylko takie przestrzenie się rozpatruje, głównie dwu- i trójwymiarową (nie wykluczam zastosowania przestrzeni nad innymi ciałami w jakichś bardzo specyficznych zastosowaniach).
W przestrzeni wektorów swobodnych możemy określić iloczyn skalarny, czyli funkcję , która jest symetryczna,
liniowa ze względu na pierwszy (a ze względu na symetrię także drugi) argument,
i dodatnio określona,
Przestrzeń afiniczna, której przestrzeń wektorów swobodnych jest wyposażona w iloczyn skalarny, nazywa się przestrzenią euklidesową. W takiej przestrzeni możemy mierzyć odległości punktów, wzorem
a także kąty między prostymi, np. jeśli prosta przechodzi przez dwa różne punkty i , a przez i , to kąt między tymi prostymi spełnia równość
Mając pojęcia odległości i kąta, możemy określić miary, takie jak pole powierzchni i objętość. Po to, by to wszystko obliczać, potrzebny jest jakiś układ współrzędnych.
Istotne jest, że w dowolnej przestrzeni liniowej (oprócz zerowymiarowej) istnieje wiele różnych iloczynów skalarnych. Każdy z nich określa kąty i odległości inaczej. Możemy wybrać jeden z nich, wyróżniając pewien układ współrzędnych kartezjańskich i postulując, że wersory osi właśnie tego układu mają długość i są wzajemnie do siebie prostopadłe (co określa się stwierdzeniem tworzą układ ortonormalny).
Ustalmy dowolne punkty w -wymiarowej przestrzeni afinicznej . Jeśli układ wektorów jest liniowo niezależny (jest bazą przestrzeni wektorów swobodnych), to można go użyć do określenia układu współrzędnych w ; dla dowolnego punktu istnieje dokładnie jeden ciąg liczb , taki że
(4.1) |
Liczby to współrzędne kartezjańskie punktu .
Punkt jest początkiem układu i razem z wektorami (zwanymi wersorami osi) tworzy układ odniesienia rozpatrywanego układu współrzędnych kartezjańskich.
Ciąg liczb będących współrzędnymi (nie tylko kartezjańskimi) punktu wygodnie jest przedstawiać w postaci macierzy. Może to być macierz kolumnowa (tu będzie stosowana ta konwencja) lub wierszowa (spotykana często w literaturze i w różnych pakietach oprogramowania). Użycie macierzy umożliwia przedstawienie przekształceń za pomocą mnożenia macierzy; powyższe dwie konwencje różnią się wtedy kolejnością zapisu czynników.
Pewien układ współrzędnych w przestrzeni trójwymiarowej wyróżnimy i nazwiemy układem globalnym, albo układem świata. W tym układzie będziemy ustawiać rozmaite przedmioty, z których składa się scena do przedstawienia na obrazie, oraz ,,kamerę”, czyli obiekt określający odwzorowanie przestrzeni trójwymiarowej na płaszczyznę obrazu. Przyjmiemy, że iloczyn skalarny w tym układzie jest dany wzorem
przy czym utożsamiliśmy tu wektory (swobodne) z ich macierzami (kolumnowymi) współrzędnych w układzie globalnym. W konsekwencji, układ odniesienia globalnego układu współrzędnych składa się z wektorów o długości , wzajemnie do siebie prostopadłych — wektory układu odniesienia stanowią bazę ortonormalną przestrzeni . W wielu innych układach współrzędnych iloczyn skalarny jest określony tym samym wzorem; układ odniesienia każdego takiego układu współrzędnych, który będziemy nazywać układem prostokątnym, jest też bazą ortonormalną. Pozostałe układy współrzędnych będziemy nazywać układami ukośnymi.
Dowolny układ współrzędnych jest prawoskrętny albo lewoskrętny; przynależność do jednej z tych klas nazywa się orientacją. Nazwa jest kwestią umowy; przyjmiemy, że układ globalny jest prawoskrętny i prawoskrętny jest też układ wektorów wyznaczonych przez kciuk, palec wskazujący i palec środkowy prawej ręki (rys. 4.2). Orientacja jest związana z kolejnością współrzędnych; przestawienie dowolnych dwóch współrzędnych (czyli przestawienie dowolnych dwóch wektorów układu odniesienia) powoduje zmianę orientacji na tę drugą.
Równość (4.1) można zapisać w bardziej symetrycznej postaci,
w której oraz dla . Liczby nazywają się współrzędnymi barycentrycznymi punktu w układzie odniesienia .
Fizyczna interpretacja współrzędnych barycentrycznych jest następująca: niech oznacza masę odważnika umieszczonego w punkcie . Poszczególne odważniki mogą mieć masy dodatnie, ujemne, a także równe , ale zakładamy, że ich suma jest równa . Wtedy punkt , którego współrzędnymi barycentrycznymi w układzie odniesienia są liczby , jest środkiem ciężkości układu punktów (stąd i z greki wzięła się nazwa tych współrzędnych). Na płaszczyźnie punkty , które stanowią układ odniesienia układu współrzędnych barycentrycznych, są wierzchołkami trójkąta. Współrzędne barycentryczne dowolnego punktu wewnątrz tego trójkąta są dodatnie; punkty każdej z trzech prostych, na których leżą boki trójkąta, mają jedną ze współrzędnych barycentrycznych równą , a punkty na zewnątrz trójkąta mają jedną lub dwie współrzędne barycentryczne ujemne.
Przykład zastosowania: przypuśćmy, że dana jest funkcja ciągła , której dziedzina jest wielokątem, składającym się z trójkątów o rozłącznych wnętrzach. Wykres tej funkcji w każdym trójkącie zawiera się w płaszczyźnie (czyli też jest trójkątem, zobacz rysunek (4.4)), a więc jeśli wprowadzimy układ współrzędnych kartezjańskich na płaszczyźnie zawierającej dziedzinę, to we wspomnianych trójkątnych fragmentach dziedziny funkcja jest wielomianem pierwszego stopnia tych współrzędnych. Należy obliczyć wartość funkcji w dowolnym punkcie na podstawie wartości tej funkcji w wierzchołkach trójkąta zawierającego punkt .
W grafice komputerowej powyższe zadanie rozwiązuje się podczas cieniowania trójkątów. Najprostsza (i powszechnie stosowana, a w szczególności implementowana w sprzęcie, tj. w procesorach graficznych) metoda polega na nadaniu każdemu pikselowi należącemu do trójkąta na obrazie wartości (koloru) otrzymanej przez interpolację wartości podanych w wierzchołkach (jest to tzw. cieniowanie Gourauda).
Załóżmy, że mamy obliczyć wartość funkcji w (pojedynczym) punkcie (którego współrzędne kartezjańskie są dane) i znamy wszystkie trójkąty, tj. współrzędne kartezjańskie ich wierzchołków i wartości funkcji w tych punktach. Aby obliczyć wartość funkcji , należy
znaleźć wierzchołki , , trójkąta zawierającego punkt ,
obliczyć współrzędne barycentryczne , , punktu w układzie odniesienia , , , rozwiązując układ równań liniowych
którego współczynnikami są współrzędne kartezjańskie odpowiednich punktów,
obliczyć .
Sposób obliczania współrzędnych barycentrycznych punktów w przestrzeni trójwymiarowej jest taki sam; układ odniesienia składa się z wierzchołków dowolnego czworościanu (tj. z dowolnych czterech punktów nie leżących w jednej płaszczyźnie). Ze współrzędnych kartezjańskich tych punktów i punktu , którego współrzędne barycentryczne chcemy obliczyć, tworzymy układ równań liniowych
i rozwiązujemy.
Dowolnemu punktowi w -wymiarowej przestrzeni afinicznej z ustalonym układem współrzędnych kartezjańskich możemy przyporządkować współrzędne jednorodne; jest ich , przy czym ostatnia z tych współrzędnych jest różna od zera. Współrzędne kartezjańskie otrzymamy dzieląc pierwsze współrzędnych jednorodnych przez ostatnią, np. w przestrzeni trójwymiarowej punkt, którego współrzędnymi jednorodnymi są liczby , , , , ma współrzędne kartezjańskie , , . Najprostszy sposób otrzymania współrzędnych jednorodnych to dołączenie jedynki do współrzędnych kartezjańskich danego punktu. Ostatnią współrzędną jednorodną będziemy nazywać współrzędną wagową.
Jest oczywiste, że pomnożenie wszystkich współrzędnych jednorodnych przez dowolną liczbę inną niż daje w wyniku współrzędne jednorodne tego samego punktu. Przymiotnik ,,jednorodne” oznacza w matematyce właśnie tę cechę różnych obiektów. Współrzędne jednorodne wydają się być ,,nieoszczędne”, jeśli chodzi o ilość zajmowanego miejsca i czas przetwarzania punktów, ale dają liczne i istotne korzyści w zastosowaniach.
Rozważmy przestrzeń współrzędnych jednorodnych . Zbadamy jej związek z dwuwymiarową przestrzenią afiniczną i jej przestrzenią wektorów swobodnych . Przestrzeń możemy utożsamić z warstwą przestrzeni współrzędnych jednorodnych, a przestrzeń z warstwą (która jest podprzestrzenią liniową).
Jeśli , to wektor reprezentuje punkt . Wszystkie takie wektory reprezentują pewne punkty przestrzeni , natomiast pozostałe reprezentują kierunki wektorów w przestrzeni wektorów swobodnych . Jeśli uznamy, że nie interesują nas różnice między punktami przestrzeni i kierunkami wektorów w (które są nazywane punktami niewłaściwymi), to otrzymamy przestrzeń rzutową i okaże się, że zajmujemy się geometrią rzutową.
Jeśli chcemy wykonywać rachunki na punktach i wektorach reprezentowanych przez wektory współrzędnych jednorodnych, dopuszczając różne wagi (czyli różne wartości ostatniej współrzędnej jednorodnej), to musimy ,,uzgodnić” reprezentacje. Rozważmy przykład — wyznaczanie środka odcinka, którego końce są reprezentowane przez macierze i . Jeśli obliczymy macierz , to otrzymamy punkt który nie leży nawet na naszym odcinku (współrzędne kartezjańskie końców tego odcinka to i , a otrzymana macierz reprezentuje punkt ). Aby dostać poprawny wynik, należy pomnożyć macierz współrzędnych jednorodnych jednego punktu przez taki czynnik, aby ostatnia współrzędna obu argumentów była taka sama. Nieco większy kłopot sprawiają wektory swobodne; macierz współrzędnych jednorodnych reprezentuje tylko kierunek takiego wektora i trzeba ,,z zewnątrz” dostarczyć informację, jakiej współrzędnej wagowej punktów odpowiada dana macierz współrzędnych jednorodnych.
Podobnie jak współrzędne kartezjańskie, możemy ,,ujednorodnić” także współrzędne barycentryczne; wystarczy opuścić założenie, że ich suma jest równa . Podanie dla ustalonego układu współrzędnych barycentrycznych ciągu dowolnych liczb , których suma jest różna od , określa punkt, którego współrzędne barycentryczne otrzymamy dzieląc te liczby przez ich sumę. Oczywiście, suma jednorodnych współrzędnych barycentrycznych, które interpretujemy jako masy odważników, jest współrzędną wagową punktu. Jeśli suma jednorodnych współrzędnych barycentrycznych jest równa , to określają one pewien kierunek wektorów swobodnych, czyli punkt niewłaściwy.
Przekształcenie jest afiniczne, jeśli dla każdego układu punktów i liczb , takich że jest spełniony warunek
To oznacza w szczególności, że obrazem dowolnej prostej jest prosta (prosta to zbiór dla ustalonych punktów ), albo punkt. Obrazem prostych równoległych są punkty albo proste równoległe (bo jeśli proste i są równoległe, czyli wektory i są liniowo zależne, to łatwo jest sprawdzić, że ich obrazy w przekształceniu są punktami albo spełniają tę samą definicję równoległości).
Własności figur, zachowywane przez przekształcenia afiniczne, nazywają się niezmiennikami afinicznymi. Dalsze ich przykłady to
współliniowość i współpłaszczyznowość punktów,
równoległość prostych i płaszczyzn,
wypukłość figury,
proporcje odległości punktów współliniowych (ten i następne przykłady dotyczą przekształceń różnowartościowych),
bycie trójkątem,
bycie równoległobokiem,
bycie elipsą.
Jeśli mamy ustalony układ współrzędnych (kartezjański), to obliczenia punktów sprowadzamy do rachunków na wektorach współrzędnych. Ogólnie, przekształcenie afiniczne można zapisać w postaci
w której macierz reprezentuje część liniową przekształcenia , a wektor — przesunięcie.
Przekształcenie jest różnowartościowe wtedy gdy macierz jest nieosobliwa. Macierz ta opisuje związane z przekształceniem przekształcenie liniowe przestrzeni wektorów swobodnych:
Złożenie przekształceń afinicznych jest przekształceniem afinicznym. Odwrotność (jeśli istnieje) też.
Często trzeba wyznaczyć złożenie przekształceń afinicznych; możemy je opisać wzorem
który jest niewygodny (i jeszcze mniej wygodne wzory dostaniemy chcąc opisać złożenie większej liczby przekształceń). Jeśli do współrzędnych kartezjańskich , , punktu dopiszemy , to możemy napisać
W ten sposób pojawiają się współrzędne jednorodne, dzięki którym przekształcenie afiniczne możemy przedstawić w wygodny sposób, za pomocą jednego mnożenia macierzy.
Macierze i są blokami macierzy jednorodnej przekształcenia (to jest jeden z dwóch głównych powodów, dla których działania na macierzach i są często realizowane przez sprzęt). Składanie przekształceń afinicznych reprezentowanych w takiej postaci polega na mnożeniu macierzy reprezentujących poszczególne przekształcenia.
Możemy też jednolicie traktować punkty i wektory swobodne. Istotnie, wystarczy do współrzędnych wektora swobodnego dopisać i dalej przekształcenie wektora za pomocą mnożenia macierzy jest wykonywane poprawnie (otrzymujemy wynik działania części liniowej przekształcenia na wektor).
Rozważmy płaszczyznę w przestrzeni trójwymiarowej,
daną za pomocą punktu i wektora normalnego . Załóżmy, że iloczyn skalarny jest dany wzorem , a zatem równanie płaszczyzny (które jest spełnione przez wszystkie punkty tej płaszczyzny i przez żadne inne) ma postać
Niech oznacza różnowartościowe przekształcenie afiniczne, którego część liniowa jest reprezentowana przez macierz . Obraz płaszczyzny w przekształceniu jest płaszczyzną zawierającą punkt , który łatwo jest znaleźć, a jej wektor normalny też jest łatwy do znalezienia. Możemy mianowicie napisać
skąd wynika, że tym wektorem jest (zamiast możemy w skrócie pisać ). Warto o tym pamiętać z uwagi na rolę, jaką spełnia wektor normalny we wszystkich modelach oświetlenia powierzchni.
Przypuśćmy, że punkt ma w układzie współrzędnych określonym przez układ odniesienia współrzędne jednorodne , a z kolei punkt i wektory znamy mając ich współrzędne jednorodne w układzie . Wtedy współrzędne punktu w tym drugim układzie spełniają równość
Zatem, wzór opisujący przekształcenie afiniczne (mnożenie wektora współrzędnych przez macierz) można też interpretować jako przejście do nowego układu współrzędnych. Często w grafice komputerowej modelujemy sceny złożone z wielu obiektów, z których każdy jest opisywany osobno w wygodnym dla opisania tego obiektu układzie. Składanie sceny z takich obiektów jest równoważne określeniu sposobu przejscia od ich układów współrzędnych do układu całej sceny, co polega na podaniu odpowiednich macierzy.
Często należy znaleźć macierz przekształcenia, które jest określone przy użyciu innego układu odniesienia niż układ dany. Aby to zrobić, należy dokonać odpowiedniego przejścia. Na przykład, niech macierz opisuje (we współrzędych jednorodnych) obrót wokół prostej przechodzącej przez początek układu. Niech oznacza macierz przesunięcia, która początek wyjściowego układu przekształca na punkt . Aby znaleźć obraz punktu w obrocie o ten sam kąt wokół prostej równoległej do i przechodzącej przez punkt , należy kolejno
obliczyć współrzędne punktu w układzie przesuniętym (którego początkiem jest punkt ; macierz zmiany układu jest równa ,
dokonać obrotu,
obliczyć współrzędne obrazu w wyjściowym układzie; odpowiednią macierzą jest macierz .
Zatem poszukiwana macierz jest równa iloczynowi . Podobne wyrażenia opisują wszelkie przekształcenia określone w innym układzie niż układ wyjściowy.
Część liniowa przesunięcia jest opisana przez macierz jednostkową, a zatem przekształcenia te nie zmieniają kierunku żadnej prostej, ani długości żadnego odcinka.
Skalowanie to przekształcenie, którego część liniowa jest w pewnym układzie reprezentowana przez macierz diagonalną. Podobnie jak przesunięcie o wektor można interpretować jako przesunięcie układu odniesienia o , zaś obrót o kąt jako obrót układu o kąt , skalowanie ze współczynnikami , , (na diagonali macierzy) może być traktowane jak przejście do układu z jednostami osi różniącymi się od dotychczasowych o czynniki , i .
Skalowanie oczywiście nie jest różnowartościowe, jeśli któryś ze współczynników, , lub jest równy ; w przeciwnym razie istnieje przekształcenie odwrotne, które jest skalowaniem ze współczynnikami , i .
Niezmiennikami skalowań różnowartościowych są kierunki prostych równoległych do osi układu. Klasa skalowań wymieniona wyżej jest bardzo obszerna i dlatego w praktyce często przez skalowanie rozumie się przekształcenie, którego część liniowa jest diagonalna a przesunięcie zerowe w układzie współrzędnych określonym przez układ odniesienia o wzajemnie prostopadłych wersorach osi. Jeśli osie układu równań, w którym część liniowa skalowania jest diagonalna, są wzajemnie prostopadłe, to macierz skalowania w każdym układzie współrzędnych o wzajemnie prostopadłych osiach jest symetryczna (współczynniki skalowania osi są wartościami własnymi, a wektory własne wyznaczają wzajemnie prostopadłe kierunki skalowania).
Jeśli wszystkie współczynniki są równe albo , to mamy do czynienia z rzutem. Jeśli natomiast , to mamy odbicie symetryczne. W przestrzeni trójwymiarowej mamy takie możliwości rzutów i odbić (zakładamy we wzorach, że )
— rzut na początek układu.
— rzut na prostą o kierunku wektora .
— rzut na płaszczyznę prostopadłą do .
— rzut na całą przestrzeń, a także odbicie względem całej przestrzeni (czyli przekształcenie tożsamościowe).
— odbicie względem płaszczyzny prostopadłej do .
— odbicie względem prostej o kierunku .
— odbicie symetryczne względem początku układu.
Powyższe rzuty i odbicia są określone za pomocą pojęcia prostopadłości. Nie jest ono potrzebne do określania rzutów równoległych. Takie przekształcenie jest określone za pomocą wektora i płaszczyzny zwanej rzutnią, nie zawierającej tego wektora. Aby dokonać rzutowania, należy
wybrać dowolny punkt rzutni oraz dwa liniowo niezależne wektory i równoległe do rzutni,
przejść do układu współrzędnych o początku i wersorach osi , i ,
dokonać rzutowania; macierz rzutu w tym układzie ma na diagonali współczynniki , , ,
wrócić do układu wyjściowego — wcześniej były opisane wszystkie potrzebne szczegóły.
Obroty w płaszczyźnie są jednoznacznie określone przez środek obrotu i kąt. Macierz części liniowej obrotu ma postać
gdzie , .
Macierz części liniowej obrotu jest ortogonalna, o wyznaczniku równym . W przestrzeni trójwymiarowej dla każdej takiej macierzy istnieje oś oraz kąt, takie że pomnożenie dowolnego wektora przez tę macierz jest równoważne obróceniu tego wektora wokół tej osi o ten kąt. Zamiast mówić ,,obrót wokół osi”, można też mówić ,,obrót w płaszczyźnie”, mając na myśli płaszczyznę prostopadłą do osi obrotu.
Obroty wokół osi , , , czyli obroty w płaszczyznach odpowiednio , i , są opisane przez macierze, których części liniowe są następujące:
Obrót wokół osi o kierunku dowolnego wektora można przedstawić jako złożenie pięciu obrotów reprezentowanych przez powyższe macierze (dwa obroty przekształcają oś obrotu na oś np. układu współrzędnych, następnie należy wykonać obrót wokół tej osi, a na końcu wrócić do wyjściowego układu współrzędnych), ale znacznie wygodniejszą metodą jest użycie bezpośredniego wzoru opisującego macierz takiego obrotu. Wyprowadzimy go.
Niech . Poddawany przekształceniu wektor możemy rozłożyć na dwa, wzajemnie prostopadłe składniki: — obraz w rzucie prostopadłym na kierunek wektora i — obraz w rzucie na płaszczyznę obrotu (prostopadłą do ). Oznaczmy . Obraz punktu , obróconego w płaszczyźnie prostopadłej do o kąt , jest równy
Macierz obrotu jest sumą trzech macierzy opisujących przekształcenia liniowe, dzięki którym otrzymaliśmy powyższe składniki. Zatem,
Kolumny macierzy są iloczynami wektorowymi wektora i odpowiednich kolumn macierzy jednostkowej . Stąd macierz obrotu jest równa
Złożenie dwóch obrotów w przestrzeni trójwymiarowej jest obrotem; mając dane wektory jednostkowe i osi obrotu i kąty i tych obrotów możemy znaleźć oś i kąt obrotu, który jest złożeniem tych dwóch. Wektor wyznaczający kierunek osi i kąt tego obrotu spełniają równości
w których występuje wektor określony wzorem | ||||
Wyprowadzenie powyższych wzorów jest łatwe przy użyciu kwaternionów, o których będzie mowa dalej.
Podczas modelowania sceny trójwymiarowej możemy napotkać następujący problem: mamy dane trzy punkty niewspółliniowe, , i , które jednoznacznie określają położenie pewnego obiektu (bryły sztywnej). Chcemy ten obiekt umieścić tak, aby te punkty znalazły się we wskazanej płaszczyźnie. W tym celu musimy obiekt odpowiednio obrócić i przesunąć. Skonstruujemy macierz reprezentującą potrzebny obrót (konstrukcja odpowiedniego przesunięcia jest prostym ćwiczeniem).
Uściślijmy zadanie: płaszczyzna, w której mają znaleźć się dane punkty jest określona przez podanie punktów , i , też niewspółliniowych. Chcemy, aby dla skonstruowanego obrotu, reprezentowanego przez macierz ,
obraz wektora był równoległy do wektora i miał ten sam zwrot,
obraz wektora był kombinacją liniową wektorów i , a ponadto ma być .
Macierz przekształcenia, które jest obrotem, musi być ortogonalna i jej wyznacznik musi być równy . Rozwiązanie tak postawionego zadania jest jednoznaczne.
Niech . Rozważmy macierz . Wyznacznik tej macierzy jest dodatni. Macierz ta opisuje przejście od układu współrzędnych o układzie odniesienia do układu współrzędnych, którego wersorami osi są wektory , i . Istnieją (jednoznacznie określone) macierze i , takie że , macierz jest ortogonalna (tj. ) i , a macierz jest trójkątna górna i współczynniki na jej diagonali są dodatnie (mamy ; wyznacznik ten jest równy iloczynowi współczynników diagonalnych macierzy ).
Możemy zauważyć, że kolumna macierzy ma kierunek i zwrot wektora , zaś kolumna tej macierzy leży w przestrzeni rozpiętej przez i , a ponadto .
Macierz jest więc macierzą obrotu, który przekształca wersory , i na , i ; macierz dokonuje przekształcenia odwrotnego. Obraz wektora w tym przekształceniu ma kierunek i zwrot wektora , zaś obraz wektora leży w płaszczyźnie rozpiętej przez i .
Podobnie możemy postąpić z macierzą , której ostatnia kolumna . Poszukiwana macierz obrotu, który spełnia postawione warunki, jest równa . Macierze i możemy obliczyć na różne sposoby, na przykład dokonując ortogonalizacji Grama-Schmidta kolumn macierzy i .
Przypuśćmy, że chcemy otrzymać macierz obrotu na płaszczyźnie, o kąt wokół punktu . Przekształcenie takie otrzymujemy w następujących krokach:
Zmieniamy układ współrzędnych tak, aby środek obrotu był początkiem układu. Odpowiednia macierz ma postać
Wykonujemy obrót o wokół początku układu. Macierz obrotu ma postać
Wracamy do wyjściowego układu, co opisuje macierz
Macierz całego przekształcenia jest iloczynem powyższych trzech:
Zbadamy teraz sposoby składania przekształceń w trzech typowych sytuacjach, z jakimi mamy do czynienia w grafice. Interesuje nas kolejność, w jakiej trzeba mnożyć macierze reprezentujące składane przekształcenia.
Przypuśćmy, że pewien obiekt, , został określony przy użyciu wprowadzonego w tym celu (,,lokalnego”) układu współrzędnych kartezjańskich. Mamy też drugi układ, ,,pośredni”, w którym chcemy ,,ustawić” obiekt . Układ odniesienia (tj. początek układu i wersory osi) układu lokalnego jest obrazem układu odniesienia ,,pośredniego” układu współrzędnych w przekształceniu afinicznym reprezentowanym (w postaci jednorodnej) przez macierz .
Mamy też trzeci, ,,globalny” układ współrzędnych. Układ odniesienia układu ,,pośredniego” jest obrazem układu odniesienia ,,globalnego” układu współrzędnych w przekształceniu , którego macierzą jest . Jeśli wektor składa się ze współrzędnych jednorodnych w ,,lokalnym” układzie pewnego punktu obiektu , to wektorem współrzędnych jednorodnych tego punktu w układzie ,,pośrednim” jest wektor , zaś w układzie ,,globalnym” wektor .
Przypuśćmy, że obiekt jest ,,generowany” przez pewną procedurę
(nazwijmy ją O
). Dokładniej, procedura ta ,,wytwarza” pewne
punkty (np. wierzchołki trójkątów), obliczając ich współrzędne
w układzie ,,lokalnym”. Procedura O
,,nie wie” niczego
o innych układach współrzędnych. Inna procedura, P
,
wywołuje O
, poprzedzając to określeniem przekształcenia
układu, w którym O
podaje współrzędne punktów, do swojego
(,,pośredniego”) układu współrzędnych. Procedura P
jest
z kolei wywoływana przez pewną procedurę G
, która przed
wywołaniem P
określa przejście od jej układu współrzędnych
do układu ,,globalnego”. ,,Określenie” przejścia polega na
nadaniu odpowiedniej wartości pewnej macierzy (która może być
przechowywana w ustalonej tablicy w programie, lub w rejestrach urządzenia
graficznego). Jeśli początkowa macierz przejścia (od układu ,,globalnego”
do ,,globalnego”) jest jednostkowa, to procedura G
przed
wywołaniem P
pomnoży ją przez (i przypisze macierzy
przejścia iloczyn). Dalej, procedura P
przed
wywołaniem O
pomnoży tę macierz przez . Jak widać,
każda kolejna macierz musi być ,,domnożona” z prawej strony.
Typowe dla tej sytuacji jest użycie stosu macierzy przekształceń.
Jeśli procedura P
ustawia więcej niż jeden obiekt, przy czym
każdy z tych obiektów jest określony w układzie, z którego przejście
do układu ,,pośredniego” jest inne, to procedura P
powinna
zapamiętać (na stosie) bieżącą macierz przekształcenia
(od swojego ,,pośredniego” układu do ,,globalnego”). Następnie
powinna dla każdego obiektu pomnożyć kopię tej macierzy przez macierz
przejścia od ,,lokalnego” układu tego obiektu do układu pośredniego.
Po zakończeniu działania procedury wprowadzającej obiekt procedura
P
powinna odtworzyć macierz przejścia taką, jaka była
w chwili jej wywołania.
Zarówno w języku PostScript, jak i w bibliotece OpenGL jest to podstawowy sposób określania przekształceń złożonych. W obu tych przypadkach są dostępne odpowiednie stosy.
Druga sytuacja jest typowa dla animacji: pewien obiekt jest określony w swoim, ,,lokalnym” układzie współrzędnych. Układ ten początkowo pokrywa się z układem ,,globalnym”. Chcemy uzyskać serię obrazów, w których każdy przedstawia obiekt w kolejnym położeniu.
Jeśli macierz przekształcenia od położenia do , reprezentowanego w ,,globalnym” układzie współrzędnych, oznaczymy , to oczywiście macierz, która ,,przestawia” obiekt z położenia do jest równa . W tym przypadku macierz każdego kolejnego przekształcenia jest czynnikiem z lewej strony.
Mamy sytuację podobną do poprzedniej: chcemy poddać pewien obiekt serii przekształceń (po to, aby otrzymać jego kolejne położenia), ale tym razem określimy każde kolejne przekształcenie w układzie ,,lokalnym”, związanym z aktualnym położeniem obiektu. Rozważmy dwa takie przekształcenia. Niech oznacza macierz pierwszego z nich; ponieważ początkowo ,,lokalny” układ pokrywa się z ,,globalnym”, więc jedno (pierwsze) przekształcenie wykonujemy jak poprzednio. Drugie przekształcenie jest reprezentowane przez macierz w układzie współrzędnych, którego układ odniesiena jest obrazem układu odniesienia układu globalnego w pierwszym przekształceniu.
Macierz drugiego przekształcenia w układzie globalnym jest równa . Jeśli zatem zastosujemy przepis na składanie kolejno wykonywanych przekształceń określonych w układzie ,,globalnym”, to otrzymamy macierz . Zatem, jeśli kolejne przekształcenie mamy określone w układzie związanym z bieżącym położeniem obiektu, to odpowiednia macierz jest czynnikiem z prawej strony.
Opisana sytuacja jest najczęściej związana z tzw. grafiką żółwia. Wytresowany żółw porusza się po płaszczyźnie lub w przestrzeni i wykonuje kolejne polecenia takie jak ,,idź jeden krok do przodu” lub ,,obróć się w lewo”. Przemieszczając się żółw zostawia ślad (np. rysuje odcinki). Ta technika wykonywania obrazów jest niezastąpiona np. podczas rysowania roślin.
Każde przekształcenie afiniczne jest złożeniem obrotów, skalowań i przesunięć. Interesującym problemem, którego rozwiązanie bywa potrzebne w praktyce, jest znalezienie tych przekształceń na podstawie danej macierzy reprezentującej pewne przekształcenie afiniczne.
Dowolne przekształcenie afiniczne jest złożeniem przekształcenia liniowego i przesunięcia. Współrzędne wektora przesunięcia są dane w czwartej kolumnie macierzy (reprezentacji jednorodnej). Pozostaje niebanalny problem rozłożenia macierzy , opisującej część liniową przekształcenia afinicznego, na macierze obrotów i skalowań. W tym celu przypomnijmy, że każda macierz rzeczywista jest iloczynem trzech macierzy:
takich że i są ortogonalne, a macierz jest diagonalna, o nieujemnych współczynnikach na diagonali. Jest to tak zwany rozkład SVD (albo rozkład względem wartości szczególnych). W naszym przypadku wszystkie te macierze mają wymiary . Zmieniając odpowiednio znaki wierszy macierzy i kolumn macierzy oraz współczynników diagonalnych macierzy , możemy otrzymać macierze i , których wyznaczniki są równe . Rozważymy jeszcze jeden rozkład, tzw. rozkład biegunowy:
w którym oraz . Macierz jest ortogonalna, a macierz jest symetryczna. Jeśli macierz jest nieosobliwa, to rozkład biegunowy możemy łatwo znaleźć za pomocą algorymu Highama. Przyjmujemy , a następnie obliczamy kolejne macierze
Otrzymany ciąg macierzy bardzo szybko zbiega do macierzy ; w praktyce często wystarczy wykonać kilka iteracji. Macierz otrzymamy, obliczając iloczyn .
Mając macierz , możemy znaleźć macierze i przez rozwiązanie algebraicznego zagadnienia własnego. Macierz diagonalna reprezentuje skalowanie. Macierz też reprezentuje skalowanie, w kierunkach pewnych trzech prostych wzajemnie prostopadłych; kolumny macierzy mają te kierunki. Oczywiście, współczynnikami skalowania są wartości własne macierzy i . Znając macierz , możemy obliczyć macierz .
Macierz ortogonalna ma wyznacznik równy albo . W pierwszym przypadku jest to macierz obrotu; jej wartościami własnymi są liczby zespolone , i . Oś obrotu ma kierunek wektora własnego przynależnego do wartości własnej . Liczby i to kosinus i sinus kąta obrotu. Oś obrotu reprezentowanego przez macierz możemy znaleźć (z dokładnością wystarczającą w grafice), wybierając dwa niezależne liniowo wiersze macierzy i obliczając ich iloczyn wektorowy.
W drugim przypadku wartościami własnymi (macierzy ortogonalnej ) są liczby , i . Macierz taka reprezentuje złożenie obrotu z odbiciem symetrycznym względem płaszczyzny prostopadłej do osi obrotu. W obu przypadkach, jeśli , to mamy do czynienia z odbiciem symetrycznym względem punktu, prostej lub płaszczyzny.
Podsumowując: dowolne przekształcenie afiniczne jest złożeniem obrotu, skalowania osi układu , drugiego obrotu i przesunięcia (to jest interpretacja związana z rozkładem SVD), albo złożeniem skalowania pewnych trzech osi prostopadłych, obrotu i przesunięcia (ta interpretacja jest związana z rozkładem biegunowym).
W pewnych zastosowaniach (np. w animacji i rejestrowaniu ruchu) mamy do czynienia z macierzami ortogonalnymi, które są znane niedokładnie, z powodu błędów zaokrągleń. Algorytm Highama jest najprostszym sposobem wyeliminowania tych błędów, tj. znalezienia macierzy ortogonalnej najbliższej macierzy danej.
Liczba zespolona jest parą liczb rzeczywistych: ; na zbiorze takich obiektów określa się dodawanie, tak jakby to były wektory w , i mnożenie, wzorem . Liczba zespolona , taka że nazywa się jednostkowa; pomnożenie dowolnej liczby zespolonej przez daje w wyniku liczbę, której obie części, rzeczywista i urojona, są równe współrzędnym obrazu wektora w obrocie o kąt , takim że , .
Liczbie zespolonej przyporządkowujemy macierz
Pierwsza jej kolumna to liczba . Mnożenie i dodawanie liczb zespolonych to działania równoważne dodawaniu i mnożeniu takich macierzy, a w przypadku, gdy liczba jest jednostkowa, macierz jest macierzą obrotu w .
Dość podobną reprezentację obrotów w przestrzeni trójwymiarowej stanowią kwaterniony. Są to wektory w , z odpowiednio określonymi działaniami. Dodawanie i odejmowanie kwaternionów jest dodawaniem i odejmowaniem wektorów w .
Aby określić mnożenie i dzielenie, zamiast macierzy kolumnowej , będziemy używać notacji , w której wyróżniamy część skalarną (pierwszą współrzędną) i część wektorową . Wzór opisujący mnożenie kwaternionów ma postać
Jak widać, wzór opisujący iloczyn kwaternionów bardzo przypomina wzór na iloczyn liczb zespolonych; najbardziej widoczna różnica to składnik w części wektorowej. Z powodu tego składnika mnożenie kwaternionów jest nieprzemienne, ale jest ono łączne i rozdzielne względem dodawania (ćwiczenie: sprawdź to).
Aby dokładniej zbadać własności kwaternionów, kwaternionowi przyporządkujemy macierz
Oczywiście, każdej macierzy utworzonej z czterech liczb zgodnie z tym schematem odpowiada pewien kwaternion. Wykonując odpowiednie rachunki, możemy sprawdzić, że sumie kwaternionów i odpowiada suma przyporządkowanych im macierzy, , a ponadto , skąd dalej wynika, że macierz odpowiada iloczynowi kwaternionów .
Dalej przyda się kilka określeń: kwaternion sprzężony do to ; wartość bezwzględna kwaternionu jest liczbą rzeczywistą . Wartość bezwzględna kwaternionu jest więc pierwiastkiem z sumy kwadratów wszystkich czterech współrzędnych i jedyny kwaternion, którego wartość bezwzględna jest równa to zero, czyli .
Zobaczmy, jak to wygląda w notacji macierzowej. Jeśli kwaternion jest związany z macierzą , to kwaternionowi sprzężonemu odpowiada macierz transponowana . Iloczynowi odpowiada macierz . Macierz jest więc iloczynem pewnej macierzy ortogonalnej i liczby . Zachodzi równość (można pokazać, że wyznacznik macierzy jest nieujemny), a z niej (i z twierdzenia Cauchy'ego) wynika, że dla dowolnych kwaternionów , zachodzi równość .
Kwaternion niemy ma część wektorową równą (odpowiadająca mu macierz jest diagonalna). Zauważmy, że mnożenie kwaternionów niemych daje w wyniku kwaternion niemy, o części skalarnej równej iloczynowi części skalarnych czynników; można więc utożsamić zbiór kwaternionów niemych ze zbiorem liczb rzeczywistych i dodawanie oraz mnożenie w obu zbiorach są wykonywane tak samo. Zauważmy jeszcze dwie rzeczy: jeśli dowolny argument mnożenia jest kwaternionem niemym, to kolejność tych argumentów można zmienić, a ponadto wzór opisujący wartość bezwzględną dowolnego kwaternionu możemy teraz zapisać w postaci .
Jedynka kwaternionowa to kwaternion (odpowiada jej macierz jednostkowa ). Jest ona elementem neutralnym mnożenia (i jest to jedyny taki element). Dla skrótu kwaternion zerowy i jedynkę można zapisywać symbolami i , pamiętając, że to kwaterniony.
Kwaternion odwrotny do to , taki że . Odwrotność jest jednoznaczna i wyraża się wzorem (przypomina on wzór na odwrotność liczby zespolonej). Każdy kwaternion różny od zera ma odwrotność. W notacji macierzowej kwaternionowi odpowiada macierz .
Mając pojęcie odwrotności, można określić dzielenie kwaternionów, a właściwie dwa dzielenia: i = . Uwaga: przypominam, że na ogół (równość zachodzi wtedy, gdy części wektorowe obu kwaternionów są liniowo zależne). Dlatego nie będziemy pisać kwaternionowych wyrażeń z kreską ułamkową, chyba że mianownik jest liczbą rzeczywistą (albo kwaternionem niemym).
Ostatnie dwa pojęcia, których będziemy potrzebować, to kwaternion czysty, którego część skalarna jest równa i kwaternion jednostkowy (nie mylić z jedynką), którego wartość bezwzględna jest równa . Ponieważ wartość bezwzględna iloczynu kwaternionów jest iloczynem ich wartości bezwzględnych, zbiór kwaternionów jednostkowych jest zamknięty ze względu na mnożenie. Co więcej, odwrotnością kwaternionu jednostkowego jest jego kwaternion sprzężony. Kwaternionom jednostkowym odpowiadają macierze ortogonalne .
Z punktu widzenia algebry zbiór kwaternionów z opisanymi wyżej działaniami
jest ciałem nieprzemiennym\QH. Tradycyjnie oznacza się je symbolem ,
dla uczczenia Williama R. Hamiltona, który 16 października 1843 r odkrył
je w Dublinie4Hamilton wymyślił wtedy sposób mnożenia czwórek liczb rzeczywistych,
który spełnia wszystkie z wyjątkiem przemienności warunki potrzebne do
otrzymania ciała (ze ,,zwykłym” działaniem dodawania). Kwintesencją tego
mnożenia jest wzór
w którym są użyte symbole ,
, i ..
Obroty w przestrzeni są reprezentowane przez kwaterniony jednostkowe5Dla porządku odnotujmy, że dowolny obrót w może być reprezentowany za pomocą dwóch kwaternionów jednostkowych, choć w grafice to ma niewielkie znaczenie.. Weźmy dowolny wektor jednostkowy i liczbę . Obrotowi o kąt wokół prostej o kierunku przyporządkujemy kwaternion . Jest on oczywiście jednostkowy. Wektorowi przyporządkujemy kwaternion czysty . Udowodnimy, że
gdzie jest kwaternionem czystym, , takim że wektor jest obrazem wektora w rozpatrywanym obrocie.
Oznaczmy i . Liczymy
Część skalarna iloczynu jest zgodnie z zapowiedzią równa , część wektorową, , trzeba jeszcze obliczyć. Zauważmy, że ; stąd mamy
Ponadto (rysunek 4.9), oraz . Na podstawie wzorów , otrzymujemy
czyli wcześniej wyprowadzony wzór opisujący obraz wektora w zadanym obrocie, co kończy dowód.
Zauważmy, że reprezentacja kwaternionowa obrotu nie jest jednoznaczna: kwaternion reprezentuje ten sam obrót co . Mamy bowiem
czyli reprezentację obrotu o kąt w drugą stronę, tj. wokół osi zorientowanej odwrotnie. Ponadto, jedynka kwaternionowa reprezentuje przekształcenie tożsamościowe, czyli obrót o kąt wokół osi, której kierunek nie jest (i nie musi być) określony.
Bezpośrednie obliczanie iloczynu trzech kwaternionów nie jest zbyt tanie; trzeba wykonać przy tym mnożeń liczb rzeczywistych, podczas gdy licząc na podstawie wzoru, do którego rzecz doprowadziliśmy, wykonamy tylko mnożeń. Dysponując kwaternionami, mamy jednak możliwość stosunkowo łatwego dokonania interpolacji położeń kątowych bryły w ruchu kulistym, zadanych w wybranych chwilach. W tym celu trzeba skonstruować krzywą położoną na sferze jednostkowej w . Krzywa ta przechodzi przez podane punkty (odpowiadające kolejno zadanym położeniom kątowym bryły w ruchu kulistym) i określa jednoznacznie położenia bryły w innych chwilach. Konstruowanie skomplikowanych krzywych, których punkty są kwaternionami jednostkowymi, zostawimy na później, a tymczasem skonstruujemy najkrótszą krzywą o zadanych końcach.
Przypuśćmy, że dwa kwaterniony, i , reprezentują pewne obroty, które wyznaczają położenia kątowe dowolnego obiektu w chwilach i . Chcielibyśmy interpolować te obroty, tj. dla dowolnego znaleźć obrót (czyli odpowiedni kwaternion jednostkowy ), który wyznacza położenie ,,pośrednie” obiektu.
Jedno z możliwych podejść polega na użyciu operacji potęgowania kwaternionów. Możemy zauważyć, że dla dowolnej liczby całkowitej i kwaternionu zachodzi równość
Możemy rozszerzyć potęgowanie tak, aby dopuścić dowolny wykładnik rzeczywisty ; dla kwaternionu jednostkowego mamy zatem
Obrót odpowiadający chwili moglibyśmy określić przy użyciu jednego z kwaternionów określonych wzorami albo , do których należałoby podstawić odpowiednie potęgi kwaternionów i określone wyżej. W obu przypadkach dla otrzymamy kwaternion , a dla kwaternion . Dla brak przemienności mnożenia kwaternionów daje różne wyniki, dlatego oba podane tu wzory nie są poprawne. Poprawny wzór wyprowadzimy za chwilę.
Poprawny sposób polega na dokonaniu interpolacji łukowej kwaternionów. Kwaterniony jednostkowe i , takie że i jednoznacznie określają najkrótszy łuk na sferze jednostkowej, którego te kwaterniony są końcami. Dla chwili przyjmiemy obrót reprezentowany przez kwaternion , który dzieli ten łuk w proporcji . Na rysunku 4.10 jest pokazany przekrój przez sferę jednostkową w płaszczyzną zawierającą kwaterniony i ; przekrój ten jest oczywiście okręgiem jednostkowym. Kąt między kwaternionami i możemy znaleźć, traktując te kwaterniony jak wektory w i obliczając ich iloczyn skalarny; jest on równy . Kąt między kwaternionami i jest rówmy . Niech oznacza leżący na rozważanym okręgu kwaternion prostopadły do . Wtedy mamy
Wyznaczając na podstawie pierwszego równania i wstawiając do drugiego, po uporządkowaniu otrzymamy wzór
Stosowanie tego wzoru wymaga użycia funkcji trygonometrycznych, ale w szczególnym przypadku mamy
dzięki czemu łuk łączący kwaterniony i możemy dzielić rekurencyjnie na połowy, ćwiartki itd. za pomocą dodawań, mnożeń i pierwiastka kwadratowego.
Chcąc interpolować położenia kątowe obiektu, reprezentowane przez kwaterniony i , możemy dzielić w odpowiednich proporcjach łuk o końcach i lub łuk o końcach i . Zwykle wybieramy łuk krótszy, tj. jeśli kosinus kąta między i jest ujemny, to wybieramy drugi z tych dwóch łuków (ruch określony przez dłuższy łuk jest obracaniem w drugą stronę, trzeba wtedy obrócić obiekt o kąt większy niż ).
Interpretację interpolacji łukowej, a także poprawny zapis tej interpolacji przy użyciu potęgowania, otrzymamy, rozpatrując przyporządkowane kwaternionom macierze. Jak wiemy, macierz , odpowiadająca dowolnemu kwaternionowi jednostkowemu , jest ortogonalna. Macierz ta reprezentuje pewien obrót przestrzeni czterowymiarowej. Łuk, którego końcami są kwaterniony i , obrócimy tak, aby przekształcić na jedynkę kwaternionową. Obrazem punktu na tym łuku jest kwaternion , a w szczególności koniec przejdzie na . Zauważmy, że . Stąd otrzymujemy
Stosując interpolację łukową, np. w animacji, otrzymamy ciąg położeń kątowych przedmiotu, który obraca się (ze stałą prędkością, jeśli parametr zmieniamy ze stałą prędkością) wokół ustalonej osi w przestrzeni.
Interpolacja łukowa może być wykorzystana do skonstruowania gładkiej krzywej interpolacyjnej położonej na sferze jednostkowej w (czyli złożonej z kwaternionów jednostkowych), przechodzącej przez punkty dane na sferze. Konstrukcja tych krzywych przypomina określenie krzywych Béziera, o których będzie mowa dalej — interpolacja afiniczna używana w algorytmie de Casteljau zostaje zastąpiona przez interpolację łukową.
Reprezentacja obrotów przy użyciu kwaternionów ma pewną cechę, która może być wadą albo zaletą, zależnie od sytuacji. Otóż ruch, którego opis skonstruujemy w obróconym układzie współrzędnych, jest identyczny jak w układzie wyjściowym. Metoda ta nie bierze pod uwagę czegoś takiego jak kierunek ,,pionowy”, przez co otrzymany ruch może być nienaturalny w danym zastosowaniu.
Treść automatycznie generowana z plików źródłowych LaTeXa za pomocą oprogramowania wykorzystującego LaTeXML.
strona główna | webmaster | o portalu | pomoc
© Wydział Matematyki, Informatyki i Mechaniki UW, 2009-2010. Niniejsze materiały są udostępnione bezpłatnie na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 3.0 Polska.
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego.
Projekt współfinansowany przez Ministerstwo Nauki i Szkolnictwa Wyższego i przez Uniwersytet Warszawski.