SPRAWKO LAB 3

WOJSKOWA AKADEMIA TECHNICZNA

LABORATORIUM

GRAFIKA KOMPUTEROWA

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

Zadanie:

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. Prędkości kątowej obrotu kół w zakresie [0–10] stopni/klatkę animacji z krokiem 2.5:
    - w kierunku CW;
    - w kierunku CCW;

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

  1. Odległości obserwatora od obiektu,

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


Wyszukiwarka

Podobne podstrony:
sprawko lab 5
sprawko lab 2
sprawka, Lab GRUNTY , Albert Grochowski
Sprawka Lab, Bomba Kalorymetryczna - spr, Ćwiczenie nr:
sprawko lab 2 stare
Badania energetyczne obrabiarek sprawko [LAB 4] Badania energet (2)
Sprawka Lab, pompaciepła - spr, WIMiR
Sprawka, Lab 5
Sprawka, Lab 5
TECHNIKA CYFROWA - sprawko lab 1, Studia, PWR, 4 semestr, Podstawy techniki mikroprocesorowej, labor
Sprawko lab 4 przts
TECHNIKA CYFROWA - sprawko lab 4, Studia, PWR, 4 semestr, Podstawy techniki mikroprocesorowej, labor
TECHNIKA CYFROWA - sprawko lab 5, Studia, PWR, 4 semestr, Podstawy techniki mikroprocesorowej, labor
Sprawko1 lab PA Romaszko, AGH WIMIR AiR, Semestr 3, PA, laborki, sprawko lab1 PA
sprawko 66 stała Plancka, ATH - ZiIP, Inne semestry, Fizyka - ćw, sprawka - lab
sprawko 61 sonda płomykowa, ATH - ZiIP, Inne semestry, Fizyka - ćw, sprawka - lab
Badania energetyczne obrabiarek - sprawko, [LAB.4] Badania energetyczne obrabiarek, SPRAWOZDANIE Z O
Sprawko lab 3 przts
sprawko lab śruby

więcej podobnych podstron