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

Podobne dokumenty