10 Programowanie Grafiki Komputerowej
Transkrypt
10 Programowanie Grafiki Komputerowej
Laboratorium nr 10 Instrukcja Laboratoryjna 1/4 Programowanie Grafiki Komputerowej Temat: Krzywe i powierzchnie Béziera 10 Przygotował: mgr inż. Grzegorz Pawiński 1) Krzywe Béziera Krzywe Béziera są krzywymi parametrycznymi. Każda współrzędna krzywej P(x,y,z) jest uzależniona od parametru u ∈[0,1 ] . Krzywa Béziera w postaci parametrycznej { } x u P u= y u z u Krzywa uzależniona jest od punktów kontrolnych. Pierwszy i ostatni wyznaczają jej początek i koniec. Im więcej punktów kontrolnych, tym bardziej skomplikowany kształt krzywej można uzyskać. Ilość punktów kontrolnych wpływa również na stopień wielomianów opisujących krzywą. Ich stopień jest o jeden mniejszy od ilości punktów kontrolnych. Dla czterech punktów kontrolnych o współrzędnych x 0, y 0, z 0 , x 1, y 1, z 1 , x 2, y 2, z 2 , x 3, y 3, z 3 ,funkcje parametryczne wyglądają następująco: x u=1−u3 x 03u1−u2 x 13u 2 1−u x 2u 3 x3 y u=1−u3 y 03u 1−u 2 y 13u 2 1−u y 2 u3 y 3 z u=1−u3 z 03u 1−u2 z 1 3u 2 1−u z 2u 3 z 3 1.1) Wygenerowanie współrzędnych krzywej Béziera Nie ma potrzeby wyznaczania współrzędnych krzywej. Biblioteka OpenGL posiada ewaluatory, służące do generowania: • współrzędnych wierzchołków, • składowych koloru, • współrzędnych wektorów normalnych, • współrzędnych tekstur. Przed skorzystaniem z ewaluatora, należy go najpierw uaktywnić. W tym celu należy wywołać funkcję glEnable() przekazując jej parametr odpowiadający wybranemu ewaluatorowi, np. GL_MAP1_VERTEX_3. Laboratorium nr 10 2/4 Dla krzywych używany jest jednowymiarowy ewaluator: void glMap1f (GLenum target, GLfloat u1,GLfloat u2, GLint stride,GLint order,const GLfloat *points) • • • • Parametr target Znaczenie GL_MAP1_VERTEX_3 współrzedne (x, y, z) punktów krzywej GL_MAP1_VERTEX_4 współrzedne (x, y, z,w) punktów krzywej GL_MAP1_INDEX Indeksy kolorów GL_MAP1_COLOR_4 składowe RGBA kolorów GL_MAP1_NORMAL współrzedne (x, y, z) wektorów normalnych GL_MAP1_TEXTURE_COORD_1 współrzedne s tekstury GL_MAP1_TEXTURE_COORD_2 współrzedne s i t tekstury GL_MAP1_TEXTURE_COORD_3 współrzedne s, t i r tekstury GL_MAP1_TEXTURE_COORD_4 współrzedne s, t, r i q tekstury Pozostałe argumenty oznaczają: u1 i u2 – zakres wartości parametru u – zwykle [0,1], stride – ilość elementów w tablicy points o jaką należy się przesunąć do następnego punktu kontrolnego, order – ilość punktów kontrolnych, points – tablica z punktami. 1.2) Rysowanie krzywej Jednym ze sposobów narysowania krzywej jest użycie funkcji: void glEvalCoord1f (GLfloat u) Funkcja pobiera wartość parametru u∈[0,1 ] , gdzie wartość 0 oznacza początek, 1 oznacza koniec krzywej, a wartości pośrednie oznaczają punkty leżące na krzywej. Działanie funkcji jest podobne do funkcji glVertex3f(), z tym że operuje ona na przestrzeni jednowymiarowej u. Funkcja musi być wywołana w bloku glBegin()/glEnd(). Alternatywnym sposobem rysowania jest skorzystanie z funkcji tworzącej mapę (siatkę) punktów odwozrujących krzywą Béziera void glMapGrid1f (GLint un, GLfloat u1, GLfloat u2) gdzie • • un – ilość wygenerowanych punktów dla parametru u funkcji parametrycznej (ilość załamań krzywej) u1, u2 – zakres wartości parametru u P u Laboratorium nr 10 3/4 Następnie należy wywołać funkcję rysującą wygenerowaną mapę punktów: void glEvalMesh1 (GLenum mode, GLint i1, GLint i2) gdzie • mode – może przyjąc wartość GL_POINT lub GL_LINE • i1, i2 – zakres punktów, jaki ma zostać narysowany 2) Powierzchnie Béziera Powierzchnie Béziera, podobnie jak krzywe są uzależnione od parametrów. W przypadku powierzchni występują dwa parametry: u ∈[0,1 ] i v ∈[0,1] , a powierzchnia sparametryzowana przyjmuje postać: { } x u ,v P u , v= y u , v z u , v 2.1) Wygenerowanie współrzędnych powierzchni Béziera Powierzchnie tworzy się analogicznie do krzywych. Używany jest ewaluator dwuwymiarowy, który wcześniej trzeba aktywować. void glMap2f (GLenum target, GLfloat u1,GLfloat u2,GLint ustride,GLint uorder, GLfloat v1,GLfloat v2,GLint vstride,GLint vorder, const GLfloat *points) Parametr target Znaczenie GL_MAP2_VERTEX_3 współrzedne (x, y, z) punktów powierzchni GL_MAP2_VERTEX_4 współrzedne (x, y, z,w) punktów powierzchni GL_MAP2_INDEX Indeksy kolorów GL_MAP2_COLOR_4 składowe RGBA kolorów GL_MAP2_NORMAL współrzedne (x, y, z) wektorów normalnych GL_MAP2_TEXTURE_COORD_1 współrzedne s tekstury GL_MAP2_TEXTURE_COORD_2 współrzedne s i t tekstury GL_MAP2_TEXTURE_COORD_3 współrzedne s, t i r tekstury GL_MAP2_TEXTURE_COORD_4 współrzedne s, t, r i q tekstury Laboratorium nr 10 4/4 Pozostałe argumenty oznaczają: • u1, u2 – zakres wartości parametru u – zwykle [0,1], • v1, v2 – zakres wartości parametru v – zwykle [0,1], • ustride, vstride – ilość elementów w tablicy points o jaką należy się przesunąć do następnego punktu kontrolnego dla współrzędnych u i v , • uorder, vorder – ilość punktów kontrolnych dla współrzędnych u i v, • points – tablica z punktami. 2.2) Rysowanie powierzchni Jednym ze sposobów narysowania powierzchni jest użycie funkcji: void glEvalCoord2f (GLfloat u, GLfloat v) Funkcja pobiera wartość parametru wartość funkcji parametryczne u ∈[0,1 ] , v ∈[0,1] i zwraca wygenerowaną P u , v . Powierzchnia jest kontrolowana za pomocą przynajmniej 12 punktów kontrolnych. Można również skorzystać z funkcji generującej mapę (siatkę) punktów składającą się na powierzchnię Béziera. void glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) gdzie • un, vn – ilość punktów wygenerowanych dla parametrów u i v funkcji P u , v • u1, u2 - zakres wartości parametru u • v1, v2 – zakres wartości parametru v Narysowanie siatki punktów odbywa się za pomocą funkcji void glEvalMesh2 (GLenum mode,GLint i1,GLint i2,GLint j1,GLint j2) gdzie • mode – może przyjąc wartość GL_POINT lub GL_LINE lub GL_FILL • i1, i2 – zakres punktów, jaki ma zostać narysowany dla parametru u • j1, j2 – zakres punktów, jaki ma zostać narysowany dla parametru v