GR I6Y3S1 KAROL ZALEWSKI

background image

Wojskowa Akademia Techniczna

Grafika Komputerowa

Sprawozdanie z pracy laboratoryjnej nr 2

Prowadz cy: mgr in . Mariusz Pazur

Data wykonania wiczenia: 17.12.2007r.

Wykonał: Karol Zalewski – I6Y3S1

background image

1.Tre zadania

Zadanie 2

Napisa program przedstawiaj cy obiekt zbudowany z prymitywów przestrzennych

udost pnianych przez biblioteki GLU i GLUT. U ytkownik za pomoc klawiatury powinien

mie mo liwo wprowadzania zmian nast puj cych parametrów:

1.

K ta obrotu migła,

2.

K ta odchylenia, pochylenia i przechylenia rakiety.

W programie uwzgl dni mo liwo interakcyjnej zmiany poło enia obserwatora poprzez

podanie nast puj cych parametrów:

1.

Odległo ci obserwatora od obiektu (R),

2.

Wysoko ci obserwatora wzgl dem płaszczyzny, na której poło ony jest obiekt (H),

3.

K ta obrotu wokół obiektu w zakresie [0, 360] (

α).

UWAGA: Obserwator jest zawsze zwrócony przodem w kierunku obiektu.

R

H

α

Obserwator

background image

2. Metoda rozwi zania zadania

Zadanie niestety nie zostało do ko ca wykonane przeze mnie. Nie udało mi si

zrealizowa drugiej cz ci zadania, mianowicie :

W programie uwzgl dni mo liwo interakcyjnej zmiany poło enia obserwatora poprzez

podanie nast puj cych parametrów:

4.

Odległo ci obserwatora od obiektu (R),

5.

Wysoko ci obserwatora wzgl dem płaszczyzny, na której poło ony jest obiekt (H),

6.

K ta obrotu wokół obiektu w zakresie [0, 360] (

α

).”

Podczas rozwi zywania zadania wykorzystałem poni sze funkcje:

void walec(void);

void polkola(void);

void skrzydlo(void);

void pomoc(void);

void ogon(void);

void smiglo(void);

void samolot(void);

void sterowanie(void);

Funkcja walec() jest odpowiedzialna za rysowanie kadłuba samolotu o kształcie walca.

Podzielona jest ona na trzy „cz ci”. W pierwszej i drugiej rysuje podstawy:

glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0,5.0,0.0);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),5.0,0.75*cos(i));

}

glEnd();

glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0,-5.0,0.0);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),-5.0,0.75*cos(i));

}

glEnd();

W trzeciej powierzchnie boczn :

glBegin(GL_QUAD_STRIP);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),5.0,0.75*cos(i));

glVertex3f(0.75*sin(i),-5.0,0.75*cos(i));

}

glEnd();

Funkcja polkola() rysuje dziób samolotu:

background image

double i=0.0,j=0.0,kat=2*pi;

for(j=pi;j>0.0;j-=pi/10.0){

glBegin(GL_QUAD_STRIP);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*cos(j)*sin(i),5.0+0.75*sin(j),0.75*cos(j)*cos(i));

glVertex3f(0.75*cos(j+pi/10.0)*sin(i),5.0+0.75*sin(j+pi/10.0),0.75*cos(j+pi/10.0)*co

s(i));

}

glEnd();

Funkcja skrzydło() ma za zadanie narysowa główne skrzydło samolotu:

glPushMatrix();

glTranslatef(0.75,0.0,0.0);

glScalef(0.25,3.0,8.0);

glutWireCube(1.0);

glPopMatrix();

Funkcja pomoc() ma za zadanie „pomóc” w rysowaniu ogona samolotu:

glPushMatrix();

glScalef(0.25,1.5,2.0);

glutWireCube(1.0);

glPopMatrix();

Funkcja ogon() rysuje ogon samolotu wykorzystuj c przy tym funkcje pomoc. Jest ona

podzielona na dwie „cz ci”:

-rysuj c pionow cz

ogona:

glPushMatrix();

glRotatef(90.0,0.0,1.0,0.0);

glTranslatef(0.0,-4.25,1.75);

pomoc();

glPopMatrix();

-rysuj c poziome cz ci ogona:

glPushMatrix();

glTranslatef(0.0,-4.25,-1.75);

pomoc();

glPopMatrix();

glPushMatrix();

glTranslatef(0.0,-4.25,1.75);

pomoc();

background image

glPopMatrix();

Funkcja smiglo() odpowiedzialna jest za rysowanie migła:

glPushMatrix();

glTranslatef(0.0,5.75,0.0);

glScalef(4.0,0.25,0.25);

glutWireCube(1.0);

glPopMatrix();

Funkcja samolot() rysuje cały samolot. Składa si ona z powy szych funkcji. Umo liwia

równie obrót migłem:

walec();

polkola();

skrzydlo();

ogon();

// obrót migłem

glPushMatrix();

glRotatef(obrot,0.0,1.0,0.0);

smiglo();

glPopMatrix();

Funkcja sterowanie() odpowiedzialna jest za umo liwienie zmian k ta pochylenia i

przechylenia rakiety:

glPushMatrix();

glRotatef(pochylenie,0.0,0.0,1.0);

glRotatef(przechylenie,0.0,1.0,0.0);

samolot();

glPopMatrix();

3.Wyniki

background image

Pierwsze poło enie samolotu:

Drugie poło enie samolotu:

background image

Trzecie poło enie samolotu:

4.Kod programu:

#include <GL/glut.h>

#include <math.h>

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

// Zmienne globalne

double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu

int szerokoscOkna = 800;

int wysokoscOkna = 600;

double pi=3.14159265;

double obrot=0.0;

double pochylenie=0.0,przechylenie=0.0;

char z='x';

background image

double h=0.0;

double odl=OBSERWATOR_ODLEGLOSC;

double obr=OBSERWATOR_OBROT_Y;

// Prototypy funkcji

void samolot(void);

void walec(void);

void polkola(void);

void skrzydlo(void);

void pomoc(void);

void ogon(void);

void smiglo(void);

void sterowanie(void);

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 walec(void){

double kat=2*pi;

double i=0.0;

glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0,5.0,0.0);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),5.0,0.75*cos(i));

}

glEnd();

glBegin(GL_QUAD_STRIP);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),5.0,0.75*cos(i));

glVertex3f(0.75*sin(i),-5.0,0.75*cos(i));

}

glEnd();

glBegin(GL_TRIANGLE_FAN);

glVertex3f(0.0,-5.0,0.0);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*sin(i),-5.0,0.75*cos(i));

}

background image

glEnd();

}

void polkola(void){

double i=0.0,j=0.0,kat=2*pi;

for(j=pi;j>0.0;j-=pi/10.0){

glBegin(GL_QUAD_STRIP);

for(i=0.0;i<=kat;i+=kat/20.0){

glVertex3f(0.75*cos(j)*sin(i),5.0+0.75*sin(j),0.75*cos(j)*cos(i));

glVertex3f(0.75*cos(j+pi/10.0)*sin(i),5.0+0.75*sin(j+pi/10.0),0.75*cos(j+pi/10.0)*co

s(i));

}

glEnd();

}

}

void skrzydlo(void){

glPushMatrix();

glTranslatef(0.75,0.0,0.0);

glScalef(0.25,3.0,8.0);

glutWireCube(1.0);

glPopMatrix();

}

void pomoc(void){

glPushMatrix();

glScalef(0.25,1.5,2.0);

glutWireCube(1.0);

glPopMatrix();

}

void ogon(void){

glPushMatrix();

glTranslatef(0.0,-4.25,-1.75);

pomoc();

glPopMatrix();

glPushMatrix();

glTranslatef(0.0,-4.25,1.75);

pomoc();

glPopMatrix();

background image

glPushMatrix();

glRotatef(90.0,0.0,1.0,0.0);

glTranslatef(0.0,-4.25,1.75);

pomoc();

glPopMatrix();

}

void smiglo(void){

glPushMatrix();

glTranslatef(0.0,5.75,0.0);

glScalef(4.0,0.25,0.25);

glutWireCube(1.0);

glPopMatrix();

}

void samolot(void)

{

walec();

polkola();

skrzydlo();

ogon();

glPushMatrix();

glRotatef(obrot,0.0,1.0,0.0);

smiglo();

glPopMatrix();

}

void sterowanie(void){

glPushMatrix();

glRotatef(pochylenie,0.0,0.0,1.0);

glRotatef(przechylenie,0.0,1.0,0.0);

samolot();

glPopMatrix();

}

//////////////////////////////////////////////////////////////////////////////////////////

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

background image

// 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,-odl);

glTranslatef(0, -h,0);

glRotatef((360/(2*pi))*atan(h), 1, 0, 0);

glRotatef(obr, 0, 1, 0);

// Narysowanie szescianu

sterowanie();

// Przelaczenie buforow ramki

glutSwapBuffers();

}

//////////////////////////////////////////////////////////////////////////////////////////

// Funkcja obslugi klawiatury

void ObslugaKlawiatury(unsigned char klawisz, int x, int y)

{

if(klawisz == '=')

obrot += 10.0;

else if (klawisz == '-')

obrot -= 10.0;

else if (klawisz == 'w'){

pochylenie += 2.0;}

background image

else if (klawisz == 's'){

pochylenie -= 2.0;}

else if (klawisz == 'a'){

przechylenie += 2.0;}

else if (klawisz == 'd'){

przechylenie -= 2.0;}

else if (klawisz == 'p'){

odl += 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:
I6Y3S1 KAROL ZALEWSKI
lab1, Karol Zalewski gr, Karol Zalewski gr
PREZENTACJA skladowanie i przechowywanie paliw Karol Zalewski
Rola mocarstw w regionie Karol Zalewski
Karol Zalewski
PLANY, ocenianie miaraddd, Karol Miarka gr
Sprawozdania Karol, Współczynnik podziału, Gr
ocenianie, Karol Miarka gr
Artykuł recenzja, Karol Miarka gr
Sprawozdania Karol, Trójkąt Gibbsa, Gr
Aksjologia (gr
Budżet i podatki gr A2
SEM odcinek szyjny kregoslupa gr 13 pdg 1
charakterystyka II gr kationów
13 ZACHOWANIA ZDROWOTNE gr wtorek 17;00
termoregulacja gr II
prezentacja edukacja muzyczna gr 3
Diety gr 2

więcej podobnych podstron