4.3. Rzut równoległy 75 gdzie (4.20) Punkt zbiegu, określony wzorami (4.19) (4.20), leży na prostej przechodzącej przez środek rzutowania i równoległej do wektora u. Zauważmy, że gdy wektor u jest równoległy do płaszczyzny rzutowania, to punkt zbiegu w kierunku tego wektora nie istnieje, gdyż wówczas n 1 u 1 % n 2 u 2 % n 3 u 3 ' 0. Z wzorów (4.19) (4.20) można otrzymać współrzędne głównych punktów zbiegu. Przyjmując u 1 ' 1 i u 2 ' u 3 ' 0 otrzymujemy główny punkt zbiegu P x w kierunku wektora i, tj. w kierunku osi x. Dla u 2 ' 1 i u 1 ' u 3 ' 0 wzory te określają główny punkt zbiegu P y w kierunku wektora j (osi y), a dla u 1 ' u 2 ' 0 i u 3 ' 1 główny punkt zbiegu P z w kierunku wektora k (osi z). Współrzędne tych punktów są następujące: (4.21) Z powyższych wzorów można natychmiast wywnioskować, kiedy otrzymuje się jeden, kiedy dwa, a kiedy trzy główne punkty zbiegu decyduje o tym wartość 0 (zero) dwu, jednej lub żadnej z liczb n 1, n 2 i n 3, a więc usytuowanie płaszczyzny rzutowania względem układu współrzędnych. 4.3. Rzut równoległy Rzut równoległy obiektu powstaje przez przecięcie z płaszczyzną rzutowania prostych równoległych do osi rzutowania przechodzących przez dane (wyróżnione) punkty obiektu. Rzut ten jest stosowany przede wszystkim w rysunku technicznym, w którym jest istotne zachowanie przez obraz obiektu kształtu i skali obiektu rzeczywistego. Przedstawienie wszystkich szczegółów wymaga często wykonania kilku rzutów równoległych na różne płaszczyzny rzutowania. Jeśli oś (kierunek) rzutowania jest prostopadła do płaszczyzny rzutowania, to rzut równoległy nazywamy rzutem ortogonalnym, a w przypadku przeciwnym rzutem nieortogonalnym. Gdy w rzucie ortogonalnym oś rzutowania jest równoległa do jednej z osi układu współrzędnych, otrzymujemy obraz przodu, podstawy lub boku obiektu (tego typu rzutowanie nazywamy wielowidokowym). Jeżeli oś rzutowania nie jest równoległa do żadnej z osi układu współrzędnych (lub równoważnie: gdy płaszczyzna rzutowania nie jest równoległa do żadnej z płaszczyzn układu), to rzut ortogonalny nazywamy aksonometrycznym. W zależności od kątów, jakie oś rzutowania
76 IV. Rzutowanie tworzy z osiami kartezjańskiego układu współrzędnych, wyróżniamy trzy rodzaje rzutu aksonometrycznego:! rzut izometryczny, gdy kąty osi rzutowania ze wszystkimi osiami układu współrzędnych są równe,! rzut dimetryczny, gdy kąty osi rzutowania z dwoma osiami układu współrzędnych są równe,! rzut anizometryczny, jeśli oś rzutowania tworzy z osiami układu współrzędnych nierówne kąty. Pewne przypadki rzutu nieortogonalnego posiadają swoje własne nazwy. I tak, mamy m. in.:! rzut kawalerski, gdy oś rzutowania jest wybrana tak, że nie występują skróty odcinków prostopadłych do płaszczyzny xy,! rzut gabinetowy, jeśli oś rzutowania jest wybrana tak, że odcinki prostopadłe do płaszczyzny xy ulegają skróceniu o połowę,! rzut wojskowy, gdy oś rzutowania tworzy z płaszczyzną rzutowania kąt 45. Poszczególne rodzaje rzutów równoległych są opisane w kolejnych dwu podpunktach. 4.3.1. Rzut ortogonalny Przypominamy, że w rzucie ortogonalnym oś rzutowania jest prostopadła do płaszczyzny rzutowania. Rozważmy najpierw najprostszy przypadek, gdy płaszczyzną rzutowania jest jedna z płaszczyzn układu współrzędnych, na przykład płaszczyzna xy. W rzucie tym obrazem punktu P o współrzędnych (x, y, z) jest punkt o współrzędnych, przy czym (zob. rys. 46) (4.22) Rys. 46. Rzut ortogonalny na płaszczyznę xy
4.3. Rzut równoległy 77 Macierz tego przekształcenia ma postać (we współrzędnych jednorodnych) (4.23) Jeżeli płaszczyzną rzutowania będzie płaszczyzna yz lub zx, to macierzami odpowiednich przekształceń będą (4.24) W przypadku ogólnym płaszczyzna rzutowania jest określona przez pewien punkt S o współrzędnych (x 0, y 0, z 0 ) i wektor normalny n ' n 1 i % n 2 j % n 3 k (zob. rys. 47). Rzut ortogonalny na tę płaszczyznę może być przedstawiony jako złożenie następujących przekształceń: a) przesunięcie o wektor &v ' & x 0 i & y 0 j & z 0 k, które punkt S płaszczyzny przekształca w początek układu współrzędnych, b) przekształcenie wektora n na wektor prostopadły do płaszczyzny xy, c) rzut ortogonalny na płaszczyznę xy, d) przekształcenie odwrotne do b), e) przekształcenie odwrotne do a). Rys. 47. Rzut ortogonalny na dowolną płaszczyznę Macierze przekształceń składowych są nam już znane: macierzą przekształcenia a) jest macierz T &v dana wzorem (3.53), przekształcenia b) macierz A n określona wzorem (3.54),
78 IV. Rzutowanie a macierz rzutu ortogonalnego na płaszczyznę xy ma postać (4.23). Stosując współrzędne jednorodne, całe przekształcenie możemy zapisać w postaci (4.25) Jeśli n 1 ' n 2 ' 0, tzn. gdy płaszczyzna rzutowania jest równoległa do płaszczyzny xy, zależność (4.25) upraszcza się do postaci (4.26) (wystarczy wykonać przesunięcie, rzut ortogonalny na płaszczyznę xy i przesunięcie odwrotne). Gdy płaszczyzna rzutowania jest równoległa do płaszczyzny yz lub zx, to można posłużyć się wzorami analogicznymi do wzoru (4.26), wstawiając w miejsce macierzy O z jedną z macierzy (4.24). Rozważmy teraz rzut izometryczny, tj. rzut ortogonalny, w którym oś rzutowania tworzy równe kąty ze wszystkimi osiami układu. Jeśli założymy, że płaszczyzna rzutowania pokrywa się z płaszczyzną xy, to powinniśmy ją tak nachylić, by na otrzymanej w ten sposób nowej płaszczyźnie rzutowania otrzymać rzut ortogonalny, którego oś tworzy równe kąty z osiami x, y i z układu współrzędnych. Zadanie sprowadza się do zatem do określenia przekształcenia P xy przeprowadzającego wektory jednostkowe i, j i k w wektory, i, których rzuty ortogonalne na płaszczyznę xy mają jednakowe długości. Przekształcenie to jest określone (we współrzędnych jednorodnych) przez macierz (4.27) gdzie macierz O z ma postać (4.23), a T oznacza macierz przekształcenia zwanego przechyleniem (ang. tilting), które w ogólności składa się z obrotów wokół dwu z trzech osi układu współrzędnych. W naszym przypadku przekształcenie to, transformujące wektory i, j i k w wektory, i, składa się z obrotu wokół osi x i obrotu wokół osi y. Dla układu prawoskrętnego i przy przyjętej przez nas zasadzie mierzenia kątów (zob. p. 3.2.2), jeżeli najpierw wykonamy obrót o kąt &> wokół osi x, a następnie o kąt &R wokół osi y (zob. rys. 48), to otrzymamy (por. wzory (3.31) oraz (3.32)) (4.28)
4.3. Rzut równoległy 79 Rys. 48. Przechylenie Po podstawieniu macierzy (4.28) do wzoru (4.27) otrzymujemy (4.29) Zatem rzutami wektorów, i na płaszczyznę xy są wektory których długości są równe odpowiednio (4.30) Z warunku równości kwadratów tych długości, tj. (4.31) możemy określić kąty > i R. Po drobnych przekształceniach z równań (4.30) i (4.31) otrzymujemy skąd wynika, że (4.32)
80 IV. Rzutowanie tj. > ' 45 i R. 35,26. Po podstawieniu wartości (4.32) do (4.29), macierz P xy przyjmie postać (4.33) co oznacza, że równania określające rzut izometryczny na płaszczyznę xy są następujące: (4.34) W podobny sposób można wyprowadzić równania rzutu izometrycznego na płaszczyzny yz i zx. Macierze tych przekształceń (we współrzędnych jednorodnych) mają postacie odpowiednio W rzucie dimetrycznym oś rzutowania tworzy równe kąty z dwiema osiami układu współrzędnych. Jeśli założymy, że płaszczyzną rzutowania jest płaszczyzna xy, to macierz przekształcenia będzie miała postać (4.29), przy czym występujące w niej kąty powinny być tak określone, by długości rzutów dwu z trzech wektorów, i były równe. Oznacza to, że długości te powinny spełniać proporcje (4.35) gdzie l $ 0 (wartość l ' 1 oznacza rzut izometryczny rozważany poprzednio), a wielkości d i, d j i d k są określone wzorami (4.30). Załóżmy, że długości wspomnianych wektorów spełniają pierwszą z proporcji (4.35). Wówczas z warunku d j ' d k otrzymamy równanie skąd wynika, że tj. > ' 45. Drugi warunek, d i ' ld j, implikuje równanie (4.36)
4.3. Rzut równoległy 81 skąd otrzymujemy (4.37) przy czym Po podstawieniu wartości (4.36) i (4.37) do (4.29) otrzymujemy (4.38) Wynika stąd, że równania rzutu dimetrycznego na płaszczyznę xy są następujące: (4.39) gdzie Zauważmy, że dla l ' 1 otrzymujemy wzory (4.34). Dla pozostałych dwu proporcji (4.35), tj. 1:l:1 i 1:1:l, macierze przekształceń mają postać odpowiednio (4.40) i (4.41)
82 IV. Rzutowanie Dla l ' 1, podobnie jak w przypadku zależności (4.39), otrzymujemy wzory (4.35). Przeprowadzenie podobnej analizy w przypadku rzutu dimetrycznego na płaszczyznę yz prowadzi do macierzy: i Macierzami rzutu dimetrycznego na płaszczyznę zx są:
4.3. Rzut równoległy 83 i przy czym dla l ' 1 otrzy- We wszystkich przypadkach obowiązuje ograniczenie mujemy rzuty izometryczne. 3.3.2. Rzut nieortogonalny W rzucie równoległym nieortogonalnym oś rzutowania nie jest prostopadła do płaszczyzny rzutowania. Przed podaniem ogólnych równań takiego przekształcenia rozważmy prostszy przypadek, gdy płaszczyzna rzutowania pokrywa się z płaszczyzną xy (w szczególności może to być powierzchnia ekranu). Niech kierunek rzutowania będzie określony przez wektor u ' ai % bj % ck. Naszym celem jest znalezienie współrzędnych rzutu punktu P na płaszczyznę xy. Ponieważ wektor jest równoległy do wektora u (zob. rys. 49), więc ' ku, tj. Punkt leży na płaszczyźnie xy, więc i z ostatniego równania otrzymujemy Zatem współrzędne punktu są następujące (4.42)
84 IV. Rzutowanie Rys. 49. Rzut nieortogonalny na płaszczyznę xy We współrzędnych jednorodnych macierzą powyższego przekształcenia jest (4.43) W przypadku rzutu równoległego w kierunku wektora u na płaszczyzny yz i zx macierzami przekształceń są odpowiednio (4.44) Rozważmy teraz rzut równoległy w kierunku danego wektora u na dowolną płaszczyznę. Niech płaszczyzna rzutowania przechodzi przez punkt S o współrzędnych (x 0, y 0, z 0 ) i ma wektor normalny n ' n 1 i % n 2 j % n 3 k (zob. rys. 50). Przekształcenie to może być opisane jako złożenie następujących przekształceń: a) przesunięcie o wektor &v ' & x 0 i & y 0 j & z 0 k, b) przekształcenie wektora n na wektor prostopadły do płaszczyzny xy, c) rzut równoległy (w kierunku wektora u) na płaszczyznę xy, d) przekształcenie odwrotne do b), e) przekształcenie odwrotne do a).
4.3. Rzut równoległy 85 Rys. 50. Rzut nieortogonalny na dowolną płaszczyznę Kolejno wykonywane przekształcenia są więc, poza przekształceniem c), takie same jak przy rzucie ortogonalnym na dowolną płaszczyznę (zob. p. 4.3.1). We współrzędnych jednorodnych całe przekształcenie może być zapisane w postaci (porównaj wzór (4.25)) (4.45) przy czym wektor u nie może być równoległy do płaszczyzny xy. Gdy n 1 ' n 2 ' 0, tzn. gdy płaszczyzna rzutowania jest równoległa do płaszczyzny xy, zależność ta upraszcza się do postaci (4.46) Macierze występujące we zależnościach (4.45) i (4.46) są określone wzorami: T & v (3.53), A n (3.54), a P u, xy (4.43). Gdy wektor u jest równoległy do płaszczyzny xy, tzn. gdy c ' 0, wektor n należy przekształcić na wektor prostopadły do płaszczyzny yz (jeśli a 0) lub zx (jeżeli b 0). Przy założeniu, że a 0 (wartość b może być wówczas dowolna, w tym równa 0) wybieramy płaszczyznę yz. Ponieważ za pomocą transformacji opisanej iloczynem macierzy A n T &v płaszczyzna rzutowania została już przekształcona na płaszczyznę xy, w celu jej zmiany na płaszczyznę yz wystarczy wykonać obrót o kąt &90 wokół osi y (macierz tego obrotu otrzymujemy ze wzoru (3.31)). Następnie wykonujemy rzut w kierunku wektora u na płaszczyznę yz (jego macierzą jest pierw-
86 IV. Rzutowanie sza z macierzy (4.44) dla c ' 0), po czym odpowiednie przekształcenia odwrotne. Całe przekształcenie jest iloczynem macierzy gdzie (z uwagi na fakt, że c ' 0 oraz wzór (3.31)) Jeśli c ' 0 i a ' 0, to wektor u ' bj (wartość b musi być w tym przypadku różna od 0) jest prostopadły do płaszczyzny zx i na tę płaszczyznę należy przekształcić płaszczyznę rzutowania. W tym celu wystarczy płaszczyznę xy, na którą płaszczyzna rzutowania została już przekształcona za pomocą transformacji A n T & v, obrócić o kąt 90 wokół osi x. Następnie należy wykonać rzut ortogonalny na płaszczyznę zx i odpowiednie przekształcenia odwrotne. Całe przekształcenie opisuje iloczyn macierzy gdzie na podstawie wzorów (4.24) lub (4.44) (dla a ' c ' 0) oraz (3.32) Przypadkami szczególnymi rzutu równoległego (nieortogonalnego) są: rzut kawalerski, gabinetowy i wojskowy. Rzuty te określa się czasami wspólnym terminem rzut skośny. Charakteryzują go dwie liczby (zob. rys. 51): f skrót, który określa w jakim stosunku odcinki prostopadłe do płaszczyzny rzutowania będą krótsze po ich zrzutowaniu na płaszczyznę xy oraz 2 kąt rzutu prostej prostopadłej do płaszczyzny xy z osią x (ściślej: z jej dodatnim kierunkiem). Oczywiście można także rozważać rzut skośny na płaszczyznę yz i zx. Wyprowadzenie wzorów ograniczymy (jak zwykle) do płaszczyzny xy, tj. przypadku występującego najczęściej w praktyce. Zdefiniowanie rzutu skośnego sprowadza się do określenia kierunku rzutowania. Jeśli na osi z zaznaczymy odcinek jednostkowy OP, to za wektor u (wskazujący kierunek rzutu) możemy przyjąć wektor. Wektor ten ma postać Z rys. 51 widać, że Stosując poprzednie oznaczenia składowych wektora rzutowania, tj. a, b i c, z powyższych wzorów wynika, że
4.3. Rzut równoległy 87 Rys. 51. Rzut skośny (4.47) Po podstawieniu zależności (4.47) do (4.42) otrzymujemy wzory określające rzut skośny na płaszczyznę xy: którego macierzą (we współrzędnych jednorodnych) jest macierz (5.48) W przypadku rzutów skośnych na płaszczyzny yz i zx macierze przekształceń mają postacie odpowiednio przy czym T oznacza kąt pomiędzy rzutem na płaszczyznę yz prostej do niej prostopadłej i osią y, a N kąt pomiędzy rzutem na płaszczyznę zx prostej prostopadłej do tej płaszczyzny i osią z.
88 IV. Rzutowanie Wspomniane przypadki szczególne rzutów skośnych otrzymujemy przez wybór odpowiednich wartości f i 2 (T w rzucie na płaszczyznę yz i N w rzucie na płaszczyznę zx). Ich zestawienie znajduje się w tabeli 4. Tabela 4. Przykłady rzutów skośnych Rodzaj rzutu kawalerski gabinetowy wojskowy f 1 1/2 dowolne 2 dowolne dowolne ±45 Uwaga: W rzucie kawalerskim, gabinetowym i wojskowym rzut prostopadłościanu o dwu ścianach równoległych do płaszczyzny rzutowania jest przedstawiany zwykle tak, że widoczne są następujące ściany: przednia, boczna prawa i podstawa górna (w układzie współrzędnych z osią x skierowaną w prawo i osią y skierowaną w górę). Ponieważ oś y jest skierowana w dół ekranu, aby osiągnąć taki rzut na ekranie, należy przyjąć ujemną wartość kąta 2 (*2* < 90 ). Należy podkreślić, że rzut skośny nie jest jakimś szczególnym przypadkiem rzutu równoległego (nieortogonalnego) rozróżnienie wynika jedynie ze sposobu definiowania rzutu (w rzucie równoległym dany jest wektor rzutowania, a w rzucie skośnym skrót i kąt 2).
V. TRÓJWYMIAROWA REPREZENTACJA PRZEDMIOTU W PRZESTRZENI WIDOCZNOŚCI 5.1. Płaszczyzna rzutowania i wielościan widoczności Przedstawienie trójwymiarowego obiektu świata rzeczywistego na ekranie monitora wymaga określenia w układzie współrzędnych tego świata płaszczyzny rzutowania (ang. view plane) i pewnej przestrzeni oglądania, zwanej też przestrzenią widoczności lub widzenia (ang. view volume), która na ogół jest wielościanem. W rzucie równoległym wielościan widoczności jest równoległościanem o bokach równoległych do kierunku rzutowania, a w rzucie perspektywicznym ostrosłupem. W rzucie perspektywicznym, który jak wiemy pozwala uzyskać bardziej realistyczny obraz, dodatkowo należy określić środek rzutowania, tj. punkt położenia obserwatora. Rzut obiektu trójwymiarowego otrzymany na płaszczyźnie rzutowania powinien być następnie przeniesiony na ekran monitora. Różne umiejscowienie płaszczyzny rzutowania i środka rzutowania w świecie rzeczywistym umożliwia uzyskanie różnych obrazów tego samego obiektu bez potrzeby jego przemieszczania, więc przy stale tych samych danych go definiujących. Płaszczyznę rzutowania określa się przez podanie pewnego jej punktu S, zwanego punktem odniesienia (ang. reference point), o współrzędnych (x 0, y 0, z 0 ) i wektora normalnego n ' n 1 i % n 2 j % n 3 k, żądając niekiedy, aby był to wektor jednostkowy (*n* ' 1). Na płaszczyźnie rzutowania określamy układ współrzędnych prostokątnych, który będziemy nazywać układem współrzędnych płaszczyzny rzutowania. W wielu podręcznikach przyjmuje się, że układ ten jest układem lewoskrętnym (wobec prawoskrętnego układu współrzędnych świata rzeczywistego ), co można tłumaczyć pewnym przyzwyczajeniem do układu płaskiego z osią x skierowaną w prawo i osią y skierowaną w górę. Z punktu widzenia programowania komputerów wygodnie przyjąć, że układ współrzędnych płaszczyzny rzutowania jest układem prawoskrętnym (zapewnia to zgodność z układem współrzędnych ekranu) i taki też układ przyjmiemy w dalszych rozważaniach. Określenie układu współrzędnych płaszczyzny rzutowania wymaga zdefiniowania (w układzie kartezjańskim świata rzeczywistego ) początku tego układu oraz wektorów jednostkowych jego osi. Za początek układu możemy przyjąć punkt odniesienia S. Oznaczmy osie tego układu przez x S, y S i z S, a ich wektory jednostkowe przez i S, j S i k S. Oś z S można zdefiniować bardzo prosto przyjmujemy, że wektor k S jest równoległy do wektora normalnego n, tj. (5.1) Jeśli wektor normalny płaszczyzny rzutowania jest wektorem jednostkowym, to oczywiście wektor k S jest jemu równy.
90 V. Trójwymiarowa reprezentacja przestrzeni widoczności Rys. 52. Układ współrzędnych płaszczyzny rzutowania Z określeniem pozostałych dwu wektorów jednostkowych układu współrzędnych płaszczyzny rzutowania jest pewien kłopot. Otóż, nie wystarczy do tego celu żądanie, by powstały układ był prawoskrętny. Konieczne jest określenie pomocniczego wektora, tzw. wektora odniesienia (ang. reference vector, up vector), którego rzut prostopadły (w kierunku wektora normalnego) na płaszczyznę rzutowania wyznaczy nam kierunek jednej z dwu nie określonych dotąd osi. Jeśli wektor ten oznaczymy przez w, a jego rzut przez w S, to korzystając tylko z definicji dodawania wektorów, mamy (zob. rys. 52) (5.2) W celu wyznaczenia liczby k korzystamy z faktu, że wektor w S leży na płaszczyźnie rzutowania, a więc jest prostopadły do wektora n. Oznacza to, że iloczyn skalarny wektorów w S i n jest równy zeru: Po podstawieniu zależności (5.2) do (5.3) otrzymujemy (5.3) skąd (5.4) Uwzględnienie wzoru (5.4) w (5.2) prowadzi do zależności (5.5) Wektor jednostkowy o kierunku zgodnym z kierunkiem wektora w S możemy przyjąć za jeden z wektorów i S lub j S, a drugi z nich określić tak, by układ Sx S y S z S był układem prawoskrętnym (wektory jednostkowe i, j i k osi prawoskrętnego układu współrzędnych spełniają warunki i j ' k, j k ' i, k i ' j, gdzie oznacza iloczyn wektorowy). Jeśli
5.1. Płaszczyzna rzutowania i wielościan widoczności 91 (5.6) to z warunku k S i S ' j S oraz zależności (5.2) i (5.6) otrzymujemy (5.7) Ponieważ znamy początek układu współrzędnych płaszczyzny rzutowania i wektory jednostkowe osi tego układu, mając dane współrzędne (x, y, z) dowolnego punktu w układzie kartezjańskim świata rzeczywistego, możemy określić jego współrzędne w układzie Sx S y S z S płaszczyzny rzutowania. W tym celu wystarczy wyjściowy układ przesunąć do punktu S (o współrzędnych (x 0, y 0, z 0 )), a następnie wykonać odpowiednie obroty. We współrzędnych jednorodnych macierzą pierwszego przekształcenia jest (por. p. 3.2.1) (5.8) Drugie przekształcenie opisują wzory (3.13), w których należy określić cosinusy kątów " i, $ i i ( i (i ' 1, 2, 3), jakie osie układu Sx S y S z S tworzą z osiami układu Oxyz. Ponieważ na podstawie zależności (5.1) i (5.5) (5.7) mamy (5.9) gdzie a z drugiej strony
92 V. Trójwymiarowa reprezentacja przestrzeni widoczności więc w rozważanym przypadku macierz przekształcenia (3.13) ma postać (we współrzędnych jednorodnych) (5.10) gdzie Całe przekształcenie można zatem zapisać następująco (5.11) gdzie macierze i są określone wzorami (5.8) i (5.10). Zauważmy, że jeśli wektor odniesienia w jest równoległy do płaszczyzny rzutowania (w szczególności, gdy na niej leży), co często przyjmuje się w praktyce, to w S ' w i macierz redukuje się do postaci (5.12)
5.1. Płaszczyzna rzutowania i wielościan widoczności 93 gdzie Przekształcenie odwrotne do przekształcenia (5.11), a więc określające współrzędne punktu w układzie kartezjańskim świata rzeczywistego z jego współrzędnych w układzie płaszczyzny rzutowania, opisuje zależność (5.13) gdzie (w ogólnym przypadku) Przestrzeń oglądania w świecie rzeczywistym jest ograniczona najczęściej pewnym wielościanem, na którego ścianach obiekt (obiekty) są obcinane. Rzut tego wielościanu na płaszczyznę rzutowania określa okno, wewnątrz którego otrzymujemy obraz obiektu (obiektów). Ponieważ okno to jest następnie przekształcane do prostokąta ekranu, przeważnie samo posiada kształt prostokąta. W takim przypadku wielościan widoczności jest przy rzucie perspektywicznym ostrosłupem czworokątnym (zob. rys. 53), a przy rzucie równoległym równoległościanem (zob. rys. 54), który przy rzucie ortogonalnym staje się prostopadłościanem. Rys. 53. Ostrosłup widoczności przy rzucie perspektywicznym
94 V. Trójwymiarowa reprezentacja przestrzeni widoczności Rys. 54. Równoległościan widoczności przy rzucie równoległym Okno prostokątne na płaszczyźnie rzutowania jest określane przez podanie współrzędnych (x S,min, y S,min ) i (x S,max, y S,max ) dwóch narożników L i R (zob. rys. 55). Współrzędne te są podawane w układzie współrzędnych płaszczyzny rzutowania (współrzędne z S obu narożników są równe 0). Narożniki te będziemy nazywać lewym górnym (L) i prawym dolnym (R) narożnikiem okna (odpowiada to ich usytuowaniu na ekranie, którego osie są zorientowane tak samo, jak układ współrzędnych płaszczyzny rzutowania). Zmiana wspomnianych współrzędnych na współrzędne w układzie kartezjańskim świata rzeczywistego polega na zastosowaniu przekształcenia (5.13). Rys. 55. Okno na płaszczyźnie rzutowania
5.2. Obcinanie 95 5.2. Obcinanie Wielościany widoczności, o których wspomnieliśmy w poprzednim punkcie, były bryłami otwartymi. W praktyce w celu ograniczenia liczby rzutowanych punktów bryły te ograniczamy dodatkowymi płaszczyznami, otrzymując przy rzucie równoległym równoległościan zawierający także obie podstawy (zob. rys. 56), a przy rzucie perspektywicznym ścięty ostrosłup czworokątny z podstawami (zob. rys. 57). W celu rozróżnienia płaszczyzn ograniczających, płaszczyznę położoną bliżej obserwatora nazywa się przednią płaszczyzną ograniczającą (ang. front clipping plane, hither clipping plane), a położoną dalej od obserwatora tylną płaszczyzną ograniczającą (ang. back clipping plane, yon clipping plane). W przypadku rzutu perspektywicznego określenia te nie budzą wątpliwości, gdyż położenie obserwatora jest utożsamiane ze środkiem rzutowania. Przy rzucie równoległym przyjmiemy, że domyślny obserwator znajduje się przed płaszczyzną rzutowania i obie płaszczyzny ograniczające znajdują się przed nim (w kierunku, w którym patrzy on na płaszczyznę rzutowania). Wspomniane płaszczyzny ograniczające są równoległe do płaszczyzny rzutowania, a ich położenie określa się przez podanie odległości od tej płaszczyzny. Odległości te będziemy umownie oznaczać przez f (dla płaszczyzny przedniej) i d (dla płaszczyzny tylnej). Będziemy zawsze zakładać, że f < d (dla f ' d otrzymujemy obraz obiektu dwuwymiarowego). Wartości f i d mogą być dowolnymi liczbami, przy czym wartość ujemna oznacza położenie płaszczyzny przed płaszczyzną rzutowania (patrząc od strony obserwatora). Możliwe są trzy różne położenia płaszczyzn ograniczających:! f < d # 0 obie płaszczyzny ograniczające leżą przed płaszczyzną rzutowania, przy czym płaszczyzna tylna ewentualnie pokrywa się z płaszczyzną rzutowania, Rys. 56. Ograniczony równoległościan widoczności
96 V. Trójwymiarowa reprezentacja przestrzeni widoczności Rys. 57. Ograniczony ostrosłup widoczności! f # 0 < d lub f < 0 # d płaszczyzna przednia leży przed płaszczyzną rzutowania, a płaszczyzna tylna za nią (ewentualnie jedna z płaszczyzn ograniczających pokrywa się z płaszczyzną rzutowania),! 0 # f < d obie płaszczyzny ograniczające leżą za płaszczyzną rzutowania, przy czym płaszczyzna przednia ewentualnie pokrywa się z płaszczyzną rzutowania. Do obcinania przestrzeni widoczności do ograniczonych wielościanów można zastosować uogólnione algorytmy Cohena-Sutherlanda, Lianga-Barsky'ego i Sutherlanda-Hodgmana. Dla przypadku dwuwymiarowego algorytmy te zostały opisane w p. 2.2. Niezbędne modyfikacje dla przypadku trójwymiarowego wynikają z faktu, że teraz należy obciąć odcinek względem sześciu ścian (płaszczyzn), a nie, jak poprzednio, względem czterech boków (prostych). Sprowadza się to do:! określenia płaszczyzn wyznaczających ściany wielościanu obcięcia,! znajdowania punktu przecięcia odcinka z płaszczyzną,! podania warunków, z których można wywnioskować, czy punkt leży wewnątrz czy też na zewnątrz wielościanu obcięcia (w algorytmie Sutherlanda-Hodgmana) lub do określenia dla każdego końca odcinka kodu sześciobitowego, który charakteryzuje jego położenie względem wielościanu obcięcia (w algorytmie Cohena-Sutherlanda). Wyznaczmy najpierw równania płaszczyzn, które formują odpowiednie wielościany obcięcia. Równania przednich i tylnych płaszczyzn ograniczających są takie same w przypadku ściętego ostrosłupa czworokątnego (rzut perspektywiczny) i równoległościanu (rzut równoległy), gdyż obie płaszczyzny są równoległe do płaszczyzny rzutowania. Równania te mogą być wyznaczone
5.2. Obcinanie 97 z faktu, że ich wektorem normalnym jest wektor n ' n 1 i % n 2 j % % n 3 k oraz że przechodzą przez punkty: P f o współrzędnych (płaszczyzna przednia) i P d o współrzędnych (płaszczyzna tylna), gdzie (x 0, y 0, z 0 ) oznaczają współrzędne punktu S płaszczyzny rzutowania, a f i d odległości od niej rozważanych płaszczyzn (przypominamy, że gdy płaszczyzna ograniczająca leży przed płaszczyzną rzutowania, to odległość wyrażamy za pomocą liczby ujemnej). Mamy zatem (5.14) dla przedniej płaszczyzny ograniczającej oraz (5.15) dla płaszczyzny tylnej. W celu wyznaczenia równań bocznych płaszczyzn ograniczających, należy oddzielnie rozważyć rzut równoległy i perspektywiczny. W rzucie równoległym do ich określenia wykorzystujemy fakty (zob. rys. 56), że płaszczyzny górna i dolna są równoległe do wektorów u ' u 1 i % uj 2 % u 3 k (określa on kierunek rzutowania) i i S ' i S1 i % i S2 j % i S3 k (jest to wektor jednostkowy osi x S układu współrzędnych płaszczyzny rzutowania) oraz przechodzą przez lewy górny narożnik okna (płaszczyzna górna) i prawy dolny narożnik okna (płaszczyzna dolna), tj. punkty L i R o współrzędnych odpowiednio (l 1, l 2, l 3 ) i (r 1, r 2, r 3 ) (w układzie kartezjańskim świata rzeczywistego ), a płaszczyzny lewa i prawa są równoległe do wektorów u i j S oraz też przechodzą przez te punkty 1). Otrzymujemy stąd następujące równania: dla płaszczyzny górnej, dla płaszczyzny dolnej, (5.16) (5.17) 1) Określenia płaszczyzna górna, dolna, lewa i prawa są umowne. Z podanych definicji i rys. 56 wynika, że płaszczyzna górna zawiera ścianę L f L d B d B f równoległościanu widoczności, płaszczyzna dolna ścianę A f A d R d R f, płaszczyzna lewa ścianę L f L d A d A f, a płaszczyzna prawa ścianę B f B d R d R f tego równoległościanu.
98 V. Trójwymiarowa reprezentacja przestrzeni widoczności (5.18) dla płaszczyzny lewej oraz (5.19) dla płaszczyzny prawej. Wartości i Sk i j Sk (k '1, 2, 3), występujące w równaniach (5.16) (5.19), należy wyznaczyć na podstawie wzorów (5.9). Jeżeli współrzędne lewego górnego i prawego dolnego narożnika okna, tj. (l 1, l 2, l 3 ) i (r 1, r 2, r 3 ), są dane w układzie współrzędnych płaszczyzny rzutowania, to ich współrzędne w układzie kartezjańskim świata rzeczywistego można otrzymać za pomocą przekształcenia określonego wzorem (5.13). W celu wyznaczenia równań bocznych płaszczyzn ograniczających w rzucie perspektywicznym, oznaczmy przez CL wektor równoległy do prostej łączącej środek rzutowania z lewym górnym narożnikiem okna, a przez CR z jego prawym dolnym narożnikiem. Wektory te mają współrzędne (w układzie kartezjańskim świata rzeczywistego ): gdzie (a, b, c) oznaczają współrzędne środka rzutowania (punktu C). W rzucie perspektywicznym płaszczyzna górnej ściany ostrosłupa widzenia jest równoległa do wektorów CL i i S oraz przechodzi przez punkt L, płaszczyzna ściany dolnej jest równoległa do wektorów CR i i S oraz przechodzi przez punkt R, płaszczyzna ściany lewej jest równoległa do wektorów CL i j S oraz przechodzi przez punkt L, a płaszczyzna ściany prawej jest równoległa do wektorów CR i j S oraz przechodzi przez punkt R 1). Warunki te pozwalają napisać równania płaszczyzn. Mamy: dla płaszczyzny górnej, dla płaszczyzny dolnej, (5.20) (5.21) 1) Zgodnie z podanymi określeniami płaszczyzn i rys. 57, płaszczyzna górna zawiera ścianę L f L d B d B f ostrosłupa widoczności, płaszczyzna dolna ścianę A f A d R d R f, płaszczyzna lewa ścianę L f L d A d A f, a płaszczyzna prawa ścianę B f B d R d R f tego ostrosłupa.
5.2. Obcinanie 99 dla płaszczyzny lewej oraz (5.22) (5.23) dla płaszczyzny prawej, gdzie i Sk i j Sk oznaczają składowe wektorów i S i j S (zob. (6.9)). Rozważmy teraz problem znajdowania punktu przecięcia odcinka z płaszczyzną. Niech wektorem normalnym płaszczyzny będzie wektor m ' m 1 i % m 2 j % m 3 k i niech przechodzi ona przez pewien punkt Q o współrzędnych (q 1, q 2, q 3 ), a końcami odcinka niech będą punkty P 1 i P 2 (P 1 P 2 ) o współrzędnych odpowiednio (x 1, y 1, z 1 ) i (x 2, y 2, z 2 ). Równanie płaszczyzny ma postać a równaniami parametrycznymi prostej przechodzącej przez punkty P 1 i P 2 są Po podstawieniu zależności (5.25) do równania (5.24) otrzymujemy (5.24) (5.25) Rozwiązanie powyższego równania względem parametru t daje jego wartość t I w punkcie przecięcia: i po podstawieniu do zależności (5.25) otrzymujemy współrzędne (x I, y I, z I ) punktu przecięcia I prostej (danej równaniami (5.25)) z płaszczyzną (określoną równaniem (5.24)): (5.26) Jeśli 0 # t I # 1, to punkt przecięcia I jest punktem odcinka P 1 P 2. W celu określenia, po której stronie płaszczyzny (5.24) leży dany punkt P o współrzędnych (x, y, z), wprowadźmy pomocniczą funkcję skalarną f(p) określoną wzorem (5.27) Mówimy, że dwa punkty P i leżą po tej samej stronie płaszczyzny (5.24), gdy przy czym przyjmujemy sgn " ' 1 dla " > 0 i sgn " ' 0 w przeciwnym przypadku. Niech f P, f T, f G, f D, f L i f R oznaczają funkcje postaci (5.27), odpowiadające płaszczyznom odpowiednio: przedniej, tylnej, górnej, dolnej, lewej i prawej równoległościanu obcięcia (por. wzory (5.14) (5.19)) lub ściętego ostrosłupa obcięcia (por. wzory (5.14) (5.15) oraz (5.20) (5.23)). Niech, jak poprzednio, L oznacza lewy górny, a R prawy dolny narożnik okna, a P f i P d
100 V. Trójwymiarowa reprezentacja przedmiotu w polu widoczności punkty odniesienia odpowiednio przedniej i tylnej płaszczyzny ograniczającej. Punkt P leży wewnątrz wielościanu obcięcia (równoległościanu lub ściętego ostrosłupa czworokątnego), gdy jednocześnie są spełnione wszystkie następujące warunki:! punkty P i L leżą po tej samej stronie dolnej i prawej płaszczyzny ograniczającej,! punkty P i R leżą po tej samej stronie górnej i lewej płaszczyzny ograniczającej,! punkty P i P d leżą po tej samej stronie przedniej płaszczyzny ograniczającej,! punkty P i P f leżą po tej samej stronie tylnej płaszczyzny ograniczającej, tj. gdy jednocześnie są spełnione równania: (5.28) Jeśli któreś z równań (5.28) nie jest spełnione, to punkt P leży na zewnątrz wielościanu obcięcia. Trójwymiarowa wersja algorytmu obcinania Cohena-Sutherlanda (zob. p. 2.2.1) opiera się na spostrzeżeniu, że wielościan widoczności (równoległościan lub ścięty ostrosłup) dzieli przestrzeń na sześć (nierozłącznych) obszarów plus wnętrze wielościanu. Dlatego do określenia, czy punkt P o współrzędnych (x, y, z) leży wewnątrz wielościanu obcięcia, stosuje się w niej kod sześciobitowy, tj. Używając dla płaszczyzn zawierających ściany wielościanu widoczności określeń płaszczyzna przednia, tylna, górna, dolna, lewa i prawa (zgodnie z definicjami podanymi bliżej), poszczególnym bitom tego kodu nadaje się następujące wartości: b 1 ' 1, gdy punkt P znajduje się nad wielościanem widoczności, tj. b 2 ' 1, gdy punkt P znajduje się pod wielościanem widoczności, tj. b 3 ' 1, gdy punkt P jest położony z prawej strony wielościanu widoczności, czyli b 4 ' 1, gdy punkt P jest położony z lewej strony wielościanu widoczności, czyli b 5 ' 1, gdy punkt P znajduje się za wielościanem widoczności, tj. b 6 ' 1, gdy punkt P jest położony przed wielościanem widoczności, tj.
5.3. Kanoniczne wielościany widoczności 101 przy czym f P, f T, f G, f D, f L i f R oznaczają funkcje postaci (5.27), odpowiadające płaszczyznom odpowiednio przedniej, tylnej, górnej, dolnej, lewej i prawej równoległościanu obcięcia. W przypadkach przeciwnych do podanych wyżej odpowiednim bitom przypisuje się wartość 0. Odcinek P 1 P 2 leży wewnątrz wielościanu obcięcia, gdy Jeśli wynik operacji koniunkcji (and) na kodach końców odcinka jest różny od 000000, czyli to cały odcinek leży na zewnątrz wielościanu obcięcia.wreszcie, gdy to odcinek P 1 P 2 uznaje się za kandydata do obcięcia, co oznacza, że część odcinka może (ale nie musi) zawierać się w wielościanie obcięcia (por. opis algorytmu Cohena-Sutherlanda w p. 2.2.1). 5.3. Kanoniczne wielościany widoczności Zastosowanie kanonicznych wielościanów widoczności pozwala na znaczne uproszczenie algorytmów obcinania. W przypadku rzutu równoległego kanonicznym wielościanem widoczności, zwanym kanonicznym równoległościanem widoczności, jest sześcian jednostkowy, którego ściany określają płaszczyzny x ' 0, x ' 1, y ' 0, y ' 1, z ' 0 i z ' 1 (zob. rys. 58). Kanonicznym ostrosłupem widoczności (rozważanym przy rzucie perspektywicznym) jest ścięty ostrosłup o ścianach określonych płaszczyznami x ' z, x ' &z, y ' z, y ' &z, z ' z f i z ' 1 (zob. rys. 59), przy czym wielkość z f należy wyznaczyć (zob. dalej). Użycie kanonicznych wielościanów widoczności wymaga przekształcenia do nich danych wielościanów widoczności. Odpowiednie przekształcenia składają się ze złożenia kilku przekształceń układu współrzędnych świata rzeczywistego. Rys. 58. Kanoniczny równoległościan widoczności
102 V. Trójwymiarowa reprezentacja przedmiotu w polu widoczności Rys. 59. Kanoniczny ostrosłup widoczności Rozważmy najpierw rzut równoległy, tj. przekształcenie równoległościanu widoczności (zob. rys. 56) do jego kanonicznej postaci. Pierwszym elementem tego przekształcenia jest przesunięcie początku O układu współrzędnych Oxyz do punktu odniesienia S płaszczyzny rzutowania, który jest początkiem układu współrzędnych płaszczyzny rzutowania. We współrzędnych jednorodnych przesunięcie to określa macierz dana wzorem (3.2), gdzie s ' x 0 i % y 0 j % z 0 k. Oznaczmy otrzymany układ współrzędnych przez. Wektorami jednostkowymi osi współrzędnych tego układu są, podobnie jak układu Oxyz, wektory i, j oraz k. Druga transformacja polega na przekształceniu wektora normalnego n płaszczyzny rzutowania na wektor prostopadły do płaszczyzny xy o kierunku zgodnym z dodatnim kierunkiem osi z (wektor ten jest równoległy do wektora k i ma ten sam zwrot). Transformację tę określa macierz A n dana wzorem (3.54). W jej wyniku oś z S układu współrzędnych płaszczyzny rzutowania pokryje się z osią, a wektory i S oraz j S zostaną zamienione odpowiednio na oraz. Następnie wykonujemy obrót wokół osi o kąt 2 pomiędzy wektorami i oraz. Kąt ten możemy wyznaczyć na podstawie następujących wzorów: gdzie oraz oznaczają odpowiednie składowe wektora. We współrzędnych jednorodnych macierz obrotu jest określona wzorem (3.30). Po tym obrocie pierwotny układ współrzędnych jest już przekształcony do układu współrzędnych płaszczyzny rzutowania. Po wykonanych przekształceniach nowe położenie wektora rzutowania u można wyznaczyć z zależności
5.3. Kanoniczne wielościany widoczności 103 Oznaczmy składowe wektora przez, oraz. Równoległościan widoczności jest pochyły wzdłuż prostej o kierunku wektora. W celu jego przekształcenia w prostopadłościan, do którego ścian przedniej i tylnej będzie prostopadła oś z, należy kierunek wektora przekształcić na kierunek osi z, tj. kierunek wektora k. Macierz tego przekształcenia (we współrzędnych jednorodnych) ma postać (5.29) Dotychczas wykonane przekształcenia układu współrzędnych spowodowały, że lewy górny i prawy dolny narożnik okna, tj. punkty L i R o współrzędnych (w układzie płaszczyzny rzutowania) odpowiednio (x S,min, y S,min ) i (x S,max, y S,max ), w nowym układzie będą miały współrzędne (x S,min, y S,min, 0) i (x S,max, y S,max, 0), a płaszczyzna przednia i tylna powstałego prostopadłościanu będą odległe od płaszczyzny xy odpowiednio o f i d. Oznacza to, że prostopadłościan jest ograniczony przez nierówności Punkt prostopadłościanu widoczności ma zatem współrzędne (x S,min, y S,min, f). Aby był on początkiem układu współrzędnych, należy wykonać przesunięcie określone macierzą (3.2), w którym p ' x S,min i % y S,min j % fk. Ostatnie przekształcenie, które należy wykonać, polega na przeskalowaniu prostopadłościanu widoczności do jednostkowego sześcianu. Skalowanie to określa macierz dana wzorem (3.15), w której Całe przekształcenie, które równoległościan widoczności doprowadza do postaci kanonicznej, opisuje zatem następujący wzór: (5.30) W przypadku rzutu perspektywicznego przekształcenie ściętego ostrosłupa widoczności do ostrosłupa kanonicznego jest także wykonywane w kilku etapach. Najpierw początek prosto-
104 V. Trójwymiarowa reprezentacja przedmiotu w polu widoczności kątnego układu współrzędnych Oxyz jest przesuwany do środka rzutowania, tj. punktu C (zob. rys. 57). We współrzędnych jednorodnych przesunięcie to określa macierz dana wzorem (3.2), gdzie c ' ai % bj % ck. Następnie, podobnie jak w przypadku rzutu równoległego, przekształcamy wektor normalny n płaszczyzny rzutowania na wektor prostopadły do płaszczyzny xy o kierunku zgodnym z dodatnim kierunkiem osi z (transformację tę określa macierz A n zob. wzór (3.54)), po czym obracamy powstały wektor tak, by pokrył się z wektorem i (obrót określa macierz dana wzorem (3.30), gdzie kąt 2 oblicza się w taki sam sposób, jak przy rzucie równoległym). Ścięty ostrosłup powstały w wyniku powyższych przekształceń charakteryzuje się tym, że do jego ściany przedniej i tylnej jest prostopadła prosta przechodząca przez środek przekształconego okna i początek układu współrzędnych, będący zarazem (po wykonanych przekształceniach) środkiem rzutowania (zob. rys. 59). Oznaczmy przez W środek okna, a przez w wektor łączący z nim środek rzutowania. W układzie współrzędnych płaszczyzny rzutowania punkt W ma współrzędne, które za pomocą przekształcenia (5.13) mogą być zmienione na współrzędne w układzie Oxyz. Ponieważ znane są współrzędne środka rzutowania C, więc wyznaczenie w tym układzie składowych wektora w nie jest trudne. W wyniku wykonanych przekształceń wektor w zmieni się jednak w wektor, przy czym Jeśli osią ostrosłupa ma być oś z, to należy wykonać przekształcenie określone macierzą (5.31) Po wykonaniu tego przekształcenia okno (na płaszczyźnie rzutowania) znajduje się w odległości od środka rzutowania, przez jego środek przechodzi oś z, a punkty L i R mają w nowym układzie współrzędne odpowiednio i, gdzie l ' x S,max & x S,min i h ' y S,max & y S,min oznaczają długość i szerokość okna. Przednia ściana ostrosłupa znajduje się w odległości od środka rzutowania, a tylna w odległości od niego. W celu przekształcenia powstałego ostrosłupa do postaci kanonicznej wykonujemy najpierw skalowanie w kierunku osi z, które tylną płaszczyznę ograniczającą przekształci w płaszczyznę z ' 1. Skalowanie to opisuje macierz
5.3. Kanoniczne wielościany widoczności 105 (5.32) W wyniku tego przekształcenia punkty i zostaną przekształcone w punkty i o współrzędnych odpowiednio i. Z kolei, aby punkty i zostały przekształcone na punkty i o współrzędnych odpowiednio i, tj. aby okno było ograniczone przez płaszczyzny x ' z, x ' &z, y ' z i y ' &z, należy wykonać przekształcenie określone macierzą (5.33) Macierzą przekształcenia złożonego z przekształceń (5.32) i (5.33) jest (5.34) Zauważmy, że zastosowanie powyższego przekształcenia do środka ściany przedniej ostrosłupa widoczności, otrzymanego po przekształceniu (5.31) (punkt ten ma współrzędne (0, 0, )), pozwala określić poszukiwaną wielkość z f (odległość przedniej płaszczyzny ograniczającej kanonicznego ostrosłupa widoczności od środka rzutowania). Otrzymamy
106 V. Trójwymiarowa reprezentacja przedmiotu w polu widoczności Na podstawie przeprowadzonych rozważań całe przekształcenie sprowadzające ostrosłup widoczności do postaci kanonicznej można zapisać (we współrzędnych jednorodnych) za pomocą następującego wzoru: (5.35) Jak już wspomnieliśmy, zastosowanie kanonicznych wielościanów widoczności pozwala uprościć algorytmy obcinania. W przypadku algorytmu Cohena-Sutherlanda i kanonicznego równoległościanu widoczności, sześciobitowy kod b 6 b 5 b 4 b 3 b 2 b 1 punktu P o współrzędnych (x, y, z), określający jego położenie, definiuje się następująco: (5.36) przy czym, jak poprzednio, sgn a ' 1 dla a > 0 i sgn a ' 0 w przeciwnym przypadku. Dla kanonicznego ostrosłupa widoczności kod punktu określa się na podstawie wzorów: (5.37) 5.4. Zasady konstruowania obrazu trójwymiarowego Konstruowanie na ekranie trójwymiarowego obrazu obiektu świata rzeczywistego jest procesem złożonym i przebiega w kilku etapach. W tym punkcie podajemy ogólne zasady tego procesu, bez rozważania problemów usuwania niewidocznych linii i powierzchni (rozdział 8) oraz cieniowania (rozdział 9). Z uwagi na pewne różnice oddzielnie opisujemy przypadki ogólnych i kanonicznych wielościanów widoczności. Pierwszym etapem jest obcięcie obiektu do odpowiedniego wielościanu widoczności. W przypadku ogólnych wielościanów widoczności (równoległościanu lub ostrosłupa zob. p. 5.2), po wykonaniu względem nich obcięcia, powinniśmy zrzutować otrzymany obiekt na płaszczyznę rzutowania (ściślej: na jej okno). Dla równoległościanu widoczności rzut ten jest rzutem nieortogonalnym opisanym w p. 4.3.2, a dla ostrosłupa widoczności rzutem perspektywicznym opisanym w p. 4.2. Otrzymaną zawartość okna należy następnie przekształcić do układu współrzędnych ekranu. Odpowiednie transformacje są opisane w p. 2.1, przy czym obecnie należy uwzględnić fakt, że za układ współrzędnych płaszczyzny rzutowania został przyjęty układ prawoskrętny (w p. 2.1 są opisane transformacje okna z układu lewoskrętnego). Oznacza to, że na przykład wzory (2.2) (2.4), które przekształcają okno na całą powierzchnię ekranu, powinny mieć obecnie postać
5.4. Zasady konstruowania obrazu trójwymiarowego 107 gdzie (x S,min, y S,min ) i (x S,max, y S,max ) oznaczają współrzędne (w układzie Ox S y S współrzędnych płaszczyzny rzutowania) odpowiednio lewego górnego i prawego dolnego narożnika okna, tj. punktów L i R (zob. rys. 55 na str. 94), a Round oznacza funkcję wykonującą zaokrąglenie do liczby całkowitej. Jeśli rozważamy kanoniczne wielościany obcięcia (zob. p. 5.3), to przed obcięciem niezbędna jest transformacja obiektu z układu współrzędnych świata rzeczywistego do układu współrzędnych znormalizowanych. Transformację tę określa zależność (5.30) (w przypadku kanonicznego równoległościanu widoczności) lub (5.35) (dla kanonicznego ostrosłupa widoczności). Po wykonaniu obcięcia obiektu (za pomocą algorytmu Cohena-Sutherlanda lub Sutherlanda- Hodgmana) należy otrzymany obraz zrzutować na okno płaszczyzny rzutowania. Ponieważ w przypadku kanonicznego równoległościanu widoczności po wykonanych przekształceniach płaszczyzna rzutowania jest równoległa do płaszczyzny xy, więc rozważany rzut jest rzutem ortogonalnym opisanym w p. 4.3.1. Ostatnie przekształcenie polega na przeniesieniu zawartości okna płaszczyzny rzutowania (lewym górnym narożnikiem tego okna jest punkt o współrzędnych (0, 0), a prawym dolnym narożnikiem punkt (1, 1)) na ekran. Dla kanonicznego ostrosłupa widoczności płaszczyzną rzutowania jest płaszczyzna gdzie d oznacza odległość tylnej płaszczyzny rzutowania od środka rzutowania, a oznacza składową wektora zdefiniowanego na str. 104. Rzut na tę płaszczyznę określa (we współrzędnych jednorodnych) macierz
108 V. Trójwymiarowa reprezentacja przedmiotu w polu widoczności Współrzędne lewego górnego i prawego dolnego narożnika okna są w tym przypadku równe odpowiednio i. Okno to powinno zostać odwzorowane do okna we współrzędnych ekranu.