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−u3 x 03u1−u2 x 13u 2 1−u x 2u 3 x3
y u=1−u3 y 03u 1−u 2 y 13u 2 1−u  y 2 u3 y 3
z u=1−u3 z 03u 1−u2 z 1 3u 2 1−u z 2u 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