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;
Tworzy obiekt Quadric
trzon=gluNewQuadric();
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();
Tworzy obiekt
GLUquadricObj *uchwyt;
uchwyt
uchwyt=gluNewQuadric();
Ustawia kolor na czarny
glColor3f(255,255,255);
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
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.