WOJSKOWA AKADEMIA TECHNICZNA
GRAFIKA KOMPUTEROWA
SPRAWOZDANIE
Z
ZADANIA LABORATORYJNEGO
MODELOWANIE OBIEKTÓW 3D
Grupa szkoleniowa: I1X6S1
Sprawozdanie wykonał: Michał Małek
Prowadzący ćwiczenie: dr inż. Marek Salamon
Treść zadania.
Wykorzystując wybrane funkcje modelowania geometrycznego biblioteki OpenGL i GLUT napisać program przedstawiający perspektywiczny obraz bryły o zadanych parametrach. Podstawę bryły zamodelować w trybie GL_TRIANGLE_FUN. Wprowadzić możliwość zamiany liczby podziałów pionowych i poziomych bryły w zakresie od 5 do 20 (dodatkowo). Wprowadzić możliwość zmiany położenia obserwatorów (dodatkowo).
Zadana bryła :
Stożek w trybie GL_QUADS o promieniu podstawy 1 i jej środku w punkcie (0,0,0) oraz wysokości 3.
Rozwiązanie zadania
Podstawę stożka zamodelowałem za pomocą GL_TRIANGLE_FAN. Pierwszy wierzchołek znajduję się w punkcie o współrzędnych (0,0,0). Współrzędne kolejnych wierzchołków wyznaczane sa w pętli for za pomocą następujących przekształceń:
x = a*cos(d2r(i*skok))
z=a*sin(d2r(i*skok))
gdzie:
a – promień podstawy
i – zmienna iteracyjna pętli
skok – określa odstęp pomiędzy punktami na okręgu (w stopniach)
d2r() – funkcja zamieniająca stopnie na radiany (kod przedstawiony w punkcie 4)
Współrzędna y jest cały czas ustawiona na 0.
Następnie zamodelowałem ściany boczne stożka (tryb GL_QUADS). Wyznaczanie współrzędnych odbywa się w pętli for. Przyjąłem podział ściany bocznej na dwie części. Na początku wyznaczam 2 (z czterech) wierzchołki należące do podstawy (metoda wyznaczania współrzędnych jest identyczna jak w przypadku wyznaczania współrzędnych wierzchołków podstawy). Następnie wyznaczam kolejne 2 wierzchołki w wysokości 3/2 (połowa wysokości stożka, współrzędna y ustawiona na 1.5). Wyznaczanie odbywa się za pomocą następujących przekształceń :
x = (a/2)*cos(d2r(i*skok))
z=(a/2)*sin(d2r(i*skok))
gdzie:
a – promień podstawy
i – zmienna iteracyjna pętli
skok – określa odstęp pomiędzy punktami na okręgu (w stopniach)
d2r() – funkcja zamieniająca stopnie na radiany (kod przedstawiony w punkcie 4)
Następnie wyznaczam kolejne dwie współrzedne górnej części stożka identyczną metodą jak w wyznaczaniu poprzedniuch dwóch punktów. Ostatnie dwa wierzchołki ściany znajdują się w punkcie (0,3,0).
Uzyskane efekty
Kod źródłowy związany z zadaniem
// FUNKCJA ZAMIENIA STOPNIE NA RADIANY
double d2r(double alfa){
return alfa * PI / 180 ;
}
// Funkcja rysujaca stozek w trybie GL_QUAD.
// Srodek stozka znajduje się w punkcie (0,0,0).
// a – promień podstawy
void RysujSzescian(double a,int podz_pion, int podz_poz) {
int pion = 360/podz_pion;
int poz = podz_poz;
int i;
// rysowanie podstawy
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0, 0, 0);
for(i = 0; i <= pion; i++) {
glVertex3f(a*cos(d2r(i*pion)), 0 ,a*sin(d2r(i*pion)));
}
glEnd();
// rysowanie powierzchni bocznej
glBegin(GL_QUADS);
for(i = 0; i <= poz; i++) {
glVertex3f(a*cos(d2r(i*pion)), 0 ,a*sin(d2r(i*pion)));
glVertex3f(a*cos(d2r((i+1)*pion)), 0 ,a*sin(d2r((i+1)*pion)));
glVertex3f((a/2)*cos(d2r((i+1)*pion)), 1.5 ,(a/2)*sin(d2r((i+1)*pion)));
glVertex3f((a/2)*cos(d2r(i*pion)), 1.5 ,(a/2)*sin(d2r(i*pion)));
glVertex3f((a/2)*cos(d2r(i*pion)), 1.5 , a/2)*sin(d2r(i*pion)));
glVertex3f((a/2)*cos(d2r((i+1)*pion)), 1.5 ,(a/2)*sin(d2r((i+1)*pion)));
glVertex3f(0,3,0);
glVertex3f(0,3,0);
}
glEnd();
}
Wnioski z przeprowadzonego ćwiczenia
Zastosowanie równania okręgu (do wyliczenia współrzędnych punktów zewnętrznych każdego przekroju poziomego) i twierdzenia Talesa (do wyliczenia promieni każdego przekroju poziomego) pozwoliło na uzyskanie żądanego efektu. Wzory te są na poziomie szkoły średniej (lub nawet podstawowej). Stąd można uznać, iż same obliczenia od strony algebraicznej nie były zbyt trudne.
Jedyny poważny problem polegał na znalezieniu kolejnych kroków, które należało wykonać. Do tego niezbędna była chociaż minimalna umiejętność myślenia przestrzennego.
Pomimo, iż nie udało mi się wykonać dodatkowych punktów zadania w trakcie trwania laboratorium ćwiczenie uważam za wykonane poprawnie.