to get the file
Transkrypt
to get the file
Grafika komputerowa 2D/3D Instrukcja laboratoryjna Temat: Rzutowanie równoległe i perspektywiczne, 6 bufor głębokości Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny Monitory (z pominięciem prawdziwych monitorów 3D) pozwalają jedynie na wyświetlanie obrazów dwuwymiarowych, co jest bardzo dużym utrudnieniem w przypadku gdy chcemy pokazać na nich obraz trójwymiarowy. Jedynym rozwiązaniem jest zastosowanie rzutowania przestrzeni 3D na 2D, w sposób zachowujący „przestrzenność” brył. Najczęściej wykorzystuje się rzutowanie równoległe lub perspektywiczne. 1.1 Rzutowanie równoległe Rzutowanie równoległe jest najprostszym typem rzutowania, zachowuje wszystkie równoległości prostych, kąty i wymiary. Wszystkie proste rzutowania mają ten sam, ustalony kierunek. Z tego powodu rzutowanie to sprowadza się najczęściej do usunięcia współrzędnych jednej z osi (najczęściej osi Z). Wykorzystywane jest głównie w rysunku technicznym. Przykład: 1/3 1.2 Rzutowanie perspektywiczne Rzutowanie perspektywiczne jest nieco trudniejsze do zaimplementowania, jednak jego wyniki są zbliżone do tego, co widzimy własnym okiem – obraz jest bardziej realistyczny i posiada wrażenie głębi (obiekty na dalszym planie są mniejsze). Przy rzutowaniu wzdłuż osi Z współrzędne punktów na ekranie można wyznaczyć za pomocą poniższych wzorów: d x '=x⋅ , z+ d y '= y⋅ d z+ d gdzie: x, y, z – współrzędne punktu w przestrzeni 3D x', y' – współrzędne na ekranie (2D) d – odległość od obserwatora (przy założeniu, że znajduje się on na osi Z) Przykład: 2/3 1.3 Z-bufor Podczas wyświetlania wielu obiektów trójwymiarowych należy pamiętać o tym, aby elementy znajdujące się dalej nie przesłaniały bliższych. Sytuacja ta może wystąpić, gdy najpierw narysujemy obiekt znajdujący się na pierwszym planie, a następnie obiekt z tła: z Widok od przodu daleko blisko Widok z boku Jedną z metod częściowego wyeliminowania tego problemu jest posortowanie wszystkich obiektów względem głębokości (najczęściej osi Z). Jednak istnieje kilka przypadków, w których mogą wystąpić przekłamania, jednym z nich może być sytuacja, gdy ściany nie są równoległe do siebie i prostopadłe do osi Z. Innym, znacznie lepszym algorytmem jest tzw. bufor głębokości (Z-bufor), realizowany np. w postaci tablicy dwuwymiarowej. W uproszczeniu polega on na zapamiętywaniu głębokości (czyli np. współrzędnej Z) aktualnie rysowanego piksela figury. W przypadku, gdy później w tym samym miejscu rysowana jest kolejna figura, sprawdzana jest zapamiętana głębokość. Jeśli jest ona mniejsza, piksel nie jest rysowany. Wskazówka do rysowania wypełnionych łamanych/ wielokątów można użyć funkcji polygon(), przykład: // poszczególne wierzchołki: int points[12] = { 50, 50, 100, 100, 100, 150, 50, 200, 0, 150, 0, 100 }; ... clear_to_color(screen, makecol(255, 255, 255)); // czyszczenie ekranu polygon(screen, 6, points, makecol(0, 0, 0)); // rysowanie 3/3