28 grudnia 2009
Wojskowa Akademia Techniczna
Sprawozdanie
Grafika Komputerowa
Laboratorium nr 4: Przekształcenia geometryczne.
(zadanie 3)
Prowadzący zajęcia:
mgr inż. Sulej Wojciech
Sprawozdanie wykonał:
Grupa:
I. Treść zadania.
Napisać program przedstawiający obiekt zbudowany z prymitywów przestrzennych udostępnionych przez biblioteki GLU i GLUT. Użytkownik za pomocą klawiatury powinien mieć możliwość wprowadzania zmian następujących parametrów:
Kąta obrotu śmigła,
Kąta odchylenia, pochylenia i przechylenia rakiety.
W programie uwzględnić możliwość interaktywnej zmiany położenia obserwatora poprzez podanie następujących parametrów:
Odległość obserwatora od obiektu,
Wysokości obserwatora względem płaszczyzny, na której położony jest obiekt,
Kąta obrotu wokół obiektu w zakresie [0, 360] z krokiem 1.
Uwaga: Obserwator jest zawsze zwrócony przodem w kierunku obiektu.
II. Rysunek poglądowy.
III. Wstęp teoretyczny.
Do realizacji zadania wykorzystane zostały funkcje biblioteki GLUT oraz GLU:
podstawowe:
PushMatrix(); - Szczególnie przydatna, dzięki niej nie trzeba za każdym razem rozpoczynać modelowania i rysowania w już zmienionym układzie. Odkłada macierz przekształcenia na stos. Wywołujemy ją na początku każdego przekształcenia układu współrzędnych. Zapamiętuje ona kolejne transformacje w zadanej kolejności.
PopMatrix(); - Pobiera odłożoną na stos macierz przekształcenia, a następnie wykonuje odpowiednie transformacje.
przekształcające układ współrzędny:
glTranslatef(x,y,z); - przenosi ona środek układu o wektor = [x,y,z] gdzie x,y,z są typu float.
glRotatef(a,x,y,z); - obraca układ o kąt a podany przez nas w stopniach w kierunku przeciwnym do ruchu wskazówek zegara wokół wektora [x,y,z]
glScalef(sx,sy,sz); - nakłada skalowanie wzdłuż osi X - współczynnik skali sx, osi Y - współczynnik skali sy, osi Z - współczynnik skali sz.
rysujące bryły:
glutWireSphere(r,pol,row); - Wstawia sferę ze środkiem w początku układu współrzędnych o promieniu r i ilości południków pol oraz ilości równoleżników row.
glutSolidCube(a); - Wstawia sześcian ze środkiem w początku układu współrzędnych o boku a. Ściany jego są wypełnione kolorem w przeciwieństwie do funkcji glutWireCube(a);.
gluCylinder(obj,r1,r2,h,pol,row); - Wstawia cylinder ze środkiem w początku układu współrzędnych o promieniach dolnym r1 i górnym r2, wysokości h oraz liczbie południków pol i liczbie równoleżników row.
gluDisk(obj,r1,r2,pol,row); - Wstawia dysk ze środkiem w początku układu współrzędnych o promieniu środkowym r1, promieniu zewnętrznym r2 oraz liczbie południków pol i liczbie równoleżników row.
IV. Zamodelowanie obiektu.
1. Trzon samolotu:
glPushMatrix();
//sciany trzonu
//cylinder
glTranslatef(0.0, 0.0, -5.0);
gluCylinder(trzon, 0.76, 0.76, 10.0, 45, 45);
//zamkniecie cylindra tylnie dyskiem
gluDisk(trzon, 0, 0.76, 35, 35);
//zamkniecie cylindra przednie sfera
glTranslatef(0.0, 0.0, 10.0);
gluSphere(trzon, 0.75, 25, 25);
glPopMatrix();
W powyższym fragmencie kodu zamodelowałem trzon samolotu składający się z głównego modułu - cylindra (bez podstaw) w środku układu współrzędnych oraz jego zakończeń. Tylnym zakończeniem jest cylinder zaś przednim sfera. Obie figury o promieniu równym promieniowi cylindra po uwzględnieniu odpowiednich przesunięć.
2. Główne skrzydło:
glPushMatrix();
glTranslatef(0.0, 0.76-0.125, 0.0);
glScalef(8.0, 0.25, 3);
glutWireCube(1);
glPopMatrix();
Koniecznym do narysowania skrzydła w odpowiednich proporcjach było przesunięcie pkt. z którego było ono rysowane na promień samolotu z korektą połowy grubości samego skrzydła. Następnie sześcian w układzie został przeskalowany - dla nadania mu odpowiedniego kształtu - i narysowany.
3. Ogon pionowy:
glPushMatrix();
glTranslatef(0.0, 0.76+1, -5.0+0.75);
glScalef(0.25, 2.0, 1.5);
glutWireCube(1);
glPopMatrix();
Analogicznie do skrzydła głównego zmieniamy pkt. rysowania oraz skalujemy i rysujemy figurę.
4. Stateczniki:
glPushMatrix();
glTranslatef(0.76+1, 0.0, -5.0+0.75);
glScalef(2.0, 0.25, 1.5);
glutWireCube(1);
glTranslatef(-(0.76+1), 0.0, 0.0);
glutWireCube(1);
glPopMatrix();
Ten fragment kodu jest również analogiczny do poprzednich. Rysujemy dwa sześciany wcześniej odpowiednio skalując i przesuwając układy współrzędnych.
5. Belka śmigła
glRotatef(parametr, 0, 0, 1);
glPushMatrix();
glTranslatef(0.0, 0.0, 5.0+0.75+0.125);
glScalef(0.25, 4.0, 0.25);
glutWireCube(1);
glPopMatrix();
Funkcja glRotate umieszczona w tym miejscu pozwala nam na sterowanie śmigłem za pomocą parametru. Jako argumenty przyjmuje kąt obrotu oraz oznaczenie wektora względem którego śmigło będzie się obracać. Dale podobnie jak poprzednio skalujemy, dokonujemy translacji i rysujemy sześcian.
V. Sterowanie.
Sterowanie obiektem realizujemy poprzez przypisanie odpowiednim klawiszom zminy parametrów, przy czym efekt obracania całego samolotu uzyskujemy przez umieszczenie odpowiednich instrukcji na początku funkcji rysującej:
//translacja punktu przesuwania
glTranslatef(0.0, 0.0, -5.0);
//odchylanie pionowe
glRotatef(rotPOZ, 1, 0, 0);
//odchylanie poziome
glRotatef(rotPIO, 0, 1, 0);
//obracanie wkolo wlasnej osi
glRotatef(rotOBR, 0, 0, 1);
//powrót do środka układu
glTranslatef(0.0, 0.0, +5.0);
Wpływają one na całość wykonywanych po nich instrukcji w tej funkcji.
V. Zrzuty ekranu.
Zrzut1. Pozycja wyjściowa.
Zrzut2. Przykładowe przemieszczenie obiektu.
VI. Wnioski.
Po zaprogramowaniu zadanych działań na obrazie mogę stwierdzić, iż jest to praca wymagająca sprawnej wyobraźni i dokładności. Podczas tego laboratorium zapoznaliśmy się z modelowaniem bardziej skomplikowanych obiektów zbudowanych z wielu prymitywów. Było ono jednak prostsze ze względu na możliwość wykorzystania prymitywów przestrzennych dostępnych w bibliotekach GLU i GLUT. Ponadto do obiektu zostały dodane efekty ruchomości poprzez sterowanie zdefiniowanymi klawiszami.