Karol Zalewski gr. I6Y3S1
Wojskowa Akademia Techniczna
Grafika Komputerowa
Modelowanie brył
1.Tre zadania
Wykorzystuj c biblioteki OpenGL i GLUT napisa program rysuj cy sto ek w trybie
GL_TRIANGLE_STRIP. Program powinien umo liwia u ytkownikowi za pomoc obsługi
klawiatury modyfikowanie ilo ci pionowych podziałów sto ka, oraz „wycinanie kawałków ze rodka
sto ka”.
2.Metoda rozwi zania zadania
Z
adanie to nie zostało do ko ca rozwi zane przeze mnie. Zrobiłem dwie pierwsze cz ci
zadania, mianowicie narysowałem sto ek i umo liwiłem u ytkownikowi kontrolowanie ilo ci
pionowych podziałów sto ka. Wykonałem to w krokach opisanych w dalszej cz ci sprawozdania. Na
pocz tku utworzyłem nast puj ce zmienne globalne:
float pi =3.14;
float podzial = 6;
float kat;
Zmienna „pi” była mi potrzebna przy rysowaniu podstawy jak i ciany bocznej sto ka ,a dokładnie
przy u yciu funkcji trygonometrycznych sinus i cosinus. Zmiennej o nazwie „podział” u yłem do
okre lenia pionowej liczby podziałów. W dalszej cz ci programu umo liwiłem u ytkownikowi
modyfikowanie tej zmiennej poprzez obsług klawiatury. Zmiennej „kat” u yłem jako k t przy
funkcjach trygonometrycznych.
Utworzyłem równie stałej o nazwie „wysoko ”, która okre lała wysoko sto ka.
Sto ek narysowałem w dwóch fazach. W pierwszej fazie narysowałem podstaw sto ka u ywaj c
powy szych zmiennych oraz stałej za pomoc p tli „for”:
for(kat=0;kat<=2*pi;kat+=2*pi/podzial){
glVertex3f(wysokosc*sin(kat),0,wysokosc*cos(kat));
glVertex3f(0,0,0);}
W drugiej fazie narysowałem cian boczn sto ka. Jak w poprzedniej fazie u yłem równie wy ej
opisanych zmiennych oraz stałej oraz p tli „for”:
for(kat=0;kat<=2*pi;kat+=2*pi/podzial){
glVertex3f(wysokosc*sin(kat),0,wysokosc*cos(kat));
glVertex3f(0,wysokosc,0);}
3.Wyniki
Niestety nie udało mi si zrealizowa wszystkich zało e zadania. Program napisany przeze
mnie rysuje sto ek oraz daje mo liwo modyfikowania ilo ci podziałów pionowych sto ka za
pomoc obsługi klawiatury.
Przykład sto ka dla 6 podziałów pionowych:
Przykład sto ka dla 11 podziałów pionowych:
Przykład sto ka dla 18 podziałów pionowych:
4.Kod ródłowy
//////////////////////////////////////////////////////////////////////////////////////////
// Program rysuj cy sto ek. //
//////////////////////////////////////////////////////////////////////////////////////////
#include <GL/glut.h>
#include <cmath>
// Definicja stalych
#define DLUGOSC_BOKU 5.0
#define OBSERWATOR_ODLEGLOSC 20.0
#define OBSERWATOR_OBROT_X 20.0
#define OBSERWATOR_OBROT_Y 20.0
#define OBSERWATOR_FOV_Y 30.0
#define wysokosc 3.0
// Zmienne globalne
double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
int szerokoscOkna = 800;
int wysokoscOkna = 600;
float pi =3.14;
float podzial = 6;
float kat;
// Prototypy funkcji
void RysujSzescian(double a);
void UstawParametryWidoku(int szer, int wys);
void WyswietlObraz(void);
void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
// Srodek szescianu znajduje si w punkcie (0,0,0).
void RysujSzescian(double a)
{
glBegin(GL_TRIANGLE_STRIP);
for(kat=0;kat<=2*pi;kat+=2*pi/podzial){
glVertex3f(wysokosc*sin(kat),0,wysokosc*cos(kat));
glVertex3f(0,0,0);}
glEnd();
glBegin(GL_TRIANGLE_STRIP);
for(kat=0;kat<=2*pi;kat+=2*pi/podzial){
glVertex3f(wysokosc*sin(kat),0,wysokosc*cos(kat));
glVertex3f(0,wysokosc,0);}
glEnd();
}
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
// by wywolywana kazdorazowo po zmianie rozmiarow okna programu.
void UstawParametryWidoku(int szer, int wys)
{
// Zapamietanie wielkosci widoku
szerokoscOkna = szer;
wysokoscOkna = wys;
// Ustawienie parametrow viewportu
glViewport(0, 0, szerokoscOkna, wysokoscOkna);
// Przejscie w tryb modyfikacji macierzy rzutowania
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
}
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja wyswietlajaca pojedyncza klatke animacji
void WyswietlObraz(void)
{
// Wyczyszczenie bufora koloru i bufora glebokosci
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
glMatrixMode(GL_MODELVIEW);
// Zastapienie aktywnej macierzy macierza jednostkowa
glLoadIdentity();
// Ustalenie polozenia obserwatora
glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
// Narysowanie szescianu
RysujSzescian(bok);
// Przelaczenie buforow ramki
glutSwapBuffers();
}
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja obslugi klawiatury
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
if(klawisz == '+')
bok *= 2.0;
else if (klawisz == '-')
bok /= 2.0;
else if (klawisz == 'q'){
if(podzial<20) podzial += 1.0;}
else if (klawisz == 'a'){
if (podzial>6) podzial -= 1.0;}
else if (klawisz == 27)
exit(0);
}
//////////////////////////////////////////////////////////////////////////////////////////
// Glowna funkcja programu
int main(int argc, char **argv)
{
// Zainicjowanie biblioteki GLUT
glutInit(&argc, argv);
// Ustawienie trybu wyswietlania
glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
// Ustawienie polozenia dolenego lewego rogu okna
glutInitWindowPosition(100, 100);
// Ustawienie rozmiarow okna
glutInitWindowSize(szerokoscOkna, wysokoscOkna);
// Utworzenie okna
glutCreateWindow("Szescian");
// Odblokowanie bufora glebokosci
glEnable(GL_DEPTH_TEST);
// Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
glClearDepth(1000.0);
// Ustawienie koloru czyszczenia bufora ramki
glClearColor (0.0f, 0.0f, 0.3f, 0.0f);
// Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
// Zarejestrowanie funkcji (callback) odpowiedzialnej za
glutDisplayFunc(WyswietlObraz);
// Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
// zmieniane sa rozmiary okna
glutReshapeFunc(UstawParametryWidoku);
// Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
// zadnych zadan
glutIdleFunc(WyswietlObraz);
// Zarejestrowanie funkcji obslugi klawiatury
glutKeyboardFunc(ObslugaKlawiatury);
// Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
// w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
glutMainLoop();
return 0;
}