SPRAWOZDANIE
Z
PRACY LABORATORYJNEJ
NR 3
Wykonał: Bartosz Zwoliński
Grupa: I0Y2S1
Prowadzący : dr inż. Marek Salamon
Data: 16.12.11r.
Temat: | Przekształcenia geometryczne |
---|
Prędkości kątowej obrotu kół w zakresie [0–10] stopni/klatkę animacji z krokiem 2.5:
- w kierunku CW;
- w kierunku CCW;
Kąta podniesienia armaty w zakresie [0, 45] stopni
W programie uwzględnić możliwość interakcyjnej zmiany położenia obserwatora poprzez podanie następujących parametrów:
Odległości obserwatora od obiektu,
Orientacji obserwatora w zakresie [0, 360] stopni względem osi 0X, 0Y i 0Z
UWAGA: Obserwator jest zawsze zwrócony przodem w kierunku obiektu.
IMPLEMENTACJA:
// Definicja stalych
#define DLUGOSC_BOKU 5.0
#define OBSERWATOR_ODLEGLOSC 50.0
#define OBSERWATOR_OBROT_X 0.0
#define OBSERWATOR_OBROT_Y 90.0
#define OBSERWATOR_OBROT_Z 0.0
#define OBSERWATOR_FOV_Y 30.0
// Zmienne odpowiedzialne za odleglosc i polozenie obserwatora
GLfloat odleglosc = OBSERWATOR_ODLEGLOSC;
GLfloat obrot_x = OBSERWATOR_OBROT_X ;
GLfloat obrot_y = OBSERWATOR_OBROT_Y;
GLfloat obrot_z = OBSERWATOR_OBROT_Z;
// Zmienne pomocniczne
GLfloat obrot =0.0;
GLfloat obrot_kol =0.0;
double kat_lufa = 0.0;
//Funkcja rysująca
void Rysuj()
{
GLUquadricObj *kwadryka; //deklaracja kwadryki ktora bedzie uzywana do tworzenia figur.
glColor3f (1.0,0.0,0.0); // Kolor calego pojazdu
//korpus
glPushMatrix();
glScalef(10.0, 1.4, 2.0);
glutWireCube(1.0);
glPopMatrix();
glPushMatrix();
glTranslatef(0,1.1,0);
glScalef(10.0, 0.8, 4.0);
glutWireCube(1.0);
glPopMatrix();
//KOLA:
//1
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(-3.5, -0.7, 1.0);
glRotatef(obrot, 0, 0, 1); // funkcja umozliwiajaca ustalenie predkosci katowej
gluCylinder(kwadryka, 1, 1, 1, 30, 6);
gluDisk(kwadryka,0,1,10,10);
glTranslatef(0,0,1);
gluDisk(kwadryka,0,1,10,10);
glPopMatrix();
gluDeleteQuadric(kwadryka);
//2
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(-3.5, -0.7, -2.0);
glRotatef(obrot, 0, 0, 1); // funkcja umozliwiajaca ustalenie predkosci katowej
gluCylinder(kwadryka, 1, 1, 1, 30, 6);
gluDisk(kwadryka,0,1,10,10);
glTranslatef(0,0,1);
gluDisk(kwadryka,0,1,10,10);
glPopMatrix();
gluDeleteQuadric(kwadryka);
//3
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(3.5, -0.7, 1.0);
glRotatef(obrot, 0, 0, 1); // funkcja umozliwiajaca ustalenie predkosci katowej
gluCylinder(kwadryka, 1, 1, 1, 30, 6);
gluDisk(kwadryka,0,1,10,10);
glTranslatef(0,0,1);
gluDisk(kwadryka,0,1,10,10);
glPopMatrix();
gluDeleteQuadric(kwadryka);
//4
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(3.5, -0.7, -2.0);
glRotatef(obrot, 0, 0, 1); // funkcja umozliwiajaca ustalenie predkosci katowej
gluCylinder(kwadryka, 1, 1, 1, 30, 6);
gluDisk(kwadryka,0,1,10,10);
glTranslatef(0,0,1);
gluDisk(kwadryka,0,1,10,10);
glPopMatrix();
gluDeleteQuadric(kwadryka);
// Wieza i lufa
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(1.5, 1.5,0);
glRotatef(-90, 1, 0, 0);
gluCylinder(kwadryka, 2.0, 1.0 , 1.1, 20, 5);
gluDeleteQuadric(kwadryka);
kwadryka = gluNewQuadric();
glPushMatrix();
glTranslatef(0, 0, 0.55);
glRotatef(kat_lufa, 0, 1, 0); // funkcja umozliwiajaca zmane kata odchylenia lufy
glRotatef(-90, 0, 1, 0);
gluCylinder(kwadryka, 0.15, 0.15, 4.5, 8, 8);
glPopMatrix();
gluDeleteQuadric(kwadryka);
glPopMatrix();
// Pomocniczy uklad wspolrzednych
glBegin(GL_LINES);
// Os X
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-50.0, 0.0, 0.0);
glVertex3f(50.0, 0.0, 0.0);
// Os Y
glColor3f(0.0,1.0,0.0);
glVertex3f(0.0, -50.0, 0.0);
glVertex3f(0.0, 50.0, 0.0);
// Os Z
glColor3f(0.0,0.0,1.0);
glVertex3f(0.0, 0.0, -50.0);
glVertex3f(0.0, 0.0, 50.0);
glEnd();
}
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja generujaca pojedyncza klatke animacji
//////////////////////////////////////////////////////////////////////////////////////////
void WyswietlObraz(void)
{
// Wyczyszczenie bufora ramki i bufora glebokosci
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
// Powielenie macierzy na wierzcholku stosu
glPushMatrix();
// Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych
// sceny do ukladu wspolrzednych obserwatora).
// Funkcje zmiany odleglosci i polozenia obserwatora
glTranslatef(0, 0, -odleglosc);
glRotatef(obrot_x, 1, 0, 0);
glRotatef(obrot_y,0,1,0);
glRotatef(obrot_z, 0, 0, 1);
// Definicja zmiennej pomocniczej(obrot wiezy)
obrot = (obrot < 360) ? obrot + obrot_kol : 0;
// Generacja obrazu sceny w niewidocznym buforze ramki
Rysuj();
// Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu
// sprzed wywolania funkcji)
glPopMatrix();
// Przelaczenie buforow ramki
glutSwapBuffers();
}
/* Funkcja obslugi klawiatury */
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
double ob=1.0;
switch(klawisz)
{
// Zmiana odleglosci obserwatora
case '+':
if(odleglosc>0)
odleglosc-=1;
break;
case '-':
odleglosc+=1;
break;
//UWAGA: Dla potrzeb odpowiednej wizualizacji zmiany predkosci katowej, paramtery zostaly
//zmniejszone 20 krotnie.(max predkosci: 10/20=0,5 skok poziomow: 2.5/20=0.125)
case 'a':
if(obrot_kol>=-0.5)
obrot_kol-=0.125;
break;
case 'd':
if(obrot_kol<=0.5)
obrot_kol+=0.125;
break;
// Zmiana kata odchylenia lufy w zakresie<0;45>
case 's':
if (kat_lufa >= 0.0)
kat_lufa-=1;
break;
case 'w':
if (kat_lufa <= 45.0)
kat_lufa+=1;
break;
case 27:
exit(0);
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////
// Funkcja obslugi zdarzen specjalnych
void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
{
switch (klawisz)
{
// OBORT OS X
case GLUT_KEY_DOWN:
obrot_x += 1;
break;
case GLUT_KEY_UP:
obrot_x-= 1;
break;
// OBROT OS Y
case GLUT_KEY_LEFT:
obrot_y -= 1;
break;
case GLUT_KEY_RIGHT:
obrot_y+= 1;
break;
// obrot OS Z
case GLUT_KEY_HOME:
obrot_z+=1;
break;
case GLUT_KEY_END:
obrot_z-=1;
break;
}
// odrysowanie okna
UstawParametryWidoku(glutGet(GLUT_WINDOW_WIDTH),glutGet(GLUT_WINDOW_HEIGHT));
}
ZAŁĄCZNIKI:
UWAGA: Dla potrzeb własnych zmieniłem wartość parametrów funkcji glClearColor na podana niżej:
„glClearColor (1.0f, 1.0f, 1.0f, 1.0f);” //kolor tla: biały
-Zobrazowanie zmiany orientacji oraz odległości położenia obserwatora(Załącznik 1,2,4,5,6)
-Zobrazowanie zmiany odchylenia kata lufy pojazdu (Załącznik 3,4,5,6)
WNIOSKI:
Mój sposób rozwiązania problemu, uwzględniający wszystkie warunki zadane w poleceniu, działa poprawianie. Na zajęciach nie udało mi się zaimplementować poprawnie zmiany prędkości kątowych dla kół, w tym projekcie udało mi się uzyskać wszystkie wymagane efekty. Działanie na prymitywach przestrzennych bibliotek GLU i GLUT można powiedzieć są bardzo podobne do tych z funkcji modelowania geometrycznego bibliotek OpenGL, aczkolwiek są prostsze w użyciu i uważam są czytelniejsze. W bibliotekach GLU i GLUT używamy już tak naprawdę gotowych figur, które modelujemy głównie za pomocą skalacji, translacji i rotacji co bardzo skraca nam czas pisania takich projektów w porównaniu z tymi z OpenGL. Biblioteki używane na tych laboratoriach posiadają duże możliwości, a wraz z wcześniej wymienionym zaletami, tworzą z nich potężne narzędzie do pracy. Warte jest uwagi, że doświadczenie zbierane z kolejnymi laboratoriami są bardzo pomocne przy pracy w następnych, co za tym idzie, osoby, mające większe doświadczenie z tego typu pracami, są w stanie wykonać imponujące prace dla oczu zwykłego ‘śmiertelnika’.