Wizualizacja 3D
Transkrypt
Wizualizacja 3D
Wizualizacja 3D Światło • W OpenGL można rozróżnić 3 rodzaje światła – Światło otaczające (ambient light) – równomiernie oświetla wszystkie elementy sceny, nie pochodzi z żadnego konkretnego kierunku – Światło rozproszone (diffuse light) – pada na obiekt z określonego kierunku, ale jest na nim rozpraszane we wszystkich kierunkach – Światło odbite (specular light) – światło kierunkowe. Pada na obiekt z określonego kierunku i odbijane jest w konkretnym kierunku Włączenie oświetlenia • Oświetlenie w OpenGL włącza się poleceniem glEnable(GL_LIGHTING) • Dodatkowo zalecane jest stosowanie bufora głębokości. Wyłączenie: glDisable(GL_LIGHTING) • OpenGL posiada min. 8 źródeł światła, oznaczonych GL_LIGHT0, GL_LIGHT1, … GL_LIGHT7. Pozostałe (w zależności od implementacji) można uzyskać poprzez zapis GL_LIGHT0+i, gdzie i to numer światła. Można sprawdzić ile dana implementacja posiada źródeł światła poprzez funkcję glGetIntegerv z parametrem GL_MAX_LIGHTS. • • Poszczególne źródła światła włącza się poleceniem: glEnable(GL_LIGHT0) • Wyłącza poprzez polecenie glDisable(..) Przykład Parametry źródeł światła • • • Każde źródło światła może być modyfikowane niezależnie od innych poleceniem glLight. Są dwie wersje funkcji glLight. Pierwsza umożliwia zmianę tylko jednego parametru, druga wielu naraz poprzez przekazanie tablicy. Zmianę jednego parametru umożliwia jedna z funkcji void glLightf (GLenum light, GLenum pname, GLfloat param) void glLighti (GLenum light, GLenum pname, GLint param) • Zmianę wielu parametrów naraz umożliwiają funkcje void glLightfv (GLenum light, GLenum pname, const GLfloat *params) void glLightiv (GLenum light, GLenum pname, const GLint *params) • • • gdzie params jest wskaźnikiem na tablicy (w praktyce pisze się tutaj nazwę tablicy), param jest wartością pojedynczego parametru, light jest numerem światła, np. GL_LIGHT1, pname to parametr, który jest modyfikowany (następny slajd) Parametry źródeł światła cd. • • • • GL_AMBIENT - wartości składowych RGBA światła otaczającego, GL_DIFFUSE - wartości składowych RGBA światła rozproszonego, GL_SPECULAR - wartości składowych RGBA światła odbitego, GL_POSITION - czteroelementowy wektor (x, y, z, w), którego interpretacja zależy od wartości w; – wartość 1, oznacza, że trzy pierwsze współrzędne wektora określają położenie źródła światła; – wartość 0, oznacza, że źródło światła jest światłem kierunkowym, a jego promienie padają w kierunku zdefiniowanym przez trzy pierwsze współrzędne wektora, • GL_SPOT_DIRECTION - znormalizowany (długości 1) trójwspółrzedny wektor określający kierunek reflektora, • GL_SPOT_EXPONENT - wykładnik tłumienia kątowego reflektora; dopuszczalne są wartości z przedziału [0, 128]. Opisuje „ściemnianie” światła od centrum na zewnątrz reflektora (funkcja cosinus). Parametry światła • GL_SPOT_CUTOFF - kat odcięcia reflektora; dopuszczalne są wartości z przedziału [0, 90] oraz 180. Dla wartości 180 światło rozchodzi się równomiernie w całej przestrzeni. • GL_CONSTANT_ATTENUATION - stały współczynnik tłumienia światła, • GL_LINEAR_ATTENUATION - liniowy współczynnik tłumienia światła, • GL_QUADRATIC_ATTENUATION - kwadratowy współczynnik tłumienia światła. Parametry domyślne dla GL_LIGHT0 • • • • • • • • • • GL_AMBIENT (0,0,0,1) GL_DIFFUSE (1,1,1,1) GL_SPECULAR (1,1,1,1) GL_POSITION (0,0,1,0) GL_SPOT_DIRECTION (0,0,-1) GL_SPOT_EXPONENT 0 GL_SPOT_CUTOFF 180 GL_CONSTANT_ATTENUATION 1 GL_LINEAR_ATTENUATION 0 GL_QUADRATIC_ATTENUATION 0 Światło GL LIGHT0 jest światłem białym kierunkowym położonym w punkcie o współrzędnych (0, 0, 1). Światło skierowane jest zgodnie z kierunkiem wyznaczonym przez wektor o współrzędnych [0, 0,−1]. Pomimo kierunkowego charakteru stożek światła GL_LIGHT0 nie jest w żaden sposób ograniczony (parametr GL_SPOT_CUTOFF ma wartość 180) i światło rozchodzi się każdym kierunku. Przy domyślnych początkowych ustawieniach układu współrzędnych oraz bryły odcinania źródło światła GL_LIGHT0 znajduje się na środku płaszczyzny monitora (okna) i jest skierowane prostopadle w głąb monitora. Parametry domyślne dla GL_LIGHT1-GL_LIGHT7 • • • • • • • • • • GL_AMBIENT (0,0,0,1) GL_DIFFUSE (0,0,0,1) GL_SPECULAR (0,0,0,1) GL_POSITION (0,0,1,0) GL_SPOT_DIRECTION (0,0,-1) GL_SPOT_EXPONENT 0 GL_SPOT_CUTOFF 180 GL_CONSTANT_ATTENUATION 1 GL_LINEAR_ATTENUATION 0 GL_QUADRATIC_ATTENUATION 0 Źródła światła GL_LIGHT1 – GL_LIGHT7 różnią się do światła GL_LIGHT0 tylko barwą światła rozproszonego i odbitego. Przykład Oświetlenie • Uwaga! Wartość oświetlenia powierzchni wyliczana jest na podstawie wierzchołków Parametry modelu oświetlenia • Do definiowania modelu oświetlenia stosuje się funkcje grupy glLightModel void glLightModelf (GLenum pname, GLfloat param) void glLightModeli (GLenum pname, GLint param) void glLightModelfv (GLenum pname, const GLfloat *params) void glLightModeliv (GLenum pname, const GLint *params) • Funkcje te podobnie jak glLight występują w dwóch wersjach różniących się przekazywaniem parametrów • Parametr pname określa właściwość modelu oświetlenia, • Param – wartość nadawana danej właściwości Właściwości modelu oświetlenia • GL_LIGHT_MODEL_LOCAL_VIEWER - określa sposób liczenia kąta przy odbiciu. Dokładnie w kierunku kamery (1) lub w sposób uproszczony, ale szybszy, w kierunku osi z (0). • GL_LIGHT_MODEL_TWO_SIDE - określa strony wielokątów, które będą brane pod uwagę przy wyliczaniu oświetlenia: przednia i tylna (1) lub tylko przednia (0). • GL_LIGHT_MODEL_AMBIENT - ustala parametry światła otoczenia, które jest obecne nawet pod nieobecność innych źródeł światła. Początkowo ustawione jest dość ciemne światło: (2/10, 2/10, 2/10, 1) • GL_LIGHT_MODEL_COLOR_CONTROL - parametr istotny dopiero przy nakładaniu tekstur. Kontroluje sposób mieszania oświetlenia z teksturą (czy najpierw tekstura później oświetlenie, czy oba na raz). Właściwości modelu oświetlenia • GL_LIGHT_MODEL_LOCAL_VIEWER - 0 • GL_LIGHT_MODEL_TWO_SIDE - 0 • GL_LIGHT_MODEL_AMBIENT (2/10, 2/10, 2/10, 1) • GL_LIGHT_MODEL_COLOR_CONTROL GL_SINGLE_COLOR Materiały • Modyfikowanie właściwości materiałów umożliwiają funkcje z grupy glMaterial. Funkcje występują w dwóch wersjach różniących się sposobem przekazywania parametrów. void glMaterialf (GLenum face, GLenum pname, GLfloat para) void glMateriali (GLenum face, GLenum pname, GLint para) void glMaterialfv (GLenum face, GLenum pname, const GLfloat *params) void glMaterialiv (GLenum face, GLenum pname, const GLint *params) • face ustala, która stronę wielokąta dotyczy modyfikowany parametr. – GL_FRONT – przednia strona wielokąta, – GL_BACK - tylna strona wielokąta – GL_FRONT_AND_BACK - obie strony wielokąta. • pname określa zmieniana wartość parametru materiału. Parametry materiału • • • • • • • GL_AMBIENT - składowe RGBA określające stopień odbicia światła otaczającego, GL_DIFFUSE - składowe RGBA określające stopień rozproszenia światła rozproszonego, GL_AMBIENT_AND_DIFFUSE - składowe RGBA określające jednocześnie stopień odbicia światła otaczającego i stopień rozproszenia światła rozproszonego GL_SPECULAR - składowe RGBA określające stopień odbicia światła odbitego, GL_SHININESS - stała z przedziału [0, 128] określająca wykładnik odbłysku światła (ang. specular exponent) czyli regulacje stopnia występowania efektu rozbłysku obiektu; im większa wartość parametru, tym większe skupienie rozbłysku światła na obiekcie, GL_EMISSION - składowe RGBA światła emitowanego przez obiekt; taki obiekt nie staje się źródłem światła i nie oświetla innych obiektów sceny, wymaga to także utworzenia źródła światła, GL_COLOR_INDEXES - w indeksowym trybie kolorów trzy indeksy do tablicy kolorów określające kolejno składowe RGBA określające reakcje na światło otaczające, rozproszone i odbite. Parametry materiału Parametry domyślne • GL_AMBIENT – (2/10, 2/10, 2/10, 1), • GL_DIFFUSE – (8/10, 8/10, 8/10, 1), • GL_AMBIENT_AND_DIFFUSE • GL_SPECULAR – (0,0,0,1), • GL_SHININESS - 0 • GL_EMISSION – (0,0,0,1), • GL_COLOR_INDEXES (0,1,1) Materiały • Przykładowe parametry Chrom Złoto Czarny plastik GL_AMBIENT 0.25, 0.25, 0.25 0.25, 0.2, 0.07 0.0, 0.0, 0.0 GL_DIFFUSE 0.4, 0.4, 0.4 0.75, 0.61, 0.23 0.01, 0.01, 0.01 GL_SPECULAR 0.77, 0.77, 0.77 0.63, 0.56, 0.37 0.5, 0.5, 0.5 GL_SHININESS 76.8 52.2 32.0 Śledzenie kolorów • Możliwe jest definiowanie parametrów materiałów na podstawie kolorów wierzchołków określanych przy pomocy funkcji z grupy glColor. Wybór parametrów materiału, które będą określane poprzez kolory wierzchołków, określa funkcja: void glColorMaterial (GLenum face, GLenum mode) • • • • Parametr face ustala, która stronę wielokąta dotyczy modyfikowany parametr. Dopuszczalne są GL_FRONT, GL_BACK, GL_FRONT_AND_BACK. Wartością domyślną jest GL_FRONT_AND_BACK. Parametr mode wskazuje, która z właściwości materiału ma być definiowana zgodnie z bieżącym kolorem wierzchołka. Dopuszczalne są niemal wszystkie opisane wcześniej własności materiałów: GL_EMISSION, GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR i GL_AMBIENT_AND_DIFFUSE. Wartością domyślną jest GL_AMBIENT_AND_DIFFUSE. Przed użyciem funkcji glColorMaterial trzeba wywołać funkcje glEnable z parametrem GL_COLOR_MATERIAL Wektory normalne • Wektor normalny do danej powierzchni jest do niej prostopadły w określonym punkcie. Wykorzystywaliśmy pojęcie wektora normalnego w modelu obliczania natężenia światła odbitego. • W OpenGL, gdzie powierzchnie reprezentowane są przez siatki wielokątów wektor normalny może być stowarzyszony z wielokątem (jest to wtedy rzeczywista normalna w sensie matematycznym) glNormal3f( nx, ny, nz); glBegin( GL_TRIANGLES); glVertex3fv( v1); glVetrex3fv( v2); glVertex3fv( v3); glEnd(); • Załóżmy, że trójkąt opisany jest wierzchołkami A, B i C. Wtedy określamy wektory v i w: v = [ Bx-Ax, By-Ay, Bz-Az ] w = [ Cx-Ax, Cy-Ay, Cz-Az ] • Wektor normalny n obliczamy jako v*w, czyli: n = [ vy*wz-vz*wy, vz*wx-vx*wz, vx*wy-vy*wx ] • OpenGL korzysta z wektorów normalnych jednostkowych, czyli o długości równej 1. Obliczony wyżej wektor n należy jeszcze znormalizować, to znaczy każdą jego współrzędną podzielić przez długość wektora (oznaczmy ją jako d): d = sqrt(nx2+ny2+nz2) n = [ nx/d, ny/d, nz/d ] Obliczanie oświetlenia w OpenGL 1. Wyznaczamy wektory normalne w każdym wierzchołku każdego obiektu. 2. Definiujemy źródła światła 3. Definiujemy model oświetlenia 4. Definiujemy własności materiałowe obiektów na scenie Przykłady