Jędrzejuk

Wojskowa Akademia Techniczna

im. Jarosława Dąbrowskiego

Laboratorium Grafiki Komputerowej

Sprawozdanie z ćwiczenia laboratoryjnego nr 3

Temat: Modelowanie prostych obiektów przy pomocy prymitywów

Kamil Jędrzejuk Prowadzący: dr. inż. Marek Salomon

Grupa I8X4S1

Data wykonania ćwiczenia 04.01.10

  1. 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. Prędkości kątowej obrotu śmigła w zakresie [0-10] stopni/klatkę animacji z krokiem 1 w kierunku CCW

  2. Prędkości kątowej lotu samolotu po okręgu o promieniu 30 wokół osi Y (y=4.0) w zakresie [0-5] stopni/klatkę animacji z krokiem 0.25 w kierunku CW.

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, 0Z

  3. Obserwator jest zawsze zwrócony przodem w kierunku obiektu

2. Funkcje biblioteki GLUT i GLU umożliwiające tworzenie prymitywów przestrzennych

PushMatrix() - kopiuje ona aktywną macierz przekształcenia i odkłada na stosie .

PopMatrix() - zdejmuje aktywną macierz ze stosu

glTranslatef(x,y,z) - translacja o wektor [x,y,z]

glRotatef(a,x,y,z) - rotacja o kąt a wokół wektora [x,y,z]

glScalef(sx,sy,sz) – skaluje wzdłuż osi x,y,z

glutWireSphere(r,pol,row) - tworzy sferę o promieniu r ,a także nanosi na nią równoleżniki i południki pol-liczba południków, row – liczba równoleżników

glutSolidCube(a) - tworzy sześcian o boku a

gluCylinder(obj,r1,r2,h,pol,row) - tworzy cylinder o promieniu dolnym i górnym oraz wysokości h pol ,row oznaczają liczbę południków i równoleżników

gluDisk(obj,r1,r2,pol,row) - tworzy dysk ze o promieniu środkowym r1, promieniu zewnętrznym r2 oraz liczbie południków pol i liczbie równoleżników row

3. Wykonanie zadania

Pod czas zajęć laboratoryjnych trzeba było zamodelować samolot widoczny na poniższym rysunku:

Poszczególne etapy modelowania:

a) Kadłub

Kadłub samolotu jest cylindrem o długości 10 i o promieniu r dolnym i górnym równym 0.75 .Dzięki funkcjom glRotatef i glTranslatef mamy możliwość odpowiedniego ustawienia kadłuba .

glPushMatrix();

glRotatef(0, 1, 0, 0);

glTranslatef(0.0, 0.0, -5.0);

gluCylinder(kadlub, 0.75, 0.75, 10.0, 20, 4);//tworzy cylinder

glPopMatrix();

b) Przednia część kadłuba

Przednią część kadłuba samolotu tworzy sfera , która jest odpowiednio przesunięta do wewnątrz cylindra . Funkcja glutWireSphere tworzy sferę o odpowiednich wymiarach przekazanych do parametrów funkcji.

glPushMatrix();

glTranslatef(0.0, 0.0, 5.0);

glutWireSphere(0.75, 6, 6);

glPopMatrix();

c) Tylna część kadłuba

Tylna część kadłubu to dysk ,który imituje podstawę cylindra. W celu zamodelowania tej części użyłem funkcji gluDisk

glPushMatrix();

glTranslatef(0.0, 0.0, -5.0);// odpowiednie przesuniecie dysku

gluDisk(kadlub_2, 0.2, .75, 20, 4);

glPopMatrix();

d) Skrzydla

Skrzydło samolotu jest modelowane za pomocą funkcji glutSolidCube , która tworzy sześcian za pomocą funkcji glScalef został on przeskalowany tak aby imitował kształt skrzydła

glPushMatrix();

glTranslatef(0.0, .75-.25/2, 2.0);//polozenie skrzydla

glScalef(8.0, 0.25, 3);//ustawianie wymiarow dla skrzydla

glutSolidCube(1);

glPopMatrix();

e) Statecznik poziomy

Statecznik poziomy został zamodelowany w identyczny sposób jak skrzydła samolotu

glPushMatrix();

glTranslatef(0.0, 0, -4.25);

glScalef(4+.75*2, -.25, 1.5);

glutSolidCube(1); );//tworzy szescian o boku 1

glPopMatrix();

f) Statecznik pionowy

Statecznik pionowy jest modelowany znowu przy użyciu funkcji glutSolidCube . Dzięki odpowiedniemu przeskalowaniu przez funkcję glScalef uzuyskujemy właściwy kształt

glPushMatrix();

glRotatef(90, 0, 0, 1);

glTranslatef(1.5, 0.25, -4.25);

glScalef(2.0, 0.25, 1.5);//wymiary statecznika pionowego

glutSolidCube(1);

glPopMatrix();

g) Śmigło samolotu

Śmigło samolotu dzięki funkcji glRotatef ma możliwość obrotu względem swojego środka. Jest ono umieszczone na początku kadłubu poprzez odpowiednią translacje o wektor [x,y,z] . Obrót śmigła polega na zmianie wartości parametru rotSmiglaK

glPushMatrix();

glRotatef(-rotSmiglaK, 0, 0, 1);//obrot smigla

glRotatef(90, 0, 0, 1);

glTranslatef(0, 0, 6.00-0.25/2);//polozenie smigla

glScalef(4, 0.25, 0.25); //wymiary smigla

glutSolidCube(1);

glPopMatrix();

4.) Sterowanie

Q – przyśpieszanie lotu samolotu

W- spowalnianie lotu samolotu

E – zwiększanie prędkości obrotowej śmigła

R- spowalnianie prędkości obrotowej śmigła

Key_Up – przybliżanie obserwatora

Key_Down – oddalenia obserwatora

Key_Left – obrót w lewo względem osi Y

Ket_Right – obrót w prawo względem osi Y

Key_Home – obrót w lewo względem osi X

Key_Page_Up - obrót w prawo względem osi X

Key_End- obrót w prawo względem osi Z

Key_Page_Down- obrót w lewo względem osi X

5.) Końcowy efekt

6.) Wnioski

Celem laboratorium było modelowanie obiektów 3d,lecz tym razem z wykorzystaniem dostępnych bibliotek GLU i GLUT. Dodatkowo zamodelowany obiekt mógł się przemieszczać. Moim zadaniem było stworzenie obiektu imitującego samolot. Dodatkowym utrudnieniem tego zadania było sprawienie animacji ruchu śmigła. W programie trzeba było ,także 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,0Z.

7.) Kod źródłowy

#include <GL/glut.h>

#include <math.h>

// Stale wyznaczajace predkosci katowe planety i ksiezyca (w stopniach/sek.)

#define PREDKOSC_KATOWA_PLANETY 1.0

#define PREDKOSC_KATOWA_KSIEZYCA -5.0

// Wskazniki do wykorzystywanych kwadryk

GLUquadricObj *kadlub; // wskaźnik kadlub samolotu

GLUquadricObj *kadlub_2;//tyl kadluba

GLfloat lotV = 0.250;

GLfloat lotK = 0.0;

GLfloat rotSmiglaV = 1.0;

GLfloat rotSmiglaK = 0.0;

GLfloat odlObs = -70.0;

GLfloat rotObsY = 40.0;

GLfloat rotObsX = 40.0;

GLfloat rotObsZ = 0.0;

GLfloat rotPodstawy = 0.0;

GLfloat rotRamienia1= 40.0;

GLfloat rotRamienia2= -40.0;

GLfloat rotGlowicy = 20.0;

GLfloat rozUchwytow = 0.5;

GLfloat promien=30.0;

//////////////////////////////////////////////////////////////////////////////////////////

// Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki

//

void InicjujRamieRobota(void)

{

// Zainicjowanie kadlubu samolotu

kadlub = gluNewQuadric();

gluQuadricDrawStyle(kadlub, GLU_LINE);

kadlub_2 = gluNewQuadric();

gluQuadricDrawStyle(kadlub_2, GLU_LINE);

}

//////////////////////////////////////////////////////////////////////////////////////////

// Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora

// Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1

void Rysuj_samolot(GLfloat promien)

{

// Pocztaek tworzenia ukladu wspolrzednych

glBegin(GL_LINES);

// Os X

glColor3f(1.0, 0.0, 0.0);

glVertex3f(-20.0, 0.0, 0.0);

glVertex3f(20.0, 0.0, 0.0);

// Os Y

glColor3f(0.0,1.0,0.0);

glVertex3f(0.0, -20.0, 0.0);

glVertex3f(0.0, 20.0, 0.0);

// Os Z

glColor3f(0.0,0.0,1.0);

glVertex3f(0.0, 0.0, -20.0);

glVertex3f(0.0, 0.0, 20.0);

// Koniec tworzenia ukladu wspolrzednych

glEnd();

glColor3f(1.0,1.0,1.0);

////////////////////////////////////////////

//Rysowanie poszczegolnych czesci samolotu//

////////////////////////////////////////////

glPushMatrix(); // Przygotowanie stosu macierzy modelowania

glRotatef(-lotK, 0, 1, 0);

glTranslatef(promien, 4.0, 0.0);//Promien po jakim porusza sie samolot 30

//rysowanie kadluba

glPushMatrix();

glRotatef(0, 1, 0, 0);//obrot

glTranslatef(0.0, 0.0, -5.0);

gluCylinder(kadlub, 0.75, 0.75, 10.0, 20, 4);

glPopMatrix();

//rysowanie tylniej czesci kadluba samolotu podstwa cylindra

glPushMatrix();

glTranslatef(0.0, 0.0, -5.0);

gluDisk(kadlub_2, 0.2, .75, 20, 4);

glPopMatrix();

//rysowanie przedniej czesci kadluba samolotu

glPushMatrix();

glTranslatef(0.0, 0.0, 5.0);

glutWireSphere(0.75, 6, 6);

glPopMatrix();

glColor3f(0.3,0.0,0.5);

//rysowanie skrzydel

glPushMatrix();

glTranslatef(0.0, .75-.25/2, 2.0);//polozenie skrzydla

glScalef(8.0, 0.25, 3);//ustawianie wymiarow dla skrzydla sklalowanie wzdluz osi 1*8 ,0.25*1,3*1

glutSolidCube(1);

glPopMatrix();

//rysowanie statecznika poziomego

glPushMatrix();

glTranslatef(0.0, 0, -4.25);

glScalef(4+.75*2, -.25, 1.5);

glutSolidCube(1);

glPopMatrix();

//rysowanie statecznika pionowego

glPushMatrix();

glRotatef(90, 0, 0, 1);

glTranslatef(1.5, 0.25, -4.25);

glScalef(2.0, 0.25, 1.5);//wymiary statecznika pionowego

glutSolidCube(1);

glPopMatrix();

//rysowanie smigla samolotu

glPushMatrix();

glRotatef(-rotSmiglaK, 0, 0, 1);//obrot smigla

glRotatef(90, 0, 0, 1);

glTranslatef(0, 0, 6.00-0.25/2);//polozenie smigla

glScalef(4, 0.25, 0.25); //wymiary smigla

glutSolidCube(1);

glPopMatrix();

glPopMatrix(); // Posprzatanie na stosie macierzy modelowania

}

////////////////////////////////////////////////

void WyswietlObraz(void)

{

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Wyczyszczenie bufora ramki i bufora glebokosci

glPushMatrix(); // Powielenie macierzy na wierzcholku stosu

// Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych sceny do ukladu wspolrzednych obserwatora).

glTranslatef(0, 0, odlObs);

glRotatef(rotObsX, 1, 0, 0);

glRotatef(rotObsY,0,1,0);

glRotatef(rotObsZ,0,0,1);

rotSmiglaK = (rotSmiglaK < 360) ? rotSmiglaK + rotSmiglaV : 0; //obrot smigla

lotK = (lotK < 360) ? lotK + lotV : 0; //lot samolotu

Rysuj_samolot(promien); // Generacja obrazu sceny w niewidocznym buforze ramki

glPopMatrix(); // Usuniecie macierzy lezacej na wierzcholku stosu (powrot do stanu sprzed wywolania funkcji)

glutSwapBuffers(); // Przelaczenie buforow ramki

}

//////////////////////////////////////////////////////////////////////////////////////////

// Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu

void UstawParametryWidoku(int szerokosc, int wysokosc)

{

glViewport(0, 0, szerokosc, wysokosc); // Ustawienie parametrow viewportu

// Przejscie w tryb modyfikacji macierzy rzutowania

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);

glMatrixMode(GL_MODELVIEW); // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych

glLoadIdentity(); // Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa

}

//////////////////////////////////////////////////////////////////////////////////////////

// Funkcja klawiszy specjalnych

void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)

{

switch(klawisz)

{

// ustawianie odleglosci obserwatora

case GLUT_KEY_UP:

odlObs = (odlObs < 0.0) ? odlObs + 1.0 : odlObs;

break;

case GLUT_KEY_DOWN:

odlObs = (odlObs > -200.0) ? odlObs - 1.0 : odlObs;

break;

// obracanie osia Y

case GLUT_KEY_LEFT:

rotObsY = (rotObsY > 0) ? rotObsY - 1.0 : rotObsY;

break;

case GLUT_KEY_RIGHT:

rotObsY = (rotObsY < 360.0) ? rotObsY + 1.0 : rotObsY;

break;

// obracanie osia X

case GLUT_KEY_HOME:

rotObsX = (rotObsX > 0) ? rotObsX - 1.0 : rotObsX;

break;

case GLUT_KEY_PAGE_UP:

rotObsX = (rotObsX < 360.0) ? rotObsX + 1.0 : rotObsX;

break;

// obracanie osia Z

case GLUT_KEY_END:

rotObsZ = (rotObsZ > 0) ? rotObsZ - 1.0 : rotObsZ;

break;

case GLUT_KEY_PAGE_DOWN:

rotObsZ = (rotObsZ < 360.0) ? rotObsZ + 1.0 : rotObsZ;

break;

}

}

void ObslugaKlawiatury(unsigned char klawisz, int x, int y)

{

switch(klawisz)

{

// sterowanie predkoscia samolotu

case 'q':

lotV = (lotV < 5 ) ? lotV + .25 : 5; //maksymalna predkosc samolotu 5

break;

case 'w':

lotV = (lotV > 0) ? lotV - .25 : 0;

break;

// sterowanie predkoscia smigla

case 'e':

rotSmiglaV = (rotSmiglaV < 10.0) ? rotSmiglaV + 1.0 : 10; //maksymalna predkosc smigla 10

lotV=lotV+log10(rotSmiglaV)/rotSmiglaV;

break;

case 'r':

rotSmiglaV = (rotSmiglaV > 0.0) ? rotSmiglaV - 1.0 : 0;

lotV=lotV-log10(rotSmiglaV)/rotSmiglaV;

break;

}

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(900, 900);

// Utworzenie okna

glutCreateWindow("Wieza z klockow");

// Odblokowanie bufora glebokosci

glEnable(GL_DEPTH_TEST);

// Ustawienie funkcji wykonywanej na danych w buforze glebokosci

glDepthFunc(GL_LEQUAL);

// Ustawienie wartosci czyszczacej zawartosc bufora glebokosci

glClearDepth(1000.0);

// Ustawienie koloru czyszczenia bufora ramki

glClearColor (0.0, 0.3, 0.0, 0.0);

// Zarejestrowanie funkcji (callback) wyswietlajacej

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); //animacja

// Zarejestrowanie funkcji obslugi klawiatury

glutKeyboardFunc(ObslugaKlawiatury);

// Zarejestrowanie funkcji obslugi klawiszy specjalnych

glutSpecialFunc(ObslugaKlawiszySpecjalnych);

// Zainicjowanie kwadryk tworzacych ramie robota

InicjujRamieRobota();

// Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow

// w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)

glutMainLoop();

return 0;

}


Wyszukiwarka

Podobne podstrony:
4 jedrzejów łaczyn, Inżynieria Środowiska PŚk, Semestr 2, Hydrogeologia 1, projekt
Rachunek Kosztow zadanie Jedrzejczak Gas
Jędrzejczyk J K Zwalcz stres
Język satyry okupacyjnej (referat E[1]. Jędrzejko), gramatyka historyczna
filemonowicz jedrzejek radziulis
Jędrzejko, 2009
ARCHITEKTURA Jedrzejów 2
jedrzejów diament
mszaki jedrzejko
POMIAR ILOŚCI DNA W PRÓBIE, Laboratoria dr Jedrzejczak, INNE
Archiwum Podworskie Mierów, Jędrzejowiczów
Jedrzejczyk J K Podstawy zwalczania stresu
filemonowicz jedrzejek radziulis

więcej podobnych podstron