Data wykonania ćwiczenia:
2010-01-11
Autor: Teodor Kulej
Grupa: I8Y1S1
Zadanie polegało na napisaniu programu używającego bibliotek OpenGL i GLUT rysującego walec o wymiarach zadanych przez prowadzącego, stosując do rysowania trybu GL_QUAD_STRIP.
Zadanie zrealizowałem tworząc kod rysujący podstawę górną i dolną, a następnie powierzchnię boczną bryły. W realizacji tego zadania użyteczna była znajomość układu współrzędnych polarnych, dzięki któremu przekształcenie współrzędnych z dwójki kąt-promień do dwójki x-y było wyjątkowo proste. Kod funkcji rysującej walec prezentuje się następująco:
float fijo=0;
float fijx=0;
float fijy=0;
void rysuj(){
float H=4.0;
float r=1.0;
float fi;
int i=0,j=0;
float h=0;
float vstep=360.0/verticals;
float hstep=H/(1.0*horizintals);
do{
glBegin(GL_QUAD_STRIP);
fi=0;
i=0;
do{
glVertex3f(fijx+r*sin(DEG2RAD(fi+fijo)),fijy+h,r*cos(DEG2RAD(fi+fijo)));
glVertex3f(fijx+r*sin(DEG2RAD(fi+fijo)),fijy+h+hstep,r*cos(DEG2RAD(fi+fijo)));
fi+=vstep;
}while(i++<verticals);
glEnd();
h+=hstep;
}
while(++j<horizintals);
fi=0;
i=0;
glBegin(GL_QUAD_STRIP);
do{
glVertex3f(fijx+0,fijy+0,0);
glVertex3f(fijx+r*sin(DEG2RAD(fi+fijo)),fijy+0,r*cos(DEG2RAD(fi+fijo)));
fi+=vstep;
}while(i++<verticals);
glEnd();
fi=0;
i=0;
glBegin(GL_QUAD_STRIP);
do{
glVertex3f(fijx+0,fijy+H,0);
glVertex3f(fijx+r*sin(DEG2RAD(fi+fijo)),fijy+H,r*cos(DEG2RAD(fi+fijo)));
fi+=vstep;
}while(i++<verticals);
glEnd();
}
Wykorzystany tryb pracy Quad Strips oznacza, że program musi za pomocą API OpenGLa podawać współrzędne wierzchołków w postaci: 1, 2, 3, 4 dla pierwszego wierzchołka, a następnie 3, 4 i dla kolejnych 3, 4; gdzie cyfry 1, 2, 3, 4 oznaczają współrzędnym wierzchołków 1, 2, 3 i 4, zaczynając odpowiednio od lewego górnego rogu, przez lewy dolny, prawy dolny i prawy górny. Dzięki tej kolejności rysowane polygony będą zwrócone ścianą widzialną dla widza, czyli z wektorem normalnym ściany zwróconym w stronę kamery. Ten tryb uproszcza rysowanie wierzchołków, bo dla rysowania „paska” polygonów wystarczy tylko podawać 2 dla każdej kolejnej ściany zamiast 4, z czego każde kolejne 2 pary by się powtarzały.
Podstawy walca również zostały narysowane w tym trybie. Współrzędna środka podstawy powtarzałą się w każdej kolejnej parze. Ten tryb do rysowania wierzchołków jest ewidentnie gorszy od trybu Fan, w którym wystarczy podać środek i kolejne wierzchołkileżące na brzegu podstawy.
Zmienne rodziny fij* służą co zmiany współrzędnych figury – zmiany położenia, operując na układzie kartezjańskim oraz zmiany kąta obrotu bryły operując na współrzędnych polarnych. Dzięki temu mogłem w programie przesuwać w przestrzeni i obracać bryłę aby wykryć ewentualne niedoskonałości.
Zmienne horizintals i verticals przechowują informację o podziale bryły na segmenty. Należy zazaczyć, że w trybie rysowania siatki bryły, obraz jest kanciasty. Dla najwyższej liczby podziałów pionowych (11) bryła zaczyna wyglądać na prawdziwie okrągłą, ale brak cieniowania uwydatniał kanty i ostre krawędzie walca. Na podstawie liczby podziałów ustalane są zmienne rodziny step, które wskazują na różnicę kąta fi o jakią wzrasta położenie kolejnych verteksów w danej płaszczyźnie przy rysowaniu, lub różnicę położenia.
W programie zmieniłem tryb rysowania, z perspektywy na ortho, dzięki któremu verteksy leżące w jednej linii, są tak rysowane i nie pojawia sie zniekształcenie perspektywy, nie występuje efekt paralaksy.
Rysowanie brył w OpenGL nie jest zadaniem trudnym, jednak wymaga pewnego przygotowania teoretycznego i przemyślenia problemu. Tryby rysowania brył wystarczają do rysowania prostych i skomplikowanych brył. Jednak do rysowania i późniejszego bryły wygodniej użyć gotowych modeli i je po prostu wczytywać, niż rysować ręcznie. Przy rosnącej liczbie wierzchołków przypadajacych na model w grach komputerowych, koncepcja rysowania ręcznego staje się bardzo niewygodna i nieużyteczna, chociaż w tworzeniu edytorów grafiki 3D będzie niezastąpiona.
Przykładowy render: