WOJSKOWA AKADEMIA TECHNICZNA
LABORATORIUM GRAFIKA KOMPUTEROWA
SPRAWOZDANIE:
Laboratorium 3 – modelowanie obiektów za pomocą
prymitywów
Przestrzennych
PROWADZADZĄCY:
dr inż. Marek Salamon
WYKONAŁ:
Mateusz Faustman I7X1N1
DATA:
06.02.2009
1.
Treść zadania:
Zadanie polegało na napisaniu programu który przy pomocy biblioteki GLUT narysuje lampę
stworzoną z prymitywów.
Użytkownik za pomocą klawiatury powinien mieć możliwość
wprowadzenia zmian następujących parametrów:
a)
Zmiana wysokości lampy pod – odchylenie w górę +60 stopni, odchylenie w dół -30 stopni
b)
Obrót ramienia lampy
W programie należało uwzględnić możliwość interakcyjnej zmiany położenia obserwatora
poprzez
podanie następujących parametrów:
a)
Odległości obserwatora od obiektu
b)
Orientacji obserwatora w zakresie [0, 360] stopni względem osi OX OY i OZ.
2) Kod funkcji realizujących zadanie wraz z opisem
void RysujLampke()
{
glClearColor(0,0,0,0) ;
glBegin(GL_LINES);
uklad(ukl);
glEnd();
glPushMatrix();
// podstawa
glPushMatrix();
GLUquadricObj *trzon;
trzon=gluNewQuadric();
Tworzy obiekt Quadric
glColor3f(255,255,255);
Ustawia kolor na czarny
glTranslatef(0.0,0.5,0.0);
Zaczyna rysowanie w pkt 0;0,5;0
glRotatef(90.0,1,0,0);
Obrót o 90 stopni względem osi X
gluCylinder(trzon,2.5,2.5,0.5,20,15);
Tworzy cylinder o promieniu 5
gluDisk(trzon,0,2.5,20,15);
Tworzy górną podstawę
glTranslatef(0,0,0.5);
gluDisk(trzon,0,2.5,20,15);
Tworzy dolną podstawę
gluDeleteQuadric(trzon);
glPopMatrix();
//pozioma
glPushMatrix();
glColor3f(255,255,255);
Ustawia kolor na czarny
glTranslatef(0,3,0);
Zaczyna rysowanie w pkt 0;3;0
glScalef(1,10,1);
glRotatef(obr_w_prawo,0,1,0);
Obraca zgodnie zwartością parametru obr_w_prawo
glutWireCube(0.5);
Tworzy sześcian o boku 0,5
glPopMatrix();
//pionowa
glPushMatrix();
glRotatef(obr_w_prawo,0,1,0);
Obraca zgodnie z aktualną wartością parametru obr_w_prawo
glTranslatef(0,5,0);
Przemieszcza obiekt o 5 jednostek po osi Y
glRotated(obr_w_lewo,0,0,1);
Obraca zgodnie z aktualną wartością parametru obr_w_lewo
glTranslatef(-1.5,0,0.5);
Przemieszcza obiekt o -1,5X, 0Y, 0,5Z
glPushMatrix();
glScalef(20,1,1);
Skaluje w x,y,z
glutWireCube(0.25);
Tworzy sześcian o boku 025
glPopMatrix();
//uchwyt
glPushMatrix();
GLUquadricObj *uchwyt;
Tworzy obiekt
uchwyt
uchwyt=gluNewQuadric();
glColor3f(255,255,255);
Ustawia kolor na czarny
glTranslatef(-2.75,0.5,0.0);
Zaczyna rysowanie w pkt -2,7;0,5;0
glRotatef(90,1,0,0);
Obrót o 90 stopni względem osi X
gluCylinder(uchwyt,0.25,0.25,1.0,20,15);
Tworzy cylinder
gluDisk(trzon,0,0.25,20,15);
Tworzy pokrywe górną cylindra
gluDeleteQuadric(uchwyt);
usuwa obiekt uchwyt
glPopMatrix();
// abazur
glPushMatrix();
GLUquadricObj *abazur;
Tworzy obiekt abazur
abazur=gluNewQuadric();
glColor3f(255,255,255);
Ustawia kolor na czarny
glTranslatef(-2.75,-0.5,0.0);
Zaczyna rysowanie w pkt -2,7;0,5;0
glRotatef(90.0,1,0,0);
Obrót o 90 stopni względem osi X
gluCylinder(abazur,0.5,1.0,1.0,20,15);
Tworzy cylinder o górnej podstawie 0,5 i dolnej 1
gluDisk(trzon,0,0.5,20,15);
Tworzy górną podstawę cylindra
gluDeleteQuadric(abazur);
która jest jednocześnie dolna podstawa uchwytu
glPopMatrix();
glPopMatrix();
glPopMatrix();
}
void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
{
switch (klawisz)
{
case '
x
' : OBSERWATOR_OBROT_X ++; break;
case '
X
' : OBSERWATOR_OBROT_X --; break;
case '
y
' : OBSERWATOR_OBROT_Y ++; break;
case '
Y
' : OBSERWATOR_OBROT_Y --; break;
case '
z
' : OBSERWATOR_OBROT_Z ++; break;
case '
Z
' : OBSERWATOR_OBROT_Z --; break;
case '
o
' : OBSERWATOR_ODLEGLOSC ++; break;
case '
O
' : OBSERWATOR_ODLEGLOSC --; break;
case '
r
' : obr_w_prawo++; break;
case
'l
' : obr_w_prawo--; break;
case '
d
' : if(obr_w_lewo<30)obr_w_lewo++; break;
case '
g
' : if(obr_w_lewo>-60)obr_w_lewo--; break;
case '
u
' : if(ukl==1)ukl=0;else ukl=1;break;
case
27
: exit(0); break; //esc
3)Wnioski:
Podczas tego laboratorium zapoznaliśmy się z modelowaniem bardziej skomplikowanych
obiektów niż na poprzednich laboratoriach. Tym razem wykorzystaliśmy prymitywy
przestrzenne dostępne w bibliotekach GLU oraz GLUT co zdecydowanie ułatwia
modelowanie takich obiektów w porównaniu do metod wykorzystywanych na poprzednim
laboratorium. Dzięki prymitywom nie trzeba już kodować funkcji odpowiedzialnych za
narysowanie figury, wystarczy podać parametry i położenie.