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
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
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:
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();
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
Pierwsze poło enie samolotu:
Drugie poło enie samolotu:
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';
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));
}
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();
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;
// 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;}
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);
// 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;
}