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;