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 – 5. Rzutowanie równoległe, perspektywiczne i inne – MIM UW

Zagadnienia

5. Rzutowanie równoległe, perspektywiczne i inne

5.1. Rzutowanie równoległe

Obrazem dowolnego punktu \bm{p} w rzucie równoległym jest taki punkt \bm{p}^{{\prime}} położony na rzutni, że kierunek wektora \bm{p}-\bm{p}^{{\prime}} (o ile nie jest to wektor zerowy) jest kierunkiem rzutowania.

Rys. 5.1. Rzutowanie równoległe.

Takie rzutowanie równoległe jest powszechnie używane w rysunku technicznym, gdzie jednym z celów jest umożliwienie odtworzenia (restytucji) punktu w przestrzeni na podstawie rysunku. Inna potrzeba, do pewnego czasu dominująca w projektowaniu przemysłowym, to dokonywanie konstrukcji geometrycznych w przestrzeni trójwymiarowej na płaskich rysunkach. Na podstawie tych potrzeb rozwinęła się geometria wykreślna, która obecnie wydaje się być sztuką w zaniku — użycie komputerów zwalnia od wysiłków i coraz częściej przedmiot ten jest wykładany już tylko po to, aby rozwijać wyobraźnię przestrzenną u studentów architektury (tego, niestety, czy na szczęście, komputer nie zastąpi). Istnieją dwa podstawowe podejścia do stosowania rzutowania równoległego w rysunku technicznym: metoda Monge'a6Gaspard Monge, 1746–1818, czyli wykonywanie konstrukcji trójwymiarowych na dwóch obrazach będących rzutami prostopadłymi na dwie, wzajemnie prostopadłe rzutnie, oraz aksonometria.

Rys. 5.2. Rzuty Monge'a.

Podstawowe znaczenie dla aksonometrii ma twierdzenie Pohlkego: dobierając odpowiednio rzutnię i kierunek rzutowania można odwzorować wierzchołki danego czworościanu na figurę podobną do zbioru dowolnych czterech punktów, z których żadne trzy nie leżą na jednej prostej.

Rys. 5.3. Obrazy sześcianu w aksonometrii kawalerskiej, wojskowej i izometrycznej.

Na podstawie tego twierdzenia możemy określić rzut aksonometryczny, wybierając obraz początku układu współrzędnych i trzy wektory (z których żadne dwa nie są liniowo zależne) — obrazy wersorów osi. W ten sposób postąpiliśmy w celu narysowania wykresu funkcji przy użyciu algorytmu z pływającym horyzontem, określając rzut aksonometryczny. Rzuty stosowane najczęściej w rysunku technicznym są pokazane rysunku 5.3

5.2. Rzutowanie perspektywiczne

Obrazem punktu \bm{p} w rzucie perspektywicznym jest punkt \bm{p}^{{\prime}}, który jest przecięciem rzutni i prostej przechodzącej przez \bm{p} i środek rzutowania (czyli punkt położenia obserwatora).

Rzut równoległy można interpretować jako graniczny przypadek rzutu perspektywicznego, gdy obserwator znajduje się w bardzo dużej odległości.

Rys. 5.4. Rzutowanie perspektywiczne.

W rysunkach technicznych części maszyn rzut perspektywiczny bywa używany bardzo rzadko, głównie w rysunkach poglądowych, takich jak schematy montażowe, natomiast często stosuje się go w architekturze. Opracowanie konstrukcji geometrycznych związanych z tym sposobem rzutowania wiąże się z historią malarstwa, którą tu się nie zajmujemy.

Rys. 5.5. Perspektywa jedno-, dwu- i trzypunktowa.

Zależnie od położenia rzutni względem głównego obiektu na obrazie, mówimy  o  perspektywie jednopunktowej, dwupunktowejtrzypunktowej. Z obiektem związane są trzy kierunki osi, jakoś powiązane z obiektem (najbardziej oczywisty związek jest wtedy, gdy obiekt jest prostopadłościanem). Poszczególne przypadki otrzymamy wybierając rzutnię tak, aby jeden, dwa lub trzy spośród tych kierunków nie były równoległe do rzutni.

5.3. Algorytm rzutowania

Przekształcenie rzutowe jest to przekształcenie przestrzeni rzutowej (tj. afinicznej uzupełnionej o punkty niewłaściwe, czyli kierunki), któremu odpowiada różnowartościowe (czyli o nieosobliwej macierzy) przekształcenie liniowe przestrzeni jednorodnej. Macierz reprezentująca przekształcenie afiniczne we współrzędnych jednorodnych ma ostatni wiersz o postaci [0,0,0,1] (lub ogólniej [0,0,0,a] dla dowolnego a\neq 0). Przekształcenia rzutowe otrzymamy dopuszczając dowolne liczby w ostatnim wierszu (pod warunkiem zachowania nieosobliwości macierzy; wymaganie to bierze się stąd, że punkt [0,0,0,0]^{T} przestrzeni współrzędnych jednorodnych, który jest obrazem pewnych niezerowych wektorów jeśli macierz jest osobliwa, nie reprezentuje żadnego punktu przestrzeni rzutowej).

Dowolne przekształcenia rzutowe są nieco rzadziej niż afiniczne stosowane w modelowaniu obiektów, ale przydają się do określenia rzutowania perspektywicznego, a zatem ich implementacja jest zawsze potrzebna w grafice ,,trójwymiarowej” i często realizowana w sprzęcie.

Rzutowanie, tj. odwzorowanie przestrzeni trójwymiarowej na płaszczyznę ekranu, zwykle określa się opisując za pomocą odpowiednich parametrów tzw. wirtualną kamerę, przy czym w różnych pakietach graficznych szczegóły tego postępowania mogą być różne. Wirtualna kamera związana jest z kartezjańskim układem współrzędnych kamery i pierwszy krok rzutowania punktu polega na obliczeniu jego współrzędnych w tym układzie.

Rys. 5.6. Wirtualna kamera i bryła (ostrosłup) widzenia.

Przypuśćmy, że początek układu współrzędnych kamery jest położeniem obserwatora (albo środkiem obiektywu) i że oś z tego układu jest osią optyczną obiektywu. Rzutnia jest płaszczyzną prostopadłą do tej osi, tj. jest równoległa do płaszczyzny xy układu kamery i leży w odległości f od tej płaszczyzny. Wyróżnimy klatkę, czyli prostokąt leżący w rzutni, w którym obraz będzie np. wyświetlony na ekranie (boki klatki są równoległe do osi xy). Kierunek rzutowania lub położenie obserwatora i klatka określają tzw. bryłę widzenia, będącą zbiorem punktów, których rzuty należą do klatki.

Rzutowanie równoległe polega na zignorowaniu współrzędnej z (oś z wyznacza kierunek rzutowania). Obraz punktu [x,y,z]^{T} w rzucie perspektywicznym ma współrzędne fx/z, fy/zf, przy czym tę ostatnią współrzędną zignorujemy. Zauważmy, że współrzędne x, y, z w układzie kamery są (z dokładnością do stałej f) współrzędnymi jednorodnymi obrazu rozpatrywanego punktu na klatce, przy czym współrzędna z jest współrzędną wagową. Przypuśćmy, że zamiast współrzędnych kartezjańskich x, y, z, do reprezentowania punktu używamy współrzędnych jednorodnych X, Y, Z, W, takich że x=\frac{X}{W}, y=\frac{Y}{W}, z=\frac{Z}{W}. Wtedy wektor [X,Y,Z,W]^{T} możemy poddać przekształceniu, które w przypadku rzutowania równoległego i perspektywicznego polega na pomnożeniu go odpowiednio przez macierz

\displaystyle\left[\begin{array}[]{cccc}1&0&0&0\\
0&1&0&0\\
0&0&0&1\end{array}\right]\qquad\mbox{albo}\qquad\left[\begin{array}[]{cccc}f&0&0&0\\
0&f&0&0\\
0&0&1&0\end{array}\right].

Wynikiem mnożenia jest wektor [X,Y,W]^{T} albo [fX,fY,Z]^{T}, a zatem w każdym z tych przypadków otrzymujemy współrzędne jednorodne odpowiedniego obrazu rzutowanego punktu na płaszczyźnie rzutni.

Po obliczeniu wspołrzędnych jednorodnych wykonuje się dwa dzielenia, a następnie dokonuje jeszcze jednego przekształcenia afinicznego, którego celem jest przejście do współrzędnych urządzenia (jednostką w tym układzie jest szerokość lub wysokość piksela). Współrzędne w układzie urządzenia można następnie zaokrąglić i przystąpić do rysowania.

Zatrzymajmy się jeszcze na kroku poprzednim. Współrzędna z w układzie kamery jest głębokością punktu i jest potrzebna do rozstrzygania widoczności w algorytmach linii i powierzchni zasłoniętej. Z dwóch punktów, których obrazem w rzucie jest ten sam punkt, i które znajdują się przed obserwatorem, widoczny jest punkt o mniejszej głębokości. Dokonując rzutowania będziemy chcieli otrzymać informację o głębokości, przy czym ze względów oszczędnościowych (aby dostać tę informację w jednej operacji mnożenia macierzy 4\times 44\times 1) chcemy, aby to była współrzędna jednorodna, taka że głębokość (lub informacja jej równoważna) jest ilorazem tej współrzędnej i współrzędnej wagowej.

Dokonując rzutowania równoległego możemy użyć macierzy jednostkowej; wtedy otrzymamy wynik [X,Y,Z,W]^{T} i obliczymy współrzędne obrazu punktu na rzutni x=X/W, y=Y/W i głębokość z=Z/W. Zauważmy, że rozstrzyganie widoczności jest też możliwe jeśli zamiast współrzędnej z w układzie kamery znamy dla każdego punktu odpowiadającą mu liczbę c_{0}-c_{1}W/Z (dla dowolnej stałej c_{0} oraz c_{1}\neq 0). Dzięki temu podczas rzutowania perspektywicznego możemy wektor współrzędnych jednorodnych danego punktu w układzie kamery pomnożyć przez macierz

\displaystyle\left[\begin{array}[]{cccc}f&0&0&0\\
0&f&0&0\\
0&0&c_{0}&-c_{1}\\
0&0&1&0\end{array}\right].

Macierz ta jest nieosobliwa, a iloczynem jej i wektora [X,Y,Z,W]^{T} jest wektor [fX,fY,c_{0}Z-c_{1}W,Z]^{T}. Możemy dalej obliczyć współrzędne obrazu punktu na rzutni x=fX/Z, y=fY/Z i głębokość d=c_{0}-c_{1}W/Z. Jeśli c_{1}>0, to z dwóch punktów, które mają ten sam obraz w rzucie, bliższy obserwatora jest punkt, któremu odpowiada mniejsza liczba d.

Określając rzutowanie w programach korzystajacych z różnych pakietów oprogramowania, należy podać zakres głębokości, tj. granice przedziału [z_{{\mathrm{min}}},z_{{\mathrm{max}}}], do którego należą współrzędne punktów rzutowanej sceny. Jest to potrzebne dlatego, że informacja o głębokości jest (po przeskalowaniu) zaokrąglana do liczby całkowitej (np. 24- lub 32-bitowej) i w testach widoczności dane są przetwarzane w tej postaci. Przypuśćmy, że punktom o głębokościach z przedziału [z_{{\mathrm{min}}},z_{{\mathrm{max}}}] mają odpowiadać liczby d z przedziału [0,1]. Mamy stąd, dla rzutu perspektywicznego, układ dwóch równań liniowych

\displaystyle\left\{\begin{array}[]{r}z_{{\mathrm{min}}}c_{0}-c_{1}\:=\: 0,\\
z_{{\mathrm{max}}}c_{0}-c_{1}\:=\: 1,\end{array}\right.

na podstawie którego możemy obliczyć c_{0}c_{1} (oczywiście, musi być spełniony warunek z_{{\mathrm{max}}}>z_{{\mathrm{min}}}>0). Możemy wprowadzić analogiczne współczynniki do macierzy rzutowania równoległego i okeślić je w podobny sposób.

Wiemy już dostatecznie dużo, aby rozszyfrować sposób tworzenia macierzy rzutowania wykorzystywany przez standard OpenGL. W standardzie tym bryła widzenia jest poddawana takiemu przekształceniu, aby jej obraz był kostką [-1,1]\times[-1,1]\times[0,1]. Ma to na celu umożliwienie wygodnego obcinania rysowanych obiektów (odcinków i wielokątów) do takiej kostki, a następnie zastosowania algorytmu z buforem głębokości do rozstrzygania widoczności (współrzędne z punktów w bryle widzenia, należące do przedziału [0,1], sa dalej mnożone przez liczbę N zależną od implementacji OpenGL'a, może być np. N=2^{{16}}-1 lub N=2^{{32}}-1, i zaokrąglane do liczby całkowitej — to jest już ukryte przed autorem programu korzystającego z biblioteki OpenGL). Dlatego macierz rzutowania perspektywicznego, tworzona przez procedurę glFrustum, ma postać

\displaystyle\left[\begin{array}[]{cccc}\frac{2n}{r-l}&0&\frac{r+l}{r-l}&0\\
0&\frac{2n}{t-b}&\frac{t+b}{t-b}&0\\
0&0&\frac{n+f}{n-f}&\frac{2nf}{n-f}\\
0&0&-1&0\end{array}\right].

Symbole r, l, t, b, nf są współrzędnymi punktów określających bryłę widzenia: liczby dodatnie n i f (ang. nearfar) określają przednią i tylną płaszczyznę obcinania; współrzędne z (w układzie kamery) punktów bryły widzenia leżą w przedziale między nimi. Ściana bryły widzenia równoległa do rzutni położona bliżej środka rzutowania (w płaszczyźnie z=n) jest prostokątem, którego wierzchołkami są punkty [l,t,n]^{T}, [r,t,n]^{T}, [r,b,n]^{T}[l,b,n]^{T}. Wyświetlane punkty, po przejściu przez test widoczności i obliczeniu koloru, są następnie poddawane przekształceniu, które kwadrat [-1,1]\times[-1,1] odwzorowuje na odpowiedni prostokąt (np. okno) na ekranie. Szczegóły są opisane w dodatku B.

Macierz tworzona przez procedurę glOrtho realizuje rzutowanie równoległe; bryła widzenia w układzie kamery jest prostopadłościanem, który zostaje odwzorowany na kostkę [-1,1]\times[-1,1]\times[0,1]. Macierz ta ma postać

\displaystyle\left[\begin{array}[]{cccc}\frac{2}{r-l}&0&0&\frac{r+l}{r-l}\\
0&\frac{2}{t-b}&0&\frac{t+b}{t-b}\\
0&0&\frac{2}{n-f}&\frac{f+n}{f-n}\\
0&0&0&1\end{array}\right].

Obcinanie, rozstrzyganie widoczności i dalsze etapy rysowania przebiegają tak samo jak w przypadku rzutowania perspektywicznego.

5.4. Stereoskopia

Wrażenie widzenia przestrzennego, czyli postrzeganie głębi obrazu, powstaje w mózgu obserwatora na podstawie dwóch obrazów na siatkówkach dwojga oczu. W świecie zwierząt jest to dość rzadkie zjawisko; zwróćmy uwagę na własności ludzkiego narządu wzroku, które to umożliwiają:

  • Pola widzenia obojga oczu prawie w całości pokrywają się.

  • Rozstaw oczu jest ustalony, sporo większy od ich wielkości i porównywalny z wielkością oglądanych obiektów (jeśli oglądamy duże obiekty, np. budynki, to wrażenie trójwymiarowości powstaje na podstawie poprzednich doświadczeń i oglądania obiektu z różnych stron; odległości położeń obserwatora są wtedy porównywalne z wielkością budynku).

  • Ludzkie oko ma bardzo dużą głębię ostrości (tj. szeroki zakres odległości, w których jednocześnie jest w stanie ,, widzieć ostro”).

Dzięki powyższemu zbiegowi okoliczności wystarczy zapewnić, aby każde oko widziało odpowiedni obraz, którego odległość od oka jest raczej nieistotna. Techniki oglądania ,,obrazów przestrzennych” są następujące:

  • Użycie kasku z wbudowanymi miniaturowymi monitorami,

  • Zastosowanie okularów z ciekłymi kryształami; prawa i lewa szyba stają się na przemian nieprzezroczyste, a na ekranie są wtedy wyświetlane obrazy lewy i prawy.

    Ta technika umożliwia oglądanie obrazów ,,trójwymiarowych” nie tylko na ekranie monitora lub telewizora, ale także na dużych ekranach, które są ścianami pomieszczenia. W takim pomieszczeniu może przebywać nawet duża grupa osób (z których każda ma swoje okulary), które odbierają poprawnie wrażenia widzenia przestrzennego. Potwierdza to fakt, że stosunkowo łatwo jest wywołać takie wrażenia u ludzi, którzy dobrze tolerują zniekształcenia wywołane wyświetlaniem obrazów otrzymanych z innego niż rzeczywiste położenia obserwatora.

  • Można użyć kolorowych okularów, np. z czerwoną i zieloną szybą i wyświetlać każdy obraz w innym kolorze (takie rysunki są znane od dawna pod nazwą anaglify).

  • Istnieją też obrazy ,,magiczne oko”, złożone z pozornie chaotycznych plam, wśród których można dostrzec obiekty trójwymiarowe.

Rys. 5.7. Wirtualne kamery dla obrazów stereoskopowych.

Aby otrzymać odpowiednie dwa obrazy należy określić dwa rzuty perspektywiczne (po jednym dla każdego oka). Aby to zrobić poprawnie, trzeba ustalić odpowiedni układ współrzędnych — prostokątny, o wersorach osi o identycznej długości, która jest jednostką odległości potrzebną dalej. Przypuśćmy, że jednostką tą jest 1cal (1^{{\prime\prime}}). Przy użyciu wybranej jednostki należy zmierzyć wymiary ekranu (np. od 11.2^{{\prime\prime}}\times 8.4^{{\prime\prime}} do 16.8^{{\prime\prime}}\times 12.6^{{\prime\prime}}), a także odległość widza od płaszczyzny ekranu (np. od 25^{{\prime\prime}} do 40^{{\prime\prime}}, siedzenie bliżej monitora jest niezdrowe) i odległość źrenic jego oczu (zwykle 2.64^{{\prime\prime}}). Na podstawie tych wymiarów wybieramy środki rzutowania i klatkę (rys. 5.7). Dla uzyskania dobrego efektu rysowane obiekty powinny mieć wymiary rzędu wielkości obrazu i znajdować się w odległości od obserwatora mniej więcej takiej, jak ekran (np. od połowy do dwóch odległości ekranu od obserwatora). Z moich doświadczeń wynika, że wspomniane wymiary można mierzyć niezbyt dokładnie, np. obrazy anaglifowe utworzone w celu wyświetlenia na monitorze czternastocalowym dają się bez problemu oglądać na monitorze siedemnastocalowym.

5.5. Panorama i inne rzuty

Istnieje wiele różnych stosowanych w praktyce odwzorowań przestrzeni w płaszczyznę; mogą one być określone przy użyciu rzutowania na powierzchnie krzywoliniowe, które następnie są przekształcane w płaszczyznę. Warto zauważyć, że obrazem odcinka w takim rzucie może być łuk krzywej, co stanowi utrudnienie podczas wykonywania obrazów.

Teoretycznie najprostsze jest przekształcenie w płaszczyznę powierzchni rozwijalnych, ale rzeczywiście łatwe do zrealizowania jest rozwinięcie tylko powierzchni walcowej. Możemy przyjąć jako rzutnię powierzchnię boczną walca (lub jej fragment), wybrać środek rzutowania w dowolnym punkcie jego osi, a następnie odwzorować rzutnię w płaszczyznę. Takie odwzorowanie nazywa się panoramą i bywa najczęściej stosowane w rysunkach architektonicznych i w wizualizacji danych. Rzadziej są stosowane rzuty na powierzchnie nierozwijalne, np. olorama, czyli rzut na sferę. Odwzorowanie obrazu na sferze (lub innej powierzchni nierozwijalnej) w płaszczyznę wprowadza dodatkowe zniekształcenia, które utrudniają jego oglądanie.

Rys. 5.8. Scena i rzutnia walcowa.
Rys. 5.9. Panorama.

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.