Kwadryki
Kwadryka to powierzchnia drugiego rzędu, którą można zapisać w postaci równania:
|
|
Kwadryki dostępne w bibliotece GLU
|
void gluCylinder(GLUquadricObj* obj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks);
gluCylinder(obj, 0.5, 1.0, 1.5, 10, 5); |
|
void gluDisk(GLUquadricObj* obj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops);
gluDisk(obj, 1.0, 2.0, 10, 5); |
|
void gluPartialDisk( GLUquadricObj* obj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle );
gluPartialDisk(obj,1.0,2.0,10,5,0,60); |
|
void gluSphere(GLUquadricObj* obj, GLdouble radius, GLint slices, GLdouble stacks);
|
Używanie kwadryk
Przykład:
/*Przygotowanie obiektu*/
GLUquadricObj *obiekt;
obiekt = gluNewQuadric();
gluQuadricDrawStyle(obiekt, GLU_FILL);
/*Rysowanie kwadryki*/
gluQuadricOrientation(obiekt, GLU_OUTSIDE);
gluQuadricNormals(obiekt, GLU_FLAT);
/*Funkcje odpowiedzialne za teksturowanie kwadryki */
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
gluQuadricTexture(obiekt, GL_TRUE);
glCallList(Texture);
/*Właściwe rysowanie kwadryk */
gluCylinder(obiekt, 0.5, 1.0, 1.0, 20, 2);
glTranslatef(0.0f, 0.0f, -1.0f);
gluCylinder(obiekt, 1.0, 0.5, 1.0 ,20, 2);
Parametry kwadryk:
Style rysowania kwadryk ustawiane przy pomocy gluQuadricDrawStyle
GLU_FILL |
kwadryki są wypełniane przy użyciu wielokątów (czworokątów) |
GLU_LINE |
kwadryki są rysowane jako siatka, za pomocą linii łamanych |
GLU_SILHOUETTE |
kwadryki są rysowane za pomocą odcinków, wyświetlane są tylko zewnętrzne krawędzie |
GLU_POINT |
kwadryki są rysowane jako zbiór punktów |
Automatyczne obliczanie normalnych - gluQuadricNormals
GLU_NONE |
Normalne nie są generowane |
GLU_FLAT |
Normalne są generowane dla wielokątów - powstają płaskie ścianki (ostrosłupy, graniastosłupy) |
GLU_SMOOTH |
Normalne są generowane dla wierzchołków - powstaje gładka ścianka (stożki, walce, sfery) |
Ustalanie kierunku normalnych dla kwadryki - gluQuadricOrientation
GLU_OUTSIDE |
Normalne wskazują na zewnątrz obiektu |
GLU_INSIDE |
Normalne wskazują do wewnątrz obiektu |
Generowanie współrzędnych dla tekstury - gluQuadricTexture
GLU_TRUE |
Współrzędne są generowane |
GLU_FALSE |
Współrzędne nie są generowane |
Podział wielokątów
Przykład - rysowanie litery A
1. Przygotowanie współrzędnych GLUtriangulatorObj *obj; GLdouble out[7][3] = {{ 0.0, 1.0, 0.0 }, {-0.5, -1.0, 0.0 }, {-0.4, -1.0, 0.0 }, {-0.2, -0.1, 0.0 }, { 0.2, -0.1, 0.0 }, { 0.4, -1.0, 0.0 }, { 0.5, -1.0, 0.0 }}; GLdouble ins[3][3] = {{ 0.0, 0.6, 0.0 }, {-0.1, 0.1, 0.0 }, { 0.1, 0.1, 0.0 }}; |
|
2. Utworzenie obiektu
obj = gluNewTess();
3. Zdefiniowanie funkcji zwrotnych
void CALLBACK MyVertex (void* data)
{
double *tab=data;
glTexCoord2dv(tab);//Ustawiamy wpółrzędne dla teksturowania
glVertex3dv(tab);
}
gluTessCallback(obj,GLU_BEGIN, glBegin);
gluTessCallback(tess, GLU_VERTEX, (void (CALLBACK*)(void))MyVertex);
gluTessCallback(obj, GLU_END, glEnd);
4. Rysowanie obiektu - część zewnętrzna
gluBeginPolygon(obj);
gluObjVertex(obj, out[0], out[0]); gluObjVertex(obj, out[1], out[1]);
gluObjVertex(obj, out[2], out[2]); gluObjVertex(obj, out[3], out[3]);
gluObjVertex(obj, out[4], out[4]); gluObjVertex(obj, out[5], out[5]);
gluObjVertex(obj, out[6], out[6]);
5. Rysowanie obiektu - część wewnętrzna
gluNextContour(obj, GLU_INTERIOR);
gluObjVertex(obj, ins[0], ins[0]); gluObjVertex(obj, ins[1], ins[1]);
gluObjVertex(obj, ins[2], ins[2]);
gluEndPolygon(obj);
gluDeleteObj(obj);
Opis funkcji dotyczących triangulatora
Definiowanie funkcji zwrotnych:
void gluTessCallback(GLUtriangulatorObj *tObj, GLenum which, void (*fn)());
|
Ta funkcja określa funkcje zwrotne podziału wielokąta, wywoływane na różnych etapach podziału. Funkcje zwrotne nie wpływają na sposób działania triangulatora ani na jego wydajność. Umożliwiają raczej uzupełnienie generowanych wierzchołków o dodatkowe informacje, takie jak kolor czy współrzędne tekstury.
Parametry
tObj GLUtriangulatorObj*: Wskaźnik do obiektu triangulatora, używanego przy podziale wielokąta.
which GLenum: Definiowana funkcja zwrotna
fn void (*)(): Wywoływana funkcja. Ponieważ funkcje mają różne prototypy należy je rzutować na typ właściwy przy pomocy rzutowania (void (CALLBACK*)(void))
Parametr which |
Opis funkcji |
Deklaracja funkcji |
GLU_BEGIN |
Funkcja jest wywoływana w momencie rozpoczęcia budowania prymitywu GL_TRIANGLE_FAN, GL_TRIANGLE_STRIP, GL_TRIANGLES |
void begin(GLenum type); |
GLU_EDGE_FLAG |
Funkcja jest wywoływana przy każdym wierzchołku wielokąta i musi przyjmować pojedynczy parametr GLboolean, określający czy wierzchołek jest wierzchołkiem określającym obszar wielokąta(GL_TRUE) czy wygenerowanym w jego wnętrzu w celu podziału (GL_FALSE) |
void edgeFlag (GLboolean flag); |
GLU_TESS_VERTEX |
Funkcja jest wywoływana przed każdym wysłaniem kolejnego wierzchołka funkcją glVertex3dv. Funkcja otrzymuje kopię trzeciego argumentu funkcji gluTessVertex |
void vertex (void * vertex_data); |
GLU_TESS_END |
Funkcja wywoływana na zakończenie rysowania prymitywu, zwykle funkcją glEnd |
void end (void); |
GLU_TESS_ERROR |
Funkcja wywoływana w przypadku błędu. Możliwe argumenty to GLU_TESS_MISSING_BEGIN_POLYGON, GLU_TESS_MISSING_END_POLYGON, GLU_TESS_MISSING_BEGIN_CONTOUR, GLU_TESS_MISSING_END_CONTOUR, GLU_TESS_COORD_TOO_LARGE |
void error (GLenum errno); |
GLU_TESS_BEGIN_DATA GLU_TESS_EDGE_FLAG_DATA GLU_TESS_VERTEX_DATA GLU_TESS_END_DATA GLU_TESS_ERROR_DATA |
Parametry definiują funkcje działające tak samo jak powyższa, z tym że udostępniające jako ostatni parametr wskaźnik do obiektu triangulatora |
void fun ( …. , void *poly_data); |
Rysowanie wielokątów wklęsłych
Void gluTessVertex(GLUtriangulatorObj *t0bj, GLdouble v[3], void *data);
|
Ta funkcja dodaje wierzchołek do bieżącej ścieżki podziału wielokąta. Argument data jest przekazywany w funkcji
zwrotnej GL_VERTEX.
Parametry
tObj GLUtriangulatorObj*: Wskaźnik do obiektu triangulatora, używanego przy podziale wielokąta.
v GLdouble[3]: Wierzchołek 3D.
data void *: Wskaźnik do danych, które mają zostać przekazane w funkcji zwrotnej GL_VERTEX.
Rysowanie wielokątów złożonych
void gluNextContour(GLUtriangulatorObj *t0bj,GLenum type);
|
Ta funkcja rozpoczyna nowy kontur lub otwór w złożonym wielokącie
Parametry
tObj GLUtriangulatorObj*: Wskaźnik do obiektu triangulatora, używanego przy podziale wielokąta.
type GLenum: Typ konturu.
Typy ścieżek funkcji gluNextContour
GLU_EXTERIOR |
Ścieżka wyznacza zewnętrzne krawędzie wielokąta |
GLU_INTERIOR |
Ścieżka wyznacza wewnętrzne krawędzie wielokąta (dziura) |
GLU_UNKNOWN |
Kontur będzie analizowany przez glu |
GLU_CCW ,GLU_CW |
Pierwszy definiowany kontur przyjmuje się domyślnie jako zawnętrzny. Przyjmuje się że każdy następny również będzie zewnętrzny, jeśli będzie definiowany w tym samym kierunku, a jeśli w przeciwnym - wewnętrzny. Dla parametru GLU_CCW, ścieżki zewnętrzne będą przeciwne do ruchu wskazówek zegara |
|
WYKŁAD 4a Kwadryki i wielokąty złożone |
|
6