Karol Zalewski

background image

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”:

background image

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:

background image

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)

{

background image

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

background image

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);

background image

// 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;

}


Wyszukiwarka

Podobne podstrony:
lab1, Karol Zalewski gr, Karol Zalewski gr
GR I6Y3S1 KAROL ZALEWSKI
PREZENTACJA skladowanie i przechowywanie paliw Karol Zalewski
Rola mocarstw w regionie Karol Zalewski
I6Y3S1 KAROL ZALEWSKI
cwiczenia 7 25.04.2008, Prawoznawstwo, Materialy e-learning, mgr M. Zalewska
Leibniz Monadologia, Filozofia, Materiały do zajęć, Mistrzu, Zalewski
PLANY, ocenianie miaraddd, Karol Miarka gr
Sprawozdania Karol, Współczynnik podziału, Gr
Sprawozdania Karol, Przewodnictwo elektrolitów
MATERIALY BUD, SPRAW NR3, Karol Kończal
wstęp do religioznawstwa, funkcjonalizm, Karol Ferster
03. Zasady systemu Gabelsbergera, Czajkowski Karol 'Nauka stenografii polskiej wg systemu Gabelsberg
Karol Ścibor badanie miejsowe Konspekt ćwiczenia, szkolenia, WOPR, ratownictwo wodne,
cwiczenia 5 4.04.2008, Prawoznawstwo, Materialy e-learning, mgr M. Zalewska
Sprawozdania Karol, Farmakokinetyka
hs, hs 8 Marks - Praca wyobcowana, Karol Marks
hs, hs 8 Marks - Praca wyobcowana, Karol Marks
Prawo karne skrypt z wykładów Zalewskiego doc

więcej podobnych podstron