21 (369)











Algorytm linii zasłoniętej(ukrywania niewidocznych ścian) i 3D Clipping(przycinanie)


Brak algorytmu linii zasłoniętej powoduje, że trójkąty lub inne prymitywy są wyświetlane w kolejności, którą można by nazwać przypadkową, tzn. w kolejności zgodnej z odczytem ich współrzędnych z tablicy w pamięci(oczywiście nie musi być to regułą). Taka kolejność może spowodować że obiekt X będący za obiektem Y zostanie narysowany pierwszy, co spowoduje, że przykryje on obiekt Y, a przecież to obiekt X jest dalej. Dlatego stosuje się algorytm linii zasłoniętej. Najprostszą jego wersją jest sumowanie wszystkich współrzędnych Z prymitywa i zapis ich do pamięci(tablicy). Tablica ta niech będzie strukturą zawierającą dwa elementy typu INT - numer prymitywa, FLOAT - suma współrzędnych Z prymitywa , np.

struct struktura
{
int numer;
float suma_z;
}
Tablicę stworzymy wtedy poniższym kodem:
struktura tablica[30];
(tworzy tablicę dla 30 prymitywów)
Następnie porządkujemy tę tablicę według współrzędnych Z, tzn. od największej do najmniejszej. Teraz spokojnie możemy rozpocząć rysowanie prymitywów w kolejności zgodnej z polem "numer" tej tablicy. Tzn. jako pierwszy prymityw rysujemy ten którego numer zawiera pole "numer" elementu nr. 0 tablicy, jako drugi prymityw ten którego numer zawiera pole "numer" elementu nr. 1 tablicy itd... Spowoduje to narysowanie ścian dalszych(większa suma Z) i "nałożenie" na nie ścian bliższych(mniejsza suma Z). Wadą tego rozwiązania jest powolność, bowiem ściany dalsze, a więc teorytycznie niewidoczne też są rysowane. Istnieje wiele innych algorytmów ukrywania niewidocznych ścian,niektóre z nich możesz poznać tutaj.


Innym bardzo ważnym pojęciem które należy omówić przy algorytmie linii zasłoniętej jest tzw. 3D Clipping(Chyba tak to się pisze?). Jest to jakby blokada, która powoduje, że piksele powyżej określonej współrzędnej Z nie są rysowane. Odpowiedzialny jest za to kod zawarty w procedurze rysującej prymityw. Jego zastosowanie jest logiczne, bowiem owa wartość Z będzie decydować jak "głęboko" będzie mógł spojrzeć obserwator. Przecież gdy mamy bardzo skomplikowaną scenę, a wiele obiektów znajduje się gdzieś daleko i są niewidoczne to najłatwiej uzyskać ich "nie rysowanie" przez zastosowanie tego algorytmu. Dzięki temu uzyskamy znaczne odciążenie mocy akceleratora. I tak w OpenGL głębokość 3D Clippingu pozwala ustawić polecenie gluPerspective[definiuje perspektywiczną bryłę widzenia] o składni:

void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar )
gdzie:

fovy - kąt patrzenia(przez modyfikację tej wartości można uzyskać albo normalny obraz - wartość np. 50, albo perspektywę rybiego oka)
aspect - wartość będąca stosunkiem szerokość/wysokość całego obrazu(np. 640/480 => a to jest równe 1.33333333...)
zNear - wartość współrzędnej Z od której OpenGL ma zacząć rysowanie obiektów(czyli minimalna wartość Z)[UWAGA: Różna od 0]
zFar - maksymalna wartość współrzędnej Z

Ogólnym zadaniem tego rozkazu jest ustawienie parametrów perspektywy oraz wartości zNear oraz zFar dotyczących 3D Clippingu. Umieszcza się je w procedurze inicjującej okno OpenGL

Przy okazji algorytmu linii zasłoniętej włączanego w OpenGL poniższym kodem:
glEnable(GL_DEPTH_TEST);

Wyszukiwarka

Podobne podstrony:
(21 Potencjał zakłócający i anomalie)
980928 21
173 21 (10)
2 21 SPAWANIE MIEDZI I STOPÓW MIEDZI (v4 )
USTAWA z dnia 21 marca 1985 r o drogach publicznych
commercial howto 21
Nyx Password Storage 1 21 readme
21 (206)

więcej podobnych podstron