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:

  1. Kąta obrotu śmigła,

  2. 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:

  1. Odległość obserwatora od obiektu,

  2. Wysokości obserwatora względem płaszczyzny, na której położony jest obiekt,

  3. 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.

0x01 graphic

III. Wstęp teoretyczny.

Do realizacji zadania wykorzystane zostały funkcje biblioteki GLUT oraz GLU:

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.

0x01 graphic

Zrzut1. Pozycja wyjściowa.

0x01 graphic
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.