« poprzedni punkt | następny punkt » |
Obserwując dowolny obiekt nieprzezroczysty zawsze widzimy tylko część jego powierzchni bocznej. Musimy oczywiście uwzględnić ten fakt przy wyświetlaniu obiektu na ekranie. Podobnie, wyświetlając kilka obiektów musimy uwzględniać fakt, że jedne obiekty mogą zasłaniać inne. W celu rozwiązania problemu widoczności opracowano różne algorytmy. Niżej przedstawimy trzy najczęściej stosowane.
Zacznijmy od najprostszego przypadku kiedy mamy do czynienia z pojedynczą wypukłą bryłą, której powierzchnia boczna jest opisana za pomocą wielokątów. Dla każdego wielokąta można wyróżnić stronę wewnętrzną (widzianą przy obserwacji od strony wnętrza bryły) i stronę zewnętrzną (widzianą przy obserwacji bryły z zewnątrz). Można również określić wektor normalny do powierzchni skierowany na zewnątrz bryły. Sprawdzając dla konkretnej ściany bocznej bryły czy jej wektor normalny (a dokładniej składowa z tego wektora) jest skierowany do obserwatora czy w przeciwną stronę, możemy stwierdzić czy ta ściana (wielokąt) jest widoczna. Ilustruje to rysunek X.4. Zwróćmy jeszcze raz uwagę na założenie o wypukłości bryły. W przypadku brył, które nie są wypukłe algorytm może dawać niepoprawne wyniki. Na przykład zielona ścianka z rysunku X.4 przy obserwacji z określonego punktu może zostać zakwalifikowana jako widoczna, podczas gdy faktycznie widoczna będzie tylko część tej ścianki.
![]() |
Rys. X.4. Ilustracja do algorytmu określania widoczności ścianek na podstawie analizy wektorów normalnych. a) Przypadek bryły wypukłej, b) przypadek bryły niewypukłej
Inny algorytm rozwiązywania problemu widoczności powstał w wyniku analizy sposobu tworzenia obrazów przez malarzy, którzy często tworząc obraz zaczynają od namalowania odległego tła, na którym z kolei umieszczają coraz bliższe nieprzezroczyste obiekty. Każdy później umieszczony obiekt przesłania obiekty wcześniej namalowane. Przykład postępowania tego typu pokazano na rysunku X.5.
![]() |
Rys. X.5. Przykład tworzenia obrazu na zasadzie rysowania obiektów w kolejności od najdalszego do najbliższego (z punktu widzenia obserwatora)
W algorytmie malarskim wykorzystywanym w grafice komputerowej wyróżnia się dwie fazy. W pierwszej fazie ustalana jest kolejność w jakiej wielokąty powinny być rysowane a w drugiej fazie ma miejsce faktyczne rysowanie. O ile sposób postępowania w drugiej fazie jest oczywisty, to pierwsza faza może stwarzać pewne kłopoty. Jedno z możliwych podejść do rozwiązania problemu może wyglądać następująco.
Celem jest posortowanie wielokątów występujących w scenie od najdalszego do najbliższego. Wstępne sortowanie można wykonać przyjmując jako podstawę największe wartości współrzędnych z w poszczególnych wielokątach (zakładamy, że współrzędna z jest skierowana od obserwatora w kierunku sceny). Ilustruje to rysunek X.6a. Uzyskana lista niestety nie zawsze daje poprawne rozwiązanie, na przykład ze względu na to, że niektóre wielokąty mogą się przecinać, tak jak na przykład na rysunku X.6b.
![]() |
Rys. X.6. a) Ilustracja metody wstępnego sortowania wielokątów. b) Przykład przecinających się wielokątów
W związku z tym konieczne jest przeprowadzenie weryfikacji poprawności listy. Można to zrobić w następujący sposób. Bierzemy pod uwagę dwa wielokąty, które są na początku listy i sprawdzamy, czy są one we właściwej kolejności z punktu widzenia rysowania na ekranie. Jeżeli tak, to bierzemy do sprawdzenia następną parę wielokątów. Jeżeli nie, to trzeba zamienić ich kolejność. Jeżeli po zamianie okaże się, że kolejność jest poprawna to akceptujemy ją i przechodzimy do analizy następnej pary. Jeżeli jednak i tym razem kolejność nie będzie poprawna, to znaczy, że dwa rozpatrywane wielokąty przecinają się i należy jeden z nich podzielić na dwa (wzdłuż krawędzi przecięcia pierwotnych wielokątów) i umieścić je na liście. Proces należy kontynuować dopóki nie zweryfikuje się całej listy.
Na rysunku X.7 zilustrowano dwa przykładowe testy pozwalające podjąć decyzję o tym czy kolejność umieszczenia pary wielokątów na liście jest poprawna. W pierwszym teście sprawdza się czy zakresy zmian współrzędnej z wyznaczone dla obu wielokątów są rozłączne. Jeżeli tak, to kolejność wielokątów jest poprawna. Jeżeli nie, to należy wykonać inny test, na przykład taki jak na rysunku X.7b. Tym razem sprawdza się, czy zakresy zmian współrzędnych x dla obu wielokątów są rozłączne. Jeżeli tak, to kolejność jest poprawna. Jeżeli nie, to można wykonać kolejne testy (proponuję sformułować samodzielnie jeszcze jeden lub dwa testy).
![]() |
Rys. X.7. Przykładowe testy dla sprawdzania poprawności ustawienia pary wielokątów na liście określającej kolejność wyświetlania wielokątów
Jeszcze inna koncepcja rozwiązywania problemu widoczności jest realizowana w algorytmie z-bufora. Tym razem nie przyjmuje się żadnych założeń co do rodzaju wyświetlanych obiektów ani co do kolejności wyświetlania obiektów. Widoczność obiektów rozstrzyga się dla każdego piksela obrazu niezależnie. Do realizacji algorytmu potrzebna jest dodatkowa pamięć, tak zwany z-bufor, w której można dla każdego piksela zapisać odpowiednią wartość współrzędnej z.
Na początku do pamięci obrazu zapisuje się barwę tła dla wszystkich pikseli obrazu natomiast w z-buforze zapisuje się największą wartość współrzędnej z jaka może wystąpić w scenie (zakładamy, że oś z jest skierowana od obserwatora w kierunku sceny); w szczególności może to być współrzędna z tylnej ściany bryły widzenia. Z kolei, jeżeli analizujemy jakiś wielokąt i trafimy na punkt, który potencjalnie znajdzie się w końcowym obrazie w miejscu piksela o współrzędnych x,y, to sprawdzamy, czy współrzędna z tego punktu jest mniejsza od współrzędnej z zapisanej dotychczas w z-buforze w miejscu o współrzędnych x,y. Jeżeli tak, to rozpatrywany punkt leży bliżej niż punkt sceny, którego barwa została zapisana w pamięci obrazu i zastępujemy dotychczasową barwę piksela x,y barwą rozpatrywanego punktu oraz zmieniamy dotychczasową wartość współrzędnej z wartością współrzędnej z rozpatrywanego punktu. W przeciwnej sytuacji pozostawiamy poprzednią wartość piksela x,y oraz poprzednią wartość współrzędnej z. Sposób postępowania ilustruje rysunek X.8. Proces powtarza się dla wszystkich wielokątów występujących w scenie (w bryle widzenia) i wszystkich punktów tych wielokątów, które potencjalnie mogą być odwzorowane na piksele w pamięci obrazu.
![]() |
Rys. X.8. Ilustracja metody z-bufora. a) Analiza wielokątów sceny, b) zawartość pamięci obrazu i z-bufora w kolejnych krokach. Wielokąty są analizowane w kolejności zielony, niebieski, żółty
« poprzedni punkt | następny punkt » |