• Nie Znaleziono Wyników

Algorytm rzutowania

W dokumencie Grafika komputerowa I – MIM UW (Stron 62-66)

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

5.3. Algorytm rzutowania

Przekształcenie rzutowe jest to przekształcenie przestrzeni rzutowej (tj. afinicznej uzu-peł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 6= 0). Przekształcenia rzutowe otrzymamy dopuszczając dowolne liczby w ostatnim wierszu (pod warunkiem zachowania nieosobliwości macierzy; wyma-ganie 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 implemen-tacja 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.

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

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

będzie np. wyświetlony na ekranie (boki klatki są równoległe do osi x i y). 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 rzu-towania). Obraz punktu [x, y, z]T w rzucie perspektywicznym ma współrzędne f x/z, f y/z i f , 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 jed-norodnych X, Y , Z, W , takich że x = WX, y = WY , z = WZ. Wtedy wektor [X, Y, Z, W ]T możemy poddać przekształceniu, które w przypadku rzutowania równoległego i perspektywicznego po-lega na pomnożeniu go odpowiednio przez macierz

1 0 0 0 0 1 0 0 0 0 0 1 albo f 0 0 0 0 f 0 0 0 0 1 0 .

Wynikiem mnożenia jest wektor [X, Y, W ]T albo [f X, f Y, Z]T, a zatem w każdym z tych przy-padkó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 powierzch-ni zasłopowierzch-nię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 × 4 i 4 × 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ę c0 c1W/Z (dla dowolnej stałej c0 oraz c16= 0). Dzięki temu podczas rzutowania perspektywicznego

możemy wektor współrzędnych jednorodnych danego punktu w układzie kamery pomnożyć przez macierz f 0 0 0 0 f 0 0 0 0 c0 −c1 0 0 1 0 .

Macierz ta jest nieosobliwa, a iloczynem jej i wektora [X, Y, Z, W ]T jest wektor [f X, f Y, c0Z − c1W, Z]T. Możemy dalej obliczyć współrzędne obrazu punktu na rzutni x = f X/Z, y = f Y /Z i głębokość d = c0 − c1W/Z. Jeśli c1 > 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 [zmin, zmax], do którego należą współrzędne punktów rzutowanej sceny. Jest to potrzebne dlatego, że informacja o głębokości jest (po przeska-lowaniu) 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 [zmin, zmax] mają odpowiadać liczby d z przedziału [0, 1]. Mamy stąd, dla rzutu perspektywicznego, układ dwóch równań liniowych

(

zminc0− c1 = 0,

zmaxc0− c1 = 1,

na podstawie którego możemy obliczyć c0 i c1 (oczywiście, musi być spełniony warunek zmax> zmin> 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 wyko-rzystywany przez standard OpenGL. W standardzie tym bryła widzenia jest poddawana takiemu przekształceniu, aby jej obraz był kostką [−1, 1] × [−1, 1] × [0, 1]. Ma to na celu umożliwienie wygodnego obcinania rysowanych obiektów (odcinków i wielokątów) do takiej kostki, a następ-nie 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 = 216− 1 lub N = 232− 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ć

2n r−l 0 r+lr−l 0 0 t−b2n t+bt−b 0 0 0 n+fn−f n−f2nf 0 0 −1 0 .

Symbole r, l, t, b, n i f są współrzędnymi punktów określających bryłę widzenia: liczby dodatnie

n i f (ang.nearifar) określają przednią i tylną płaszczyznę obcinania; współrzędne z (w ukła-dzie 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 i [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] × [−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] × [−1, 1] × [0, 1]. Macierz ta ma postać 2 r−l 0 0 r+lr−l 0 t−b2 0 t+bt−b 0 0 n−f2 f +nf −n 0 0 0 1 .

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

5.4. Stereoskopia

Wrażenie widzenia przestrzennego, czyli postrzeganie głębi obrazu, powstaje w mózgu ob-serwatora 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ójwymiaro-woś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 jedno-cześnie jest w stanie „ widzieć ostro”).

Dzięki powyższemu zbiegowi okoliczności wystarczy zapewnić, aby każde oko widziało od-powiedni 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 okula-ry), 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.

Aby otrzymać odpowiednie dwa obrazy należy określić dwa rzuty perspektywiczne (po jed-nym dla każdego oka). Aby to zrobić poprawnie, trzeba ustalić odpowiedni układ współrzędnych

Rysunek 5.7. Wirtualne kamery dla obrazów stereoskopowych.

— prostokątny, o wersorach osi o identycznej długości, która jest jednostką odległości potrzeb-ną dalej. Przypuśćmy, że jednostką tą jest 1cal (100). Przy użyciu wybranej jednostki należy zmierzyć wymiary ekranu (np. od 11.200× 8.400 do 16.800× 12.600), a także odległość widza od płaszczyzny ekranu (np. od 2500 do 4000, siedzenie bliżej monitora jest niezdrowe) i odległość źrenic jego oczu (zwykle 2.6400). 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 ce-lu wyświetlenia na monitorze czternastocalowym dają się bez problemu oglądać na monitorze siedemnastocalowym.

W dokumencie Grafika komputerowa I – MIM UW (Stron 62-66)