Grafika komputerowa
Sprawozdanie z pracy laboratoryjnej nr 3
Temat: modelowanie brył 3D
Wykonujący ćwiczenie: Barbara Szwal
Prowadzący: dr inż. Marek Salomon
Data wykonania ćwiczenia: 20.12.2012
Grupa szkoleniowa: I1Y5S1
1.Treści zadań:
Wykorzystując wybrane funkcję modelowania geometrycznego biblioteki OpenGL napisać program przedstawiający obraz perspektywiczny bryły o zadanych parametrach:
½ sfery w trybie GL_TRIANGLES o promieniu 3 i środku w punkcie (0, 0, 0)
Dodatkowe polecenia. Użytkownik za pomocą klawiatury powinien mieć możliwość:
- wprowadzania liczby podziałów pionowych i poziomych bryły w zakresie od 4 do 64
- zmiany odległości obserwatora od obiektu
- zmiany orientacji obserwatora(obroty wzglądem osi X, Y, Z.
2. Sposób rozwiązania zadań.
Aby uzyskać taką figurę potrzebne są nam punkty, które będą stanowić ich wierzchołki Najprostszym istniejącym wielokątem jest trójkąt, który, jak wiadomo, posiada trzy krawędzie. Do rysowania trójkątów służy prymityw GL_TRJANGLES; trójkąty są tworzone w oparciu o trzy wierzchołki.
#include <glut.h> // biblioteka potrzebna do korzystania z funkcji OpenGL
#include <math.h> // będziemy wykorzystywać f-cje matematyczne takie jak sin() oraz cos() dzieki którym będę mogła obliczyć współrzędne sfery.
3. Wyniki.
4. Wnioski.
1.Zadanie
Ćwiczenia laboratoryjne rozpoczęłam od zbudowania układu współrzędnych. Oto kod:
// Pocztaek tworzenia ukladu wspolrzednych
glBegin(GL_LINES);
// Os X
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-20.0, 0.0, 0.0);
glVertex3f(20.0, 0.0, 0.0);
// Os Y
glColor3f(0.0,1.0,0.0);
glVertex3f(0.0, -20.0, 0.0);
glVertex3f(0.0, 20.0, 0.0);
// Os Z
glColor3f(0.0,0.0,1.0);
glVertex3f(0.0, 0.0, -20.0);
glVertex3f(0.0, 0.0, 20.0);
// Koniec tworzenia ukladu wspolrzednych
glEnd();
glColor3f(1.0, 1.0, 1.0);
Oznacza to, iż każda współrzędna będzie miała inny kolor:
1. współrzędna X – kolor czerwony
2. współrzędna Y – kolor niebieski
3. współrzędna Z – kolor zielony
Zadbałam również o wygląd obiektów, tzn będą miały kolor biały.
Zadanie rozpoczęłam od stworzenia kopuły sfery. Oto kod programu:
glVertex3f(0.0,0.0,0.0);
glBegin(GL_TRIANGLES);
for(teta = OD; teta < DO; teta += PI/EPS)
{
for(fi = OD1; fi < DO1; fi += PI/EPS2)
{
x = R * sin(teta) * cos(fi);
z = R * sin(teta) * sin(fi);
y = R * cos(teta);
glVertex3f(x, y, z);
x = R * sin(teta) * cos(fi+PI/EPS2);
z = R * sin(teta) * sin(fi+PI/EPS2);
y = R * cos(teta);
glVertex3f(x, y, z);
x = R * sin(teta+PI/EPS) * cos(fi+PI/EPS2);
z = R * sin(teta+PI/EPS) * sin(fi+PI/EPS2);
y = R * cos(teta+PI/EPS);
glVertex3f(x, y, z);
x = R * sin(teta+PI/EPS) * cos(fi+PI/EPS2);
z = R * sin(teta+PI/EPS) * sin(fi+PI/EPS2);
y = R * cos(teta+PI/EPS);
glVertex3f(x, y, z);
x = R * sin(teta) * cos(fi+PI/EPS);
z = R * sin(teta) * sin(fi+PI/EPS);
y = R * cos(teta);
glVertex3f(x, y, z);
x = R * sin(teta+PI/EPS) * cos(fi+2*PI/EPS2);
z = R * sin(teta+PI/EPS) * sin(fi+2*PI/EPS2);
y = R * cos(teta+PI/EPS);
glVertex3f(x, y, z);
}
}
glEnd();
}
Zgodnie z poleceniem prowadzącego pozwoliłam sobie stworzyć domkniecie bryły w trybie GL_TRIANGLE_FAN. Oto fragment kodu odpowiadający za tworzenie domknięcia sfery:
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0,0.0,0.0);
for(angle = 0.0f; angle <= (2.0f*PI);angle += (PI/6.0f))
{
x = R*cos(angle);
z = R*sin(angle);
glVertex3f(x, z, 0.0f) ;
Fragment kodu, który realizuje dodatkowe funkcje np. możliwość podziału bryły czy obroty sfery wzdłuż wybranej osi:
// Funkcja obslugi klawiatury
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
if(klawisz == '+')
promien *= 1.01;
else if (klawisz == '-')
promien /= 1.01;
else if(klawisz == 'r')
OBSERWATOR_OBROT_X++;
else if(klawisz == 'e')
OBSERWATOR_OBROT_Y++;
else if (klawisz == 'd')
OBSERWATOR_OBROT_X--;
else if (klawisz =='f')
OBSERWATOR_OBROT_Y--;
else if (klawisz == 'q') {
if (PODZIAL_X>=4) PODZIAL_X--;
}
else if (klawisz == 'w') {
if (PODZIAL_X<=64) PODZIAL_X++;
}
else if (klawisz== 'a'){
if (PODZIAL_Y>=4) PODZIAL_Y--;
}
else if (klawisz == 's'){
if (PODZIAL_Y<=64) PODZIAL_Y ++;
}
else if (klawisz == 27)
exit(0);
}
3.Wyniki działania programu.
Bryła z minimalną liczbą podziałów
Widok bryły z maksymalną liczbą podziałów ½ sfery(kopuły) oraz maksymalną liczbą podziałów podstawy.
Widok bryły z maksymalną liczbą podziałów ½ sfery.
4. Wnioski ogólne.
Dzięki temu ćwiczeniu poznałam podstawowe zasady modelowania obiektów trójwymiarowych, programowania prostych efektów takich jak obroty, zmianę rozmiaru, zmianę ilości podziałów. W zadaniu zostały wykorzystane zagadnienia, które bezpośrednio powiązane są z innymi przedmiotami dydaktycznymi, jak np. analiza matematyczna. Bez ich znajomości wymodelowanie zadanego obiektu byłoby bardzo czasochłonne. Dzięki wykorzystaniu funkcji OpenGL można stworzyć bardzo wiele ciekawych obiektów. Tworzenie tego obrazu zajęło mi ponad 3h zajęć, co dowodzi iż pomimo prostego wyglądu stworzonej wizualizacji sam proces tworzenia obiektów przy użyciu prymitywów graficznych tj GL_TRIANGLES jest bardzo czasochłonny i wymaga dużego skupienia. Nawet najdrobniejszy błąd może sprawić, że obraz będzie wyglądał zupełnie inaczej niż zamierzona figura, albo nie zostanie wyświetlony w ogóle. Ćwiczenie uważam za interesujące oraz pouczające.