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 ![]() |
||||
![]() |
![]() |
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.