Notice: Undefined index: mode in /home/misc/mst/public_html/common.php on line 63 Notice: Undefined index: mode in /home/misc/mst/public_html/common.php on line 65 Notice: Undefined index: mode in /home/misc/mst/public_html/common.php on line 67 Notice: Undefined index: mode in /home/misc/mst/public_html/common.php on line 69 Notice: Undefined variable: base in /home/misc/mst/public_html/lecture.php on line 36 Grafika komputerowa I – 4. Elementy geometrii afinicznej – MIM UW

Zagadnienia

4. Elementy geometrii afinicznej

4.1. Przestrzenie afiniczne i euklidesowe

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.

4.1.1. Określenie przestrzeni afinicznej

Aksjomatyczne określenie przestrzeni afinicznej jest następujące: jeśli mamy pewien zbiór E i przestrzeń liniową V, oraz działanie odejmowania punktów, które parze punktów \bm{p} i \bm{q}\in E przyporządkowuje pewien wektor \bm{v}=\bm{p}-\bm{q}\in V, takie że

  • dla każdego \bm{q}\in E i \bm{v}\in V istnieje dokładnie jeden punkt \bm{p}\in E spełniający równanie \bm{v}=\bm{p}-\bm{q}, oraz

  • dla dowolnych punktów \bm{p},\bm{q},\bm{r}\in E zachodzi tak zwana równość trójkąta: \bm{r}-\bm{p}=(\bm{r}-\bm{q})+(\bm{q}-\bm{p}),

to zbiór E nazywa się przestrzenią afiniczną, a przestrzeń V jej przestrzenią wektorów swobodnych. Wymiar przestrzeni afinicznej jest równy wymiarowi przestrzeni V. Związki między punktami przestrzeni E i wektorami swobodnymi są takie:

\displaystyle\bm{v}\:=\:\bm{p}-\bm{q}\in V — różnica punktów jest wektorem,
\displaystyle\bm{p}\:=\:\bm{q}+\bm{v}\in E — 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 \mathbb{R} 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).

4.1.2. Iloczyn skalarny

W przestrzeni wektorów swobodnych V możemy określić iloczyn skalarny, czyli funkcję \langle{\cdot},{\cdot}\rangle\colon V\times V\rightarrow\mathbb{R}, która jest symetryczna,

\displaystyle\forall _{{\bm{x},\bm{y}\in V}}\langle{\bm{x}},{\bm{y}}\rangle=\langle{\bm{y}},{\bm{x}}\rangle,

liniowa ze względu na pierwszy (a ze względu na symetrię także drugi) argument,

\displaystyle\forall _{{\bm{x},\bm{y},\bm{z}\in V,\, a,b\in\mathbb{R}}}\langle{a\bm{x}+b\bm{y}},{\bm{z}}\rangle\:=\: a\langle{\bm{x}},{\bm{z}}\rangle+b\langle{\bm{y}},{\bm{z}}\rangle,

i dodatnio określona,

\displaystyle\forall _{{\bm{x}\in V,\,\bm{x}\neq\bm{0}}}\langle{\bm{x}},{\bm{x}}\rangle>0.

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

\displaystyle\rho(\bm{p},\bm{q})\:=\:\sqrt{\langle{\bm{p}-\bm{q}},{\bm{p}-\bm{q}}\rangle},

a także kąty między prostymi, np. jeśli prosta \ell _{1} przechodzi przez dwa różne punkty \bm{p} i \bm{q}, a \ell _{2} przez \bm{s} i \bm{t}, to kąt \alpha między tymi prostymi spełnia równość

\displaystyle\cos\alpha\:=\:\Bigl|\frac{\langle{\bm{p}-\bm{q}},{\bm{s}-\bm{t}}\rangle}{\rho(\bm{p},\bm{q})\rho(\bm{s},\bm{t})}\Bigr|.

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ść 1 i są wzajemnie do siebie prostopadłe (co określa się stwierdzeniem tworzą układ ortonormalny).

4.2. Układy współrzędnych

4.2.1. Współrzędne kartezjańskie

Rys. 4.1. Punkty w układach odniesienia układów współrzędnych kartezjańskich.

Ustalmy dowolne punkty \bm{p}_{0},\ldots,\bm{p}_{n} w n-wymiarowej przestrzeni afinicznej E. Jeśli układ wektorów \bm{v}_{1}=\bm{p}_{1}-\bm{p}_{0},\ldots,\bm{v}_{n}=\bm{p}_{n}-\bm{p}_{0} 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 E; dla dowolnego punktu \bm{q}\in E istnieje dokładnie jeden ciąg liczb x_{1},\ldots,x_{n}, taki że

\displaystyle\bm{q}\:=\:\bm{p}_{0}+\sum _{{i=1}}^{n}x_{i}(\bm{p}_{i}-\bm{p}_{0}). (4.1)

Liczby x_{1},\ldots,x_{n} to współrzędne kartezjańskie punktu \bm{q}.

Punkt \bm{p}_{0} jest początkiem układu i razem z wektorami \bm{v}_{1},\ldots,\bm{v}_{n} (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

\displaystyle\langle{\bm{a}},{\bm{b}}\rangle=\bm{a}^{T}\bm{b},

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 1, wzajemnie do siebie prostopadłych — wektory układu odniesienia stanowią bazę ortonormalną przestrzeni \mathbb{R}^{3}. 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ą.

Rys. 4.2. Określenie układu prawoskrętnego.

4.2.2. Współrzędne barycentryczne

Równość (4.1) można zapisać w bardziej symetrycznej postaci,

\displaystyle\bm{q}\:=\:\sum _{{i=0}}^{n}b_{i}\bm{p}_{i},

w której b_{0}=1-\sum _{{i=0}}^{n}x_{i} oraz b_{i}=x_{i} dla i=1,\ldots,n. Liczby b_{i} nazywają się współrzędnymi barycentrycznymi punktu \bm{q} w układzie odniesienia \bm{p}_{0},\ldots,\bm{p}_{n}.

Rys. 4.3. Znaki współrzędnych barycentrycznych na płaszczyźnie.

Fizyczna interpretacja współrzędnych barycentrycznych jest następująca: niech b_{i} oznacza masę odważnika umieszczonego w punkcie \bm{p}_{i}. Poszczególne odważniki mogą mieć masy dodatnie, ujemne, a także równe 0, ale zakładamy, że ich suma jest równa 1. Wtedy punkt \bm{q}, którego współrzędnymi barycentrycznymi w układzie odniesienia \bm{p}_{0},\ldots,\bm{p}_{n} są liczby b_{i}, jest środkiem ciężkości układu punktów \bm{p}_{i} (stąd i z greki wzięła się nazwa tych współrzędnych). Na płaszczyźnie punkty \bm{p}_{0},\bm{p}_{1},\bm{p}_{2}, 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ą 0, 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 f, 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 f jest wielomianem pierwszego stopnia tych współrzędnych. Należy obliczyć wartość funkcji f w dowolnym punkcie \bm{q} na podstawie wartości tej funkcji w wierzchołkach trójkąta zawierającego punkt \bm{q}.

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).

Rys. 4.4. Wykres funkcji kawałkami pierwszego stopnia.

Załóżmy, że mamy obliczyć wartość funkcji f w (pojedynczym) punkcie \bm{q} (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 f w tych punktach. Aby obliczyć wartość funkcji f(\bm{q}), należy

  1. znaleźć wierzchołki \bm{p}_{i}, \bm{p}_{j}, \bm{p}_{k} trójkąta zawierającego punkt \bm{q},

  2. obliczyć współrzędne barycentryczne b_{i}, b_{j}, b_{k} punktu \bm{q} w układzie odniesienia \bm{p}_{i}, \bm{p}_{j}, \bm{p}_{k}, rozwiązując układ równań liniowych

    \displaystyle\left[\begin{array}[]{ccc}x_{i}&x_{j}&x_{k}\\
y_{i}&y_{j}&y_{k}\\
1&1&1\end{array}\right]\left[\begin{array}[]{c}b_{i}\\
b_{j}\\
b_{k}\end{array}\right]\:=\:\left[\begin{array}[]{c}x_{{\bm{q}}}\\
y_{{\bm{q}}}\\
1\end{array}\right],

    którego współczynnikami są współrzędne kartezjańskie odpowiednich punktów,

  3. obliczyć f(\bm{q})=b_{i}f(\bm{p}_{i})+b_{j}f(\bm{p}_{j})+b_{k}f(\bm{p}_{k}).

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 \bm{q}, którego współrzędne barycentryczne chcemy obliczyć, tworzymy układ równań liniowych

\displaystyle\left[\begin{array}[]{cccc}x_{i}&x_{j}&x_{k}&x_{l}\\
y_{i}&y_{j}&y_{k}&y_{l}\\
z_{i}&z_{j}&z_{k}&z_{l}\\
1&1&1&1\end{array}\right]\left[\begin{array}[]{c}b_{i}\\
b_{j}\\
b_{k}\\
b_{l}\end{array}\right]\:=\:\left[\begin{array}[]{c}x_{{\bm{q}}}\\
y_{{\bm{q}}}\\
z_{{\bm{q}}}\\
1\end{array}\right],

i rozwiązujemy.

4.2.3. Współrzędne jednorodne

Dowolnemu punktowi w n-wymiarowej przestrzeni afinicznej z ustalonym układem współrzędnych kartezjańskich możemy przyporządkować współrzędne jednorodne; jest ich n+1, przy czym ostatnia z tych współrzędnych jest różna od zera. Współrzędne kartezjańskie otrzymamy dzieląc pierwsze n współrzędnych jednorodnych przez ostatnią, np. w przestrzeni trójwymiarowej punkt, którego współrzędnymi jednorodnymi są liczby X, Y, Z, W, ma współrzędne kartezjańskie x=\frac{X}{W}, y=\frac{Y}{W}, z=\frac{Z}{W}. 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ż 0 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.

Rys. 4.5. Model płaszczyzny afinicznej i jej przestrzeni wektorów swobodnych.

Rozważmy przestrzeń współrzędnych jednorodnych \mathbb{R}^{3}. Zbadamy jej związek z dwuwymiarową przestrzenią afiniczną E i jej przestrzenią wektorów swobodnych V. Przestrzeń E możemy utożsamić z warstwą W=1 przestrzeni współrzędnych jednorodnych, a przestrzeń V z warstwą W=0 (która jest podprzestrzenią liniową).

Jeśli W\neq 0, to wektor [X,Y,W]^{T} reprezentuje punkt \big[\frac{X}{W},\frac{Y}{W},1\big]^{T}. Wszystkie takie wektory reprezentują pewne punkty przestrzeni E, natomiast pozostałe reprezentują kierunki wektorów w przestrzeni wektorów swobodnych V. Jeśli uznamy, że nie interesują nas różnice między punktami przestrzeni E i kierunkami wektorów w V (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 [0,0,1]^{T}[-2,0,-2]^{T}. Jeśli obliczymy macierz \frac{1}{2}([0,0,1]^{T}+[-2,0,-2]^{T})=[-1,0,-\frac{1}{2}]^{T}, to otrzymamy punkt który nie leży nawet na naszym odcinku (współrzędne kartezjańskie końców tego odcinka to [0,0]^{T} i [1,0]^{T}, a otrzymana macierz reprezentuje punkt [2,0]^{T}). 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.

Rys. 4.6. Barycentryczne współrzędne jednorodne.

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 1. Podanie dla ustalonego układu współrzędnych barycentrycznych ciągu dowolnych n+1 liczb m_{0},\ldots,m_{n}, których suma jest różna od 0, 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 0, to określają one pewien kierunek wektorów swobodnych, czyli punkt niewłaściwy.

4.3. Przekształcenia afiniczne

4.3.1. Definicja i własności

Przekształcenie f\colon E\rightarrow E jest afiniczne, jeśli dla każdego układu punktów \bm{p}_{0},\ldots,\bm{p}_{m} i liczb b_{0},\ldots,b_{m}, takich że \sum _{{i=0}}^{m}b_{i}=1 jest spełniony warunek

\displaystyle f\Bigl(\sum _{{i=0}}^{m}b_{i}\bm{p}_{i}\Bigr)\:=\:\sum _{{i=0}}^{m}b_{i}f(\bm{p}_{i}).

To oznacza w szczególności, że obrazem dowolnej prostej jest prosta (prosta to zbiór \{\,\bm{q}\colon\bm{q}=t\bm{p}_{0}+(1-t)\bm{p}_{1},t\in\mathbb{R}\,\} dla ustalonych punktów \bm{p}_{0}\neq\bm{p}_{1}), albo punkt. Obrazem prostych równoległych są punkty albo proste równoległe (bo jeśli proste \ell _{1}=\{\,\bm{q}\colon\bm{q}=t\bm{p}_{0}+(1-t)\bm{p}_{1},t\in\mathbb{R}\,\}\ell _{2}=\{\,\bm{q}\colon\bm{q}=t\bm{p}_{2}+(1-t)\bm{p}_{3},t\in\mathbb{R}\,\} są równoległe, czyli wektory \bm{p}_{1}-\bm{p}_{0} i \bm{p}_{3}-\bm{p}_{2} są liniowo zależne, to łatwo jest sprawdzić, że ich obrazy w przekształceniu f 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

\displaystyle f(\bm{p})=A\bm{p}+\bm{t},

w której macierz A reprezentuje część liniową przekształcenia f, a wektor \bm{t}przesunięcie.

Przekształcenie jest różnowartościowe wtedy gdy macierz A jest nieosobliwa. Macierz ta opisuje związane z przekształceniem f przekształcenie liniowe przestrzeni wektorów swobodnych:

\displaystyle f(\bm{p})-f(\bm{q})=(A\bm{p}+\bm{t})-(A\bm{q}+\bm{t})=A(\bm{p}-\bm{q}).

Złożenie przekształceń afinicznych jest przekształceniem afinicznym. Odwrotność (jeśli istnieje) też.

4.3.2. Jednorodna reprezentacja przekształceń afinicznych

Często trzeba wyznaczyć złożenie przekształceń afinicznych; możemy je opisać wzorem

\displaystyle f_{2}(f_{1}(\bm{p}))\:=\: A_{2}(A_{1}\bm{p}+\bm{t}_{1})+\bm{t}_{2}\:=\:(A_{2}A_{1})\bm{p}+(A_{2}\bm{t}_{1}+\bm{t}_{2}),

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 x, y, z punktu \bm{p} dopiszemy 1, to możemy napisać

\displaystyle\left[\begin{array}[]{c}x^{{\prime}}\\
y^{{\prime}}\\
z^{{\prime}}\\
\hline 1\end{array}\right]=\left[\begin{array}[]{ccc|c}&&&\\
&A&&\bm{t}\\
&&&\\
\hline 0&0&0&1\end{array}\right]\left[\begin{array}[]{c}x\\
y\\
z\\
\hline 1\end{array}\right].

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 A i \bm{t} są blokami macierzy jednorodnej przekształcenia f (to jest jeden z dwóch głównych powodów, dla których działania na macierzach 4\times 44\times 1 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ć 0 i dalej przekształcenie wektora za pomocą mnożenia macierzy jest wykonywane poprawnie (otrzymujemy wynik działania części liniowej przekształcenia f na wektor).

4.3.3. Przekształcanie wektora normalnego

Rozważmy płaszczyznę w przestrzeni trójwymiarowej,

\displaystyle\pi\:=\:\{\,\bm{x}\colon\langle{\bm{x}-\bm{p}},{\bm{n}}\rangle=0\,\},

daną za pomocą punktu \bm{p} i wektora normalnego \bm{n}. Załóżmy, że iloczyn skalarny jest dany wzorem \langle{\bm{x}},{\bm{y}}\rangle=\bm{y}^{T}\bm{x}, a zatem równanie płaszczyzny \pi (które jest spełnione przez wszystkie punkty \bm{x} tej płaszczyzny i przez żadne inne) ma postać

\displaystyle\bm{n}^{T}(\bm{x}-\bm{p})\:=\: 0.

Niech f oznacza różnowartościowe przekształcenie afiniczne, którego część liniowa jest reprezentowana przez macierz A. Obraz płaszczyzny \pi w przekształceniu f jest płaszczyzną zawierającą punkt f(\bm{p}), który łatwo jest znaleźć, a jej wektor normalny też jest łatwy do znalezienia. Możemy mianowicie napisać

\displaystyle 0\:=\:\bm{n}^{T}A^{{-1}}A(\bm{x}-\bm{p})\:=\:\bm{n}^{T}A^{{-1}}(f(\bm{x})-f(\bm{p})),

skąd wynika, że tym wektorem jest (A^{{-1}})^{T}\bm{n} (zamiast (A^{{-1}})^{T} możemy w skrócie pisać A^{{-T}}). Warto o tym pamiętać z uwagi na rolę, jaką spełnia wektor normalny we wszystkich modelach oświetlenia powierzchni.

4.3.4. Zmiana układu współrzędnych

Przypuśćmy, że punkt \bm{r} ma w układzie współrzędnych określonym przez układ odniesienia (\bm{q}_{0};\bm{w}_{1},\bm{w}_{2},\bm{w}_{3}) współrzędne jednorodne [x,y,z,1]^{T}, a z kolei punkt \bm{q}_{0}=[x_{{\bm{q}}},y_{{\bm{q}}},z_{{\bm{q}}},1]^{T} i wektory \bm{w}_{i}=[x_{i},y_{i},z_{i},0]^{T} znamy mając ich współrzędne jednorodne w układzie (\bm{p}_{0};\bm{v}_{1},\bm{v}_{2},\bm{v}_{3}). Wtedy współrzędne punktu \bm{r} w tym drugim układzie spełniają równość

\displaystyle\left[\begin{array}[]{c}x^{{\prime}}\\
y^{{\prime}}\\
z^{{\prime}}\\
1\end{array}\right]=\left[\begin{array}[]{cccc}x_{1}&x_{2}&x_{3}&x_{{\bm{q}}}\\
y_{1}&y_{2}&y_{3}&y_{{\bm{q}}}\\
z_{1}&z_{2}&z_{3}&z_{{\bm{q}}}\\
0&0&0&1\end{array}\right]\left[\begin{array}[]{c}x\\
y\\
z\\
1\end{array}\right].
Rys. 4.7. Zmiana układu współrzędnych.
Rys. 4.8. Dualne interpretacje przesunięcia: przekształcenie punktu i zmiana układu współrzędnych.

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 R opisuje (we współrzędych jednorodnych) obrót wokół prostej \ell przechodzącej przez początek układu. Niech T oznacza macierz przesunięcia, która początek \bm{p}_{0} wyjściowego układu przekształca na punkt \bm{q}_{0}. Aby znaleźć obraz punktu \bm{x} w obrocie o ten sam kąt wokół prostej równoległej do \ell i przechodzącej przez punkt \bm{q}_{0}, należy kolejno

  1. obliczyć współrzędne punktu \bm{x} w układzie przesuniętym (którego początkiem jest punkt \bm{q}_{0}; macierz zmiany układu jest równa T^{{-1}},

  2. dokonać obrotu,

  3. obliczyć współrzędne obrazu w wyjściowym układzie; odpowiednią macierzą jest macierz T.

Zatem poszukiwana macierz jest równa iloczynowi TRT^{{-1}}. Podobne wyrażenia opisują wszelkie przekształcenia określone w innym układzie niż układ wyjściowy.

4.3.5. Szczególne przypadki przekształceń afinicznych

Przesunięcia

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.

Skalowania

Skalowanie to przekształcenie, którego część liniowa jest w pewnym układzie reprezentowana przez macierz diagonalną. Podobnie jak przesunięcie o wektor \bm{t} można interpretować jako przesunięcie układu odniesienia o -\bm{t}, zaś obrót o kąt \varphi jako obrót układu o kąt -\varphi, skalowanie ze współczynnikami s_{x}, s_{y}, s_{z} (na diagonali macierzy) może być traktowane jak przejście do układu z jednostami osi różniącymi się od dotychczasowych o czynniki 1/s_{x}, 1/s_{y}1/s_{z}.

Skalowanie oczywiście nie jest różnowartościowe, jeśli któryś ze współczynników, s_{x}, s_{y} lub s_{z} jest równy 0; w przeciwnym razie istnieje przekształcenie odwrotne, które jest skalowaniem ze współczynnikami 1/s_{x}, 1/s_{y}1/s_{z}.

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 0 albo 1, to mamy do czynienia z rzutem. Jeśli natomiast s_{x},s_{y},s_{z}\in\{-1,1\}, to mamy odbicie symetryczne. W przestrzeni trójwymiarowej mamy takie możliwości rzutów i odbić (zakładamy we wzorach, że \|\bm{v}\| _{2}=1)

  • \bm{p}^{{\prime}}=\bm{0} — rzut na początek układu.

  • \bm{p}^{{\prime}}=\bm{v}\langle{\bm{v}},{\bm{p}}\rangle — rzut na prostą o kierunku wektora \bm{v}.

  • \bm{p}^{{\prime}}=\bm{p}-\bm{v}\langle{\bm{v}},{\bm{p}}\rangle — rzut na płaszczyznę prostopadłą do \bm{v}.

  • \bm{p}^{{\prime}}=\bm{p} — rzut na całą przestrzeń, a także odbicie względem całej przestrzeni (czyli przekształcenie tożsamościowe).

  • \bm{p}^{{\prime}}=\bm{p}-2\bm{v}\langle{\bm{v}},{\bm{p}}\rangle — odbicie względem płaszczyzny prostopadłej do \bm{v}.

  • \bm{p}^{{\prime}}=2\bm{v}\langle{\bm{v}},{\bm{p}}\rangle-\bm{p} — odbicie względem prostej o kierunku \bm{v}.

  • \bm{p}^{{\prime}}=-\bm{p} — 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 \bm{v}\neq\bm{0} i płaszczyzny zwanej rzutnią, nie zawierającej tego wektora. Aby dokonać rzutowania, należy

  1. wybrać dowolny punkt \bm{p}_{0} rzutni oraz dwa liniowo niezależne wektory \bm{w}_{1} i \bm{w}_{2} równoległe do rzutni,

  2. przejść do układu współrzędnych o początku \bm{p}_{0} i wersorach osi \bm{v}, \bm{w}_{1} i \bm{w}_{2},

  3. dokonać rzutowania; macierz rzutu w tym układzie ma na diagonali współczynniki 0, 1, 1,

  4. wrócić do układu wyjściowego — wcześniej były opisane wszystkie potrzebne szczegóły.

Obroty

Obroty w płaszczyźnie \mathbb{E}^{2} są jednoznacznie określone przez środek obrotu i kąt. Macierz części liniowej obrotu ma postać

\displaystyle\left[\begin{array}[]{cc}c&-s\\
s&c\end{array}\right],

gdzie c=\cos\varphi, s=\sin\varphi.

Macierz części liniowej obrotu jest ortogonalna, o wyznaczniku równym 1. 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 x, y, z, czyli obroty w płaszczyznach odpowiednio yz, zxxy, są opisane przez macierze, których części liniowe są następujące:

\displaystyle\left[\begin{array}[]{ccc}1&0&0\\
0&c&-s\\
0&s&c\end{array}\right],\qquad\left[\begin{array}[]{ccc}c&0&s\\
0&1&0\\
-s&0&c\end{array}\right],\qquad\left[\begin{array}[]{ccc}c&-s&0\\
s&c&0\\
0&0&1\end{array}\right].

Obrót wokół osi o kierunku dowolnego wektora \bm{v} 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. z 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.

Rys. 4.9. Obrót wokół osi o kierunku wektora \bm{v}.

Niech \|\bm{v}\| _{2}=1. Poddawany przekształceniu wektor \bm{p} możemy rozłożyć na dwa, wzajemnie prostopadłe składniki: \bm{v}\langle{\bm{v}},{\bm{p}}\rangle — obraz \bm{p} w rzucie prostopadłym na kierunek wektora \bm{v} i \bm{a}=\bm{p}-\bm{v}\langle{\bm{v}},{\bm{p}}\rangle — obraz \bm{p} w rzucie na płaszczyznę obrotu (prostopadłą do \bm{v}). Oznaczmy \bm{b}=\bm{v}\wedge\bm{a}=\bm{v}\wedge\bm{p}. Obraz \bm{p}^{{\prime}} punktu \bm{p}, obróconego w płaszczyźnie prostopadłej do \bm{v} o kąt \varphi, jest równy

\displaystyle\bm{q}=\bm{v}\langle{\bm{v}},{\bm{p}}\rangle+\bm{a}\cos\varphi+\bm{b}\sin\varphi.

Macierz obrotu jest sumą trzech macierzy opisujących przekształcenia liniowe, dzięki którym otrzymaliśmy powyższe składniki. Zatem,

\displaystyle\bm{v}\langle{\bm{v}},{\bm{p}}\rangle=(\bm{v}\bm{v}^{T})\bm{p},
\displaystyle\bm{a}=\bm{p}-\bm{v}\langle{\bm{v}},{\bm{p}}\rangle=(I_{3}-\bm{v}\bm{v}^{T})\bm{p},
\displaystyle\bm{b}=\bm{v}\wedge\bm{p}=(\bm{v}\wedge I_{3})\bm{p}.

Kolumny macierzy \bm{v}\wedge I_{3} są iloczynami wektorowymi wektora \bm{v} i odpowiednich kolumn macierzy jednostkowej 3\times 3. Stąd macierz obrotu jest równa

\displaystyle\bm{v}\bm{v}^{T}+(I_{3}-\bm{v}\bm{v}^{T})\cos\varphi+\bm{v}\wedge I_{3}\sin\varphi.

Złożenie dwóch obrotów w przestrzeni trójwymiarowej jest obrotem; mając dane wektory jednostkowe \bm{v}_{1}\bm{v}_{2} osi obrotu i kąty \varphi _{1}\varphi _{2} tych obrotów możemy znaleźć oś i kąt obrotu, który jest złożeniem tych dwóch. Wektor \bm{v} wyznaczający kierunek osi i kąt \varphi tego obrotu spełniają równości

\displaystyle\cos\frac{\phi}{2} \displaystyle{}\:=\:\cos\frac{\phi _{1}}{2}\cos\frac{\phi _{2}}{2}-\langle{\bm{v}_{1}},{\bm{v}_{2}}\rangle\sin\frac{\phi _{1}}{2}\sin\frac{\phi _{2}}{2},
\displaystyle\sin\frac{\phi}{2} \displaystyle{}\:=\:\|\bm{w}\| _{2},
\displaystyle\bm{v} \displaystyle{}\:=\:\frac{\bm{w}}{\|\bm{w}\| _{2}},
w których występuje wektor \bm{w} określony wzorem
\displaystyle\bm{w} \displaystyle{}\:=\:\bm{v}_{2}\sin\frac{\phi _{2}}{2}\cos\frac{\phi _{1}}{2}+\bm{v}_{1}\sin\frac{\phi _{1}}{2}\cos\frac{\phi _{2}}{2}+\bm{v}_{2}\wedge\bm{v}_{1}\sin\frac{\phi _{1}}{2}\sin\frac{\phi _{2}}{2}.

Wyprowadzenie powyższych wzorów jest łatwe przy użyciu kwaternionów, o których będzie mowa dalej.

Konstrukcja obrotu do ustalonego położenia

Podczas modelowania sceny trójwymiarowej możemy napotkać następujący problem: mamy dane trzy punkty niewspółliniowe, \bm{p}_{0}, \bm{p}_{1}\bm{p}_{2}, 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 \bm{q}_{1}, \bm{q}_{2}\bm{q}_{3}, też niewspółliniowych. Chcemy, aby dla skonstruowanego obrotu, reprezentowanego przez macierz R,

  • obraz wektora \bm{w}_{1}=\bm{p}_{1}-\bm{p}_{0} był równoległy do wektora \bm{v}_{1}=\bm{q}_{1}-\bm{q}_{0} i miał ten sam zwrot,

  • obraz wektora \bm{w}_{2}=\bm{p}_{2}-\bm{p}_{0} był kombinacją liniową wektorów \bm{v}_{1} i \bm{v}_{2}=\bm{q}_{2}-\bm{q}_{1}, a ponadto ma być \langle{R\bm{w}_{2}},{\bm{v}_{2}}\rangle>0.

Macierz R przekształcenia, które jest obrotem, musi być ortogonalna i jej wyznacznik musi być równy 1. Rozwiązanie tak postawionego zadania jest jednoznaczne.

Niech \bm{w}_{3}=\bm{w}_{1}\wedge\bm{w}_{2}. Rozważmy macierz A=[\bm{w}_{1},\bm{w}_{2},\bm{w}_{3}]. Wyznacznik tej macierzy jest dodatni. Macierz ta opisuje przejście od układu współrzędnych o układzie odniesienia \bm{w}_{1},\bm{w}_{2},\bm{w}_{3} do układu współrzędnych, którego wersorami osi są wektory \bm{e}_{1}=[1,0,0]^{T}, \bm{e}_{2}=[0,1,0]^{T}\bm{e}_{3}=[0,0,1]^{T}. Istnieją (jednoznacznie określone) macierze Q_{A}R_{A}, takie że A=Q_{A}R_{A}, macierz Q_{A} jest ortogonalna (tj. Q_{A}^{T}=Q_{A}^{{-1}}) i \det Q_{A}=1, a macierz R_{A} jest trójkątna górna i współczynniki na jej diagonali są dodatnie (mamy \det R_{A}=\det A; wyznacznik ten jest równy iloczynowi współczynników diagonalnych macierzy R_{A}).

Możemy zauważyć, że kolumna \bm{q}_{{A1}} macierzy Q_{A} ma kierunek i zwrot wektora \bm{w}_{1}, zaś kolumna \bm{q}_{{A2}} tej macierzy leży w przestrzeni rozpiętej przez \bm{w}_{1} i \bm{w}_{2}, a ponadto \langle{\bm{q}_{{A2}}},{\bm{w}_{2}}\rangle>0.

Macierz Q_{A} jest więc macierzą obrotu, który przekształca wersory \bm{e}_{1}, \bm{e}_{2} i \bm{e}_{3} na \bm{q}_{{A1}}, \bm{q}_{{A2}}\bm{q}_{{A3}}; macierz Q_{A}^{{-1}}=Q_{A}^{T} dokonuje przekształcenia odwrotnego. Obraz wektora \bm{w}_{1} w tym przekształceniu ma kierunek i zwrot wektora \bm{e}_{1}, zaś obraz wektora \bm{w}_{2} leży w płaszczyźnie rozpiętej przez \bm{e}_{1} i \bm{e}_{2}.

Podobnie możemy postąpić z macierzą B=[\bm{v}_{1},\bm{v}_{2},\bm{v}_{3}]=Q_{B}R_{B}, której ostatnia kolumna \bm{v}_{3}=\bm{v}_{1}\wedge\bm{v}_{2}. Poszukiwana macierz R obrotu, który spełnia postawione warunki, jest równa Q_{B}Q_{A}^{T}. Macierze Q_{A} i Q_{B} możemy obliczyć na różne sposoby, na przykład dokonując ortogonalizacji Grama-Schmidta kolumn macierzy A i B.

Przykład składania przekształceń

Przypuśćmy, że chcemy otrzymać macierz obrotu na płaszczyźnie, o kąt 30^{\circ} wokół punktu [200,100]^{T}. Przekształcenie takie otrzymujemy w następujących krokach:

  1. Zmieniamy układ współrzędnych tak, aby środek obrotu był początkiem układu. Odpowiednia macierz ma postać

    \displaystyle\left[\begin{array}[]{ccc}1&0&-200\\
0&1&-100\\
0&0&1\end{array}\right].
  2. Wykonujemy obrót o 30^{\circ} wokół początku układu. Macierz obrotu ma postać

    \displaystyle\left[\begin{array}[]{ccc}\sqrt{3}/2&-1/2&0\\
1/2&\sqrt{3}/2&0\\
0&0&1\end{array}\right].
  3. Wracamy do wyjściowego układu, co opisuje macierz

    \displaystyle\left[\begin{array}[]{ccc}1&0&200\\
0&1&100\\
0&0&1\end{array}\right].

Macierz całego przekształcenia jest iloczynem powyższych trzech:

\displaystyle\left[\begin{array}[]{ccc}1&0&200\\
0&1&100\\
0&0&1\end{array}\right]\left[\begin{array}[]{ccc}\sqrt{3}/2&-1/2&0\\
1/2&\sqrt{3}/2&0\\
0&0&1\end{array}\right]\left[\begin{array}[]{ccc}1&0&-200\\
0&1&-100\\
0&0&1\end{array}\right]=
\displaystyle\left[\begin{array}[]{ccc}\sqrt{3}/2&-1/2&250-100\sqrt{3}\\
1/2&\sqrt{3}/2&-50\sqrt{3}\\
0&0&1\end{array}\right].

4.3.6. Składanie przekształceń w zastosowaniach graficznych

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.

Ustawianie obiektu w scenie

Przypuśćmy, że pewien obiekt, O, 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 A. 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 f_{1} reprezentowanym (w postaci jednorodnej) przez macierz A_{1}.

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 f_{2}, którego macierzą jest A_{2}. Jeśli wektor \bm{v} składa się ze współrzędnych jednorodnych w ,,lokalnym” układzie pewnego punktu obiektu O, to wektorem współrzędnych jednorodnych tego punktu w układzie ,,pośrednim” jest wektor A_{1}\bm{p}, zaś w układzie ,,globalnym” wektor A_{2}A_{1}\bm{p}.

Przypuśćmy, że obiekt O 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 A_{2} (i przypisze macierzy przejścia iloczyn). Dalej, procedura P przed wywołaniem O pomnoży tę macierz przez A_{1}. 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.

Wykonywanie kolejnych przekształceń

Druga sytuacja jest typowa dla animacji: pewien obiekt O 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 O w kolejnym położeniu.

Jeśli macierz przekształcenia od położenia p_{{n-1}} do p_{n}, reprezentowanego w ,,globalnym” układzie współrzędnych, oznaczymy A_{n}, to oczywiście macierz, która ,,przestawia” obiekt z położenia p_{0} do p_{n} jest równa A_{n}A_{{n-1}}\ldots A_{2}A_{1}. W tym przypadku macierz każdego kolejnego przekształcenia jest czynnikiem z lewej strony.

Grafika żółwia

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 A_{1} 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 A_{2} 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 A_{1}A_{2}A_{1}^{{-1}}. Jeśli zatem zastosujemy przepis na składanie kolejno wykonywanych przekształceń określonych w układzie ,,globalnym”, to otrzymamy macierz A_{1}A_{2}A_{1}^{{-1}}A_{1}=A_{1}A_{2}. 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.

4.3.7. Rozkładanie przekształceń

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 3\times 3, 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:

\displaystyle A=U\Sigma V^{T},

takich że UV są ortogonalne, a macierz \Sigma 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 3\times 3. Zmieniając odpowiednio znaki wierszy macierzy U i kolumn macierzy V^{T} oraz współczynników diagonalnych macierzy \Sigma, możemy otrzymać macierze UV^{T}, których wyznaczniki są równe 1. Rozważymy jeszcze jeden rozkład, tzw. rozkład biegunowy:

\displaystyle A=QS,

w którym Q=UV^{T} oraz S=V\Sigma V^{T}. Macierz Q jest ortogonalna, a macierz S jest symetryczna. Jeśli macierz A jest nieosobliwa, to rozkład biegunowy możemy łatwo znaleźć za pomocą algorymu Highama. Przyjmujemy Q_{0}=A, a następnie obliczamy kolejne macierze

\displaystyle Q_{k}=\frac{1}{2}\bigl(Q_{{k-1}}+Q_{{k-1}}^{{-T}}\bigr),\qquad k=1,2,\ldots.

Otrzymany ciąg macierzy bardzo szybko zbiega do macierzy Q; w praktyce często wystarczy wykonać kilka iteracji. Macierz S otrzymamy, obliczając iloczyn S=Q^{T}A.

Mając macierz S, możemy znaleźć macierze V\Sigma przez rozwiązanie algebraicznego zagadnienia własnego. Macierz diagonalna \Sigma reprezentuje skalowanie. Macierz S też reprezentuje skalowanie, w kierunkach pewnych trzech prostych wzajemnie prostopadłych; kolumny macierzy V mają te kierunki. Oczywiście, współczynnikami skalowania są wartości własne macierzy S\Sigma. Znając macierz V, możemy obliczyć macierz U=QV.

Macierz ortogonalna 3\times 3 ma wyznacznik równy +1 albo -1. W pierwszym przypadku jest to macierz obrotu; jej wartościami własnymi są liczby zespolone 1, (c,s)(c,-s). Oś obrotu ma kierunek wektora własnego przynależnego do wartości własnej 1. Liczby cs to kosinus i sinus kąta obrotu. Oś obrotu reprezentowanego przez macierz U możemy znaleźć (z dokładnością wystarczającą w grafice), wybierając dwa niezależne liniowo wiersze macierzy U-I_{3} i obliczając ich iloczyn wektorowy.

W drugim przypadku wartościami własnymi (macierzy ortogonalnej 3\times 3) są liczby -1, (c,s)(c,-s). Macierz taka reprezentuje złożenie obrotu z odbiciem symetrycznym względem płaszczyzny prostopadłej do osi obrotu. W obu przypadkach, jeśli s=0, 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 xyz, 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.

4.3.8. Obroty, liczby zespolone i kwaterniony

Liczba zespolona jest parą liczb rzeczywistych: z=(a,b); na zbiorze takich obiektów określa się dodawanie, tak jakby to były wektory w \mathbb{R}^{2}, i mnożenie, wzorem (a_{1},b_{1})(a_{2},b_{2})=(a_{1}a_{2}-b_{1}b_{2},a_{1}b_{2}+b_{1}a_{2}). Liczba zespolona z=(c,s), taka że c^{2}+s^{2}=1 nazywa się jednostkowa; pomnożenie dowolnej liczby zespolonej p przez z daje w wyniku liczbę, której obie części, rzeczywista i urojona, są równe współrzędnym obrazu wektora p w obrocie o kąt \varphi, takim że c=\cos\varphi, s=\sin\varphi.

Liczbie zespolonej z=(a,b) przyporządkowujemy macierz

\displaystyle Z=\left[\begin{array}[]{rr}a&-b\\
b&a\end{array}\right].

Pierwsza jej kolumna to liczba z. Mnożenie i dodawanie liczb zespolonych to działania równoważne dodawaniu i mnożeniu takich macierzy, a w przypadku, gdy liczba z jest jednostkowa, macierz Z jest macierzą obrotu w \mathbb{R}^{2}.

Dość podobną reprezentację obrotów w przestrzeni trójwymiarowej stanowią kwaterniony. Są to wektory w \mathbb{R}^{4}, z odpowiednio określonymi działaniami. Dodawanie i odejmowanie kwaternionów jest dodawaniem i odejmowaniem wektorów w \mathbb{R}^{4}.

Aby określić mnożenie i dzielenie, zamiast macierzy kolumnowej q=[a,x,y,z]^{T}, będziemy używać notacji q=(a,\bm{b}), w której wyróżniamy część skalarną a\in\mathbb{R} (pierwszą współrzędną) i część wektorową \bm{b}=[x,y,z]^{T}\in\mathbb{R}^{3}. Wzór opisujący mnożenie kwaternionów ma postać

\displaystyle(a_{1},\bm{b}_{1})\cdot(a_{2},\bm{b}_{2}) \displaystyle=(a_{1}a_{2}-\langle{\bm{b}_{1}},{\bm{b}_{2}}\rangle,a_{1}\bm{b}_{2}+\bm{b}_{1}a_{2}+\bm{b}_{1}\wedge\bm{b}_{2}).

Jak widać, wzór opisujący iloczyn kwaternionów bardzo przypomina wzór na iloczyn liczb zespolonych; najbardziej widoczna różnica to składnik \bm{b}_{1}\wedge\bm{b}_{2} 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 q=[a,x,y,z]^{T}=(a,\bm{b}) przyporządkujemy macierz

\displaystyle Q=\left[\begin{array}[]{rrrr}a&-x&-y&-z\\
x&a&-z&y\\
y&z&a&-x\\
z&-y&x&a\end{array}\right]=\left[\begin{array}[]{cc}a&-\bm{b}^{T}\\
\bm{b}&aI_{3}+\bm{b}\wedge I_{3}\end{array}\right].

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 q_{1}q_{2} odpowiada suma przyporządkowanych im macierzy, Q_{1}+Q_{2}, a ponadto q_{1}\cdot q_{2}=Q_{1}q_{2}, skąd dalej wynika, że macierz Q_{1}Q_{2} odpowiada iloczynowi kwaternionów q_{1}\cdot q_{2}.

Dalej przyda się kilka określeń: kwaternion sprzężony do q=(a,\bm{b}) to \overline{q}=(a,-\bm{b}); wartość bezwzględna kwaternionu q=(a,\bm{b}) jest liczbą rzeczywistą |q|=\sqrt{a^{2}+\langle{\bm{b}},{\bm{b}}\rangle}. 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 0 to zero, czyli (0,\bm{0}).

Zobaczmy, jak to wygląda w notacji macierzowej. Jeśli kwaternion q jest związany z macierzą Q, to kwaternionowi sprzężonemu \overline{q} odpowiada macierz transponowana Q^{T}. Iloczynowi q\cdot\overline{q} odpowiada macierz QQ^{T}=|q|^{2}I_{4}. Macierz Q jest więc iloczynem pewnej macierzy ortogonalnej i liczby |q|. Zachodzi równość \det Q=|q|^{4} (można pokazać, że wyznacznik macierzy Q jest nieujemny), a z niej (i z twierdzenia Cauchy'ego) wynika, że dla dowolnych kwaternionów q_{1}, q_{2} zachodzi równość |q_{1}\cdot q_{2}|=|q_{1}||q_{2}|.

Kwaternion niemy ma część wektorową równą \bm{0} (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 |q|=\sqrt{q\cdot\overline{q}}.

Jedynka kwaternionowa to kwaternion (1,\bm{0}) (odpowiada jej macierz jednostkowa I_{4}). Jest ona elementem neutralnym mnożenia (i jest to jedyny taki element). Dla skrótu kwaternion zerowy i jedynkę można zapisywać symbolami 0 i 1, pamiętając, że to kwaterniony.

Kwaternion odwrotny do q to q^{{-1}}, taki że q\cdot q^{{-1}}=q^{{-1}}\cdot q=(1,\bm{0}). Odwrotność jest jednoznaczna i wyraża się wzorem q^{{-1}}=\overline{q}/|q|^{2} (przypomina on wzór na odwrotność liczby zespolonej). Każdy kwaternion różny od zera ma odwrotność. W notacji macierzowej kwaternionowi q^{{-1}} odpowiada macierz Q^{{-1}}=\frac{1}{|q|^{2}}Q^{T}.

Mając pojęcie odwrotności, można określić dzielenie kwaternionów, a właściwie dwa dzielenia: q_{1}/q_{2}=q_{1}\cdot q_{2}^{{-1}}q_{2}\backslash q_{1} = q_{2}^{{-1}}\cdot q_{1}. Uwaga: przypominam, że na ogół q_{1}\cdot q_{2}^{{-1}}\neq q_{2}^{{-1}}\cdot q_{1} (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 0kwaternion jednostkowy (nie mylić z jedynką), którego wartość bezwzględna jest równa 1. 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 4\times 4.

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
\displaystyle\bm{i}^{2}=\bm{j}^{2}=\bm{k}^{2}=\bm{i}\cdot\bm{j}\cdot\bm{k}=-1,
w którym są użyte symbole \bm{i}=[0,1,0,0]^{T}, \bm{j}=[0,0,1,0]^{T}, \bm{k}=[0,0,0,1]^{T}-1=[-1,0,0,0]^{T}.
.

Obroty w przestrzeni \mathbb{R}^{3} są reprezentowane przez kwaterniony jednostkowe5Dla porządku odnotujmy, że dowolny obrót w \mathbb{R}^{4} może być reprezentowany za pomocą dwóch kwaternionów jednostkowych, choć w grafice to ma niewielkie znaczenie.. Weźmy dowolny wektor jednostkowy \bm{v}\in\mathbb{R}^{3} i liczbę \varphi. Obrotowi o kąt \varphi wokół prostej o kierunku \bm{v} przyporządkujemy kwaternion q=(\cos\frac{\varphi}{2},\bm{v}\sin\frac{\varphi}{2}). Jest on oczywiście jednostkowy. Wektorowi \bm{p}\in\mathbb{R}^{3} przyporządkujemy kwaternion czysty p=(0,\bm{p}). Udowodnimy, że

\displaystyle q\cdot p\cdot q^{{-1}}=p^{{\prime}},

gdzie p^{{\prime}} jest kwaternionem czystym, p^{{\prime}}=(0,\bm{p}^{{\prime}}), takim że wektor \bm{p}^{{\prime}} jest obrazem wektora \bm{p} w rozpatrywanym obrocie.

Oznaczmy s=\sin\frac{\varphi}{2} i c=\cos\frac{\varphi}{2}. Liczymy

\displaystyle q\cdot \displaystyle p\cdot q^{{-1}}=(c,s\bm{v})\cdot(0,\bm{p})\cdot(c,-s\bm{v})=(-s\langle{\bm{v}},{\bm{p}}\rangle,c\bm{p}+s\bm{v}\wedge\bm{p})\cdot(c,-s\bm{v})=
\displaystyle(-cs\langle{\bm{v}},{\bm{p}}\rangle+cs\langle{\bm{p}},{\bm{v}}\rangle+s\langle{\bm{v}\wedge\bm{p}},{\bm{v}}\rangle,s^{2}\langle{\bm{v}},{\bm{p}}\rangle\bm{v}+c^{2}\bm{p}+cs\bm{v}\wedge\bm{p}-cs\bm{p}\wedge\bm{v}-s^{2}(\bm{v}\wedge\bm{p})\wedge\bm{v})
\displaystyle=(0,\bm{p}^{{\prime}}).

Część skalarna iloczynu jest zgodnie z zapowiedzią równa 0, część wektorową, \bm{p}^{{\prime}}, trzeba jeszcze obliczyć. Zauważmy, że s^{2}=1-c^{2}; stąd mamy

\displaystyle s^{2}\langle{\bm{v}},{\bm{p}}\rangle\bm{v}+c^{2}\bm{p}=\langle{\bm{v}},{\bm{p}}\rangle\bm{v}+c^{2}(\bm{p}-\langle{\bm{v}},{\bm{p}}\rangle\bm{v}).

Ponadto \bm{v}\wedge\bm{p}=\bm{b} (rysunek 4.9), oraz \bm{b}\wedge\bm{v}=\bm{a}=\bm{p}-\langle{\bm{v}},{\bm{p}}\rangle\bm{v}. Na podstawie wzorów 2cs=\sin\varphi, c^{2}-s^{2}=\cos\varphi otrzymujemy

\displaystyle\bm{p}^{{\prime}}=\bm{v}\langle{\bm{v}},{\bm{p}}\rangle+(\bm{p}-\langle{\bm{v}},{\bm{p}}\rangle\bm{v})\cos\varphi+\bm{v}\wedge\bm{p}\sin\varphi,

czyli wcześniej wyprowadzony wzór opisujący obraz wektora \bm{p} w zadanym obrocie, co kończy dowód. \Box

Zauważmy, że reprezentacja kwaternionowa obrotu nie jest jednoznaczna: kwaternion -q reprezentuje ten sam obrót co q. Mamy bowiem

\displaystyle-q=\Bigl(-\cos\frac{\varphi}{2},-\bm{v}\sin\frac{\varphi}{2}\Bigr)=\Bigl(\cos\frac{2\pi-\varphi}{2},-\bm{v}\sin\frac{2\pi-\varphi}{2}\Bigr),

czyli reprezentację obrotu o kąt 2\pi-\varphi w drugą stronę, tj. wokół osi zorientowanej odwrotnie. Ponadto, jedynka kwaternionowa reprezentuje przekształcenie tożsamościowe, czyli obrót o kąt 0 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 28 mnożeń liczb rzeczywistych, podczas gdy licząc na podstawie wzoru, do którego rzecz doprowadziliśmy, wykonamy tylko 16 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 \mathbb{R}^{4}. 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, q_{0}q_{1}, reprezentują pewne obroty, które wyznaczają położenia kątowe dowolnego obiektu w chwilach 01. Chcielibyśmy interpolować te obroty, tj. dla dowolnego t\in[0,1] znaleźć obrót (czyli odpowiedni kwaternion jednostkowy q_{t}), 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 n i kwaternionu q=|q|(\cos\frac{\varphi}{2},\bm{v}\sin\frac{\varphi}{2}) zachodzi równość

\displaystyle q^{n}=|q|^{n}\Bigl(\cos\frac{n\varphi}{2},\bm{v}\sin\frac{n\varphi}{2}\Bigr).

Możemy rozszerzyć potęgowanie tak, aby dopuścić dowolny wykładnik rzeczywisty t; dla kwaternionu jednostkowego q=(\cos\frac{\varphi}{2},\bm{v}\sin\frac{\varphi}{2}) mamy zatem

\displaystyle q^{t}=\Bigl(\cos\frac{t\varphi}{2},\bm{v}\sin\frac{t\varphi}{2}\Bigr).

Obrót odpowiadający chwili t moglibyśmy określić przy użyciu jednego z kwaternionów określonych wzorami q_{t}^{{\prime}}=q_{0}^{{1-t}}\cdot q_{1}^{t} albo q_{t}^{{\prime\prime}}=q_{1}^{t}\cdot q_{0}^{{1-t}}, do których należałoby podstawić odpowiednie potęgi kwaternionów q_{0}q_{1} określone wyżej. W obu przypadkach dla t=0 otrzymamy kwaternion q_{0}, a dla t=1 kwaternion q_{1}. Dla t\notin\{ 0,1\} 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ę.

Rys. 4.10. Interpolacja łukowa kwaternionów jednostkowych.

Poprawny sposób polega na dokonaniu interpolacji łukowej kwaternionów. Kwaterniony jednostkowe q_{0}q_{1}, takie że q_{0}\neq q_{1}q_{0}\neq-q_{1} jednoznacznie określają najkrótszy łuk na sferze jednostkowej, którego te kwaterniony są końcami. Dla chwili t\in[0,1] przyjmiemy obrót reprezentowany przez kwaternion q_{t}, który dzieli ten łuk w proporcji t:1-t. Na rysunku 4.10 jest pokazany przekrój przez sferę jednostkową w \mathbb{R}^{4} płaszczyzną zawierającą kwaterniony q_{0}q_{1}; przekrój ten jest oczywiście okręgiem jednostkowym. Kąt \psi między kwaternionami q_{0}q_{1} możemy znaleźć, traktując te kwaterniony jak wektory w \mathbb{R}^{4} i obliczając ich iloczyn skalarny; jest on równy \cos\psi. Kąt między kwaternionami q_{0}q_{t} jest rówmy t\psi. Niech q_{2} oznacza leżący na rozważanym okręgu kwaternion prostopadły do q_{0}. Wtedy mamy

\displaystyle q_{1} \displaystyle{}=q_{0}\cos\psi+q_{2}\sin\psi,
\displaystyle q_{t} \displaystyle{}=q_{0}\cos t\psi+q_{2}\sin t\psi.

Wyznaczając q_{2} na podstawie pierwszego równania i wstawiając do drugiego, po uporządkowaniu otrzymamy wzór

\displaystyle q_{t}=\frac{q_{0}\sin(1-t)\psi+q_{1}\sin t\psi}{\sin\psi}.

Stosowanie tego wzoru wymaga użycia funkcji trygonometrycznych, ale w szczególnym przypadku mamy

\displaystyle q_{{1/2}}=\frac{q_{0}+q_{1}}{|q_{0}+q_{1}|},

dzięki czemu łuk łączący kwaterniony q_{0}q_{1} 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 q_{0}q_{1}, możemy dzielić w odpowiednich proporcjach łuk o końcach q_{0}q_{1} lub łuk o końcach q_{0}-q_{1}. Zwykle wybieramy łuk krótszy, tj. jeśli kosinus kąta \psi między q_{0}q_{1} 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ż \pi).

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 Q, odpowiadająca dowolnemu kwaternionowi jednostkowemu q, jest ortogonalna. Macierz ta reprezentuje pewien obrót przestrzeni czterowymiarowej. Łuk, którego końcami są kwaterniony q_{0}q_{1}, obrócimy tak, aby przekształcić q_{0} na jedynkę kwaternionową. Obrazem punktu q_{t} na tym łuku jest kwaternion \tilde{q}_{t}=Q_{0}^{{-1}}q_{t}, a w szczególności koniec q_{1} przejdzie na \tilde{q}_{1}=Q_{0}^{{-1}}q_{1}=q_{0}^{{-1}}q_{1}. Zauważmy, że \tilde{q}_{t}=\tilde{q}_{1}^{t}. Stąd otrzymujemy

\displaystyle q_{t}=Q_{0}\tilde{q}_{t}=q_{0}\cdot(q_{0}^{{-1}}\cdot q_{1})^{t}.

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 t 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 \mathbb{R}^{4} (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.

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.