sprawozdanie (25)

WOJSKOWA AKADEMIA TECHNICZNA

GRAFIKA KOMPUTEROWA

SPRAWOZDANIE

Z

ZADANIA LABORATORYJNEGO

MODELOWANIE OŚWIETLENIA

Grupa szkoleniowa: I7X6S1

Sprawozdanie wykonał : Michał Małek

Prowadzący ćwiczenie: dr inż. Marek Salamon

  1. Treść zadania.

Wykorzystując biblioteki OpenGL i GLUT napisać program przedstawiający perspektywiczny obraz obiektu o następujących parametrach:

1. Typ obiektu: sfera o zmiennej parzystej liczbie podziałów pionowych i poziomych,

2. Właściwości materiału nr 1: zielony matowy (widziany w białym świetle),

3. Właściwości materiału nr 2: fioletowy błyszczący (widziany w białym świetle),

Sposób przyporządkowania materiałów do obiektu zgodnie ze wzorem : szachownica z uwzględnieniem podziałów poziomych i pionowych.

Obiekt należy oświetlić dwoma źródłami światła o następujących parametrach:

Źródło nr 1:

typ: reflektor (ang. spot),

kolor: żółty,

natężenie: 1,

kąt odcięcia: 45o,

położenie: zmienne po orbicie kołowej o środku w punkcie S(0,0,0) z możliwością interaktywnej zmiany następujących parametrów:

- promienia orbity,

- kąta nachylenia orbity do osi OX,

- kąta nachylenia orbity do osi OZ,

kierunek świecenia: na obiekt.

Źródło nr 2:

typ: kierunkowe,

kolor: czerwony,

natężenie: 0.8,

położenie: stałe w punkcie P(10,10, 10) układu współrzędnych sceny.

kierunek świecenia: na obiekt.

Program powinien umożliwiać:

  1. interaktywne, niezależne włączanie i wyłączanie źródeł światła,

  2. Interaktywną zmianę liczby podziałów pionowych i poziomych bryły,

  3. interaktywną zmianę położenia obserwatora poprzez podanie następujących parametrów :

- odległości obserwatora od środka układu współrzędnych sceny,

- kąta obrotu wokół osi OY w zakresie [0 o,360 o] z krokiem 1 o.

Oświetlony obiekt powinien zawsze znajdować się w centralnej części okna.

  1. Wykonanie zadania

Pierwszym etapem wykonania zadania było zamodelowanie kuli. Ze względu na sposób przyporządkowania materiałów nie mogłem wykorzystać gotowych prymitywów. Zastosowałem tryb GL_QUADS i obliczyłem poszczególne współrzędne punktów należących do sfery. Zmienne odpowiadające za kąty są iterowane przy użyciu pętli, a promień i liczba podziałów zmieniane z klawiatury. Kod rysujący sferę :

//Sfera

for(i=0; i < poziom; i++) {

if (i%2 == 0) licznik=1;

else licznik=0;

for (j=0; j < pion; j++){

if (licznik%2 == 0)

{Material1();licznik=1;}

else {Material2();licznik=0;}

glBegin(GL_QUADS);

x = R*cos(-pi/2+(pi*j/pion))*cos(2*pi*i/poziom);

y = R*sin(-pi/2+(pi*j/pion));

z = R*cos(-pi/2+(pi*j/pion))*sin(2*pi*i/poziom);

glVertex3f(x,y,z);

temp_y = y;

temp_x = x;

temp_z = z;

x = R*cos(-pi/2+(pi*(j+1)/pion))*cos(2*pi*i/poziom);

y = R*sin(-pi/2+(pi*(j+1)/pion));

z = R*cos(-pi/2+(pi*(j+1)/pion))*sin(2*pi*i/poziom);

glVertex3f(x,y,z);

wektor1[0]= x - temp_x;

wektor1[1]= y - temp_y;

wektor1[2]= z - temp_z;

x = R*cos(-pi/2+(pi*(j+1)/pion))*cos(2*pi*(i+1)/poziom);

y = R*sin(-pi/2+(pi*(j+1)/pion));

z = R*cos(-pi/2+(pi*(j+1)/pion))*sin(2*pi*(i+1)/poziom);

glVertex3f(x,y,z);

x = R*cos(-pi/2+(pi*j/pion))*cos(2*pi*(i+1)/poziom);

y = R*sin(-pi/2+(pi*j/pion));

z = R*cos(-pi/2+(pi*j/pion))*sin(2*pi*(i+1)/poziom);

glVertex3f(x,y,z);

wektor2[0]= x - temp_x;

wektor2[1]= y - temp_y;

wektor2[2]= z - temp_z;

IloczynWektorowy();

glNormal3f(wektor3[0],wektor3[1],wektor3[2]);

glEnd();

}

}

glPopMatrix();

Mając zamodelowaną kulę i obliczone jej wektory normalne przystąpiłem do pracy nad materiałami z jakich powinien być zbudowany rysowany obiekt. Parametry obu materiałów :

//zielony matowy

const GLfloat ambient_m1[4] = {0,1,0,1};

const GLfloat diffuse_m1[4] = {0,1,0,1};

GLfloat specular_m1[4] = {0,0.1,0,0.1};

// filetowy polysk

const GLfloat ambient_m2[4] = {0.8,0,0.8,1};

const GLfloat diffuse_m2[4] = {0.5,0,0.5,1};

GLfloat specular_m2[4] = {1,0,1,1};

Następnym etapem było przygotowanie tablic opisujących źródła światła:

//reflektor

GLfloat ambient_s1[4] = {1,1,0,1};

GLfloat diffuse_s1[4] = {1,1,0,1};

GLfloat specular_s1[4] = {1,1,0,1};

GLfloat position_s1[] = {0,0,0,1};

GLfloat direction_s1[] = {0,-1,0};

// kierunkowe

GLfloat ambient_s2[4] = {0.8,0,0,1};

GLfloat diffuse_s2[4] = {0.8,0,0,1};

GLfloat specular_s2[4] = {0.8,0,0,1};

GLfloat position_s2[] = {-10,10,10,0};

GLfloat direction_s2[] = {0,-1,0};

  1. Efekt działania programu

  1. Wnioski z przeprowadzonego ćwiczenia

Celem zadań laboratoryjnych było zamodelowanie obiektu składającego się z dwóch różniących się materiałów, oświetlenie sceny dwoma odmiennymi źródłami światła, a następnie zaobserwowaniu relacji łączących te elementy i ich wpływ na otrzymywane efekty wizualne. Napisany program, doskonale ukazuje zasady powstawania barwy, oraz jej związek z właściwościami materiału tworzącego przedmiot, oraz światła na niego padającego. Zatem możemy stwierdzić, że cele zajęć zostały osiągnięte.

  1. Wydruk kodu programu

  2. #include <GL/glut.h>

  3. #include <math.h>

  4. // Definicja stalych

  5. #define DLUGOSC_BOKU 5.0

  6. float OBSERWATOR_ODLEGLOSC = 50.0;

  7. float OBSERWATOR_OBROT_X = 20.0;

  8. float OBSERWATOR_OBROT_Y = 20.0;

  9. float OBSERWATOR_FOV_Y = 30.0;

  10. float OBSERWATOR_WYSOKOSC = 10;

  11. //PI

  12. float pi = 3.1415;

  13. //Podzial pion i poziom

  14. int poziom = 40;

  15. int pion = 40;

  16. //Macierze definiujace materialy

  17. //zielony matowy

  18. const GLfloat ambient_m1[4] = {0,1,0,1};

  19. const GLfloat diffuse_m1[4] = {0,1,0,1};

  20. GLfloat specular_m1[4] = {0,0.1,0,0.1};

  21. // filetowy polysk

  22. const GLfloat ambient_m2[4] = {0.8,0,0.8,1};

  23. const GLfloat diffuse_m2[4] = {0.5,0,0.5,1};

  24. GLfloat specular_m2[4] = {1,0,1,1};

  25. //Macierze definiujace swiatla

  26. //reflektor

  27. GLfloat ambient_s1[4] = {1,1,0,1};

  28. GLfloat diffuse_s1[4] = {1,1,0,1};

  29. GLfloat specular_s1[4] = {1,1,0,1};

  30. GLfloat position_s1[] = {0,0,0,1};

  31. GLfloat direction_s1[] = {0,-1,0};

  32. // kierunkowe

  33. GLfloat ambient_s2[4] = {0.8,0,0,1};

  34. GLfloat diffuse_s2[4] = {0.8,0,0,1};

  35. GLfloat specular_s2[4] = {0.8,0,0,1};

  36. GLfloat position_s2[] = {-10,10,10,0};

  37. GLfloat direction_s2[] = {0,-1,0};

  38. float kat_x = 0, kat_z = 0, R_L1 = 45;

  39. //Tablice wektorow

  40. float wektor1[3], wektor2[3], wektor3[3];

  41. // Zmienne globalne

  42. double bok = DLUGOSC_BOKU; // srednica

  43. int szerokoscOkna = 800;

  44. int wysokoscOkna = 600;

  45. void RysujSfere(double a);

  46. void UstawParametryWidoku(int szer, int wys);

  47. void WyswietlObraz(void);

  48. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);

  49. void Material1() {

  50. glMaterialfv(GL_FRONT, GL_AMBIENT, ambient_m1);

  51. glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse_m1);

  52. glMaterialfv(GL_FRONT, GL_SPECULAR, specular_m1);

  53. glMaterialf (GL_FRONT, GL_SHININESS, 128);

  54. }

  55. void Material2() {

  56. glMaterialfv(GL_FRONT, GL_AMBIENT, ambient_m2);

  57. glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse_m2);

  58. glMaterialfv(GL_FRONT, GL_SPECULAR, specular_m2);

  59. }

  60. void Swiatlo1() {

  61. glPushMatrix();

  62. glRotatef(kat_x,1,0,0);

  63. glRotatef(kat_z,0,0,1);

  64. glTranslatef(0,R_L1,0);

  65. glPushMatrix();

  66. //glutWireSphere(1,10,10);

  67. glPopMatrix();

  68. glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse_s1);

  69. glLightfv(GL_LIGHT1, GL_SPECULAR, specular_s1);

  70. glLightfv(GL_LIGHT1, GL_POSITION, position_s1);

  71. glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 30.0);

  72. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,direction_s1);

  73. glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 1);

  74. glPopMatrix();

  75. }

  76. void Swiatlo2() {

  77. glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuse_s2);

  78. glLightfv(GL_LIGHT2, GL_SPECULAR, specular_s2);

  79. glLightfv(GL_LIGHT2, GL_POSITION, position_s2);

  80. }

  81. void IloczynWektorowy() {

  82. wektor3[0] = wektor1[1]*wektor2[2] - wektor2[1]*wektor1[2];

  83. wektor3[1] = wektor1[2]*wektor2[0] - wektor2[2]*wektor1[0];

  84. wektor3[2] = wektor1[0]*wektor2[1] - wektor2[0]*wektor1[1];

  85. }

  86. void RysujSfere(double a)

  87. {

  88. float alfa = 0, teta = 0, x, y, z;

  89. float R = 6, temp_y=0, temp_x=0, temp_z=0;

  90. int licznik = 0, i=0, j=0;

  91. //Sfera

  92. for(i=0; i < poziom; i++)

  93. {

  94. if (i%2 == 0)

  95. {licznik=1;}

  96. else licznik=0;

  97. for (j=0; j < pion; j++)

  98. {

  99. if (licznik%2 == 0)

  100. {Material1();licznik=1;}

  101. else {Material2();licznik=0;}

  102. glBegin(GL_QUADS);

  103. x = R*cos(-pi/2+(pi*j/pion))*cos(2*pi*i/poziom);

  104. y = R*sin(-pi/2+(pi*j/pion));

  105. z = R*cos(-pi/2+(pi*j/pion))*sin(2*pi*i/poziom);

  106. glVertex3f(x,y,z);

  107. temp_y = y;

  108. temp_x = x;

  109. temp_z = z;

  110. x = R*cos(-pi/2+(pi*(j+1)/pion))*cos(2*pi*i/poziom);

  111. y = R*sin(-pi/2+(pi*(j+1)/pion));

  112. z = R*cos(-pi/2+(pi*(j+1)/pion))*sin(2*pi*i/poziom);

  113. glVertex3f(x,y,z);

  114. wektor1[0]= x - temp_x;

  115. wektor1[1]= y - temp_y;

  116. wektor1[2]= z - temp_z;

  117. x = R*cos(-pi/2+(pi*(j+1)/pion))*cos(2*pi*(i+1)/poziom);

  118. y = R*sin(-pi/2+(pi*(j+1)/pion));

  119. z = R*cos(-pi/2+(pi*(j+1)/pion))*sin(2*pi*(i+1)/poziom);

  120. glVertex3f(x,y,z);

  121. x = R*cos(-pi/2+(pi*j/pion))*cos(2*pi*(i+1)/poziom);

  122. y = R*sin(-pi/2+(pi*j/pion));

  123. z = R*cos(-pi/2+(pi*j/pion))*sin(2*pi*(i+1)/poziom);

  124. glVertex3f(x,y,z);

  125. wektor2[0]= x - temp_x;

  126. wektor2[1]= y - temp_y;

  127. wektor2[2]= z - temp_z;

  128. IloczynWektorowy();

  129. glNormal3f(wektor3[0],wektor3[1],wektor3[2]);

  130. glEnd();

  131. }

  132. }

  133. glPopMatrix();

  134. Swiatlo1();

  135. Swiatlo2();

  136. }

  137. void UstawParametryWidoku(int szer, int wys)

  138. {

  139. // Zapamietanie wielkosci widoku

  140. szerokoscOkna = szer;

  141. wysokoscOkna = wys;

  142. // Ustawienie parametrow viewportu

  143. glViewport(0, 0, szerokoscOkna, wysokoscOkna);

  144. // Przejscie w tryb modyfikacji macierzy rzutowania

  145. glMatrixMode(GL_PROJECTION);

  146. glLoadIdentity();

  147. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);

  148. glMatrixMode(GL_MODELVIEW);

  149. glLoadIdentity();

  150. glEnable(GL_NORMALIZE);

  151. glEnable(GL_LIGHTING);

  152. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

  153. }

  154. void WyswietlObraz(void)

  155. {

  156. // Wyczyszczenie bufora koloru i bufora glebokosci

  157. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  158. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych

  159. glMatrixMode(GL_MODELVIEW);

  160. // Zastapienie aktywnej macierzy macierza jednostkowa

  161. glLoadIdentity();

  162. // Ustalenie polozenia obserwatora

  163. glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);

  164. glRotatef(atan(OBSERWATOR_WYSOKOSC/OBSERWATOR_ODLEGLOSC) * 180/pi,1,0,0);

  165. glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);

  166. // Narysowanie szescianu

  167. RysujSfere(bok);

  168. // Przelaczenie buforow ramki

  169. glutSwapBuffers();

  170. }

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

  172. {

  173. switch(klawisz){

  174. case ';' : OBSERWATOR_ODLEGLOSC++;break;

  175. case '.' : OBSERWATOR_ODLEGLOSC--;break;

  176. case 'l' : OBSERWATOR_WYSOKOSC++;break;

  177. case ',' : OBSERWATOR_WYSOKOSC--;break;

  178. case 'k' : OBSERWATOR_OBROT_Y++;break;

  179. case 'm' : OBSERWATOR_OBROT_Y--;break;

  180. //PODZIAL - rownolezniki i poludniki

  181. case '1' : poziom+=2;break;

  182. case '2' : poziom-=2;break;

  183. case '3' : pion+=2;break;

  184. case '4' : pion-=2;break;

  185. //Swiatlo

  186. case 'q' : glEnable(GL_LIGHT0);break;

  187. case 'w' : glDisable(GL_LIGHT0);break;

  188. case 'e' : glEnable(GL_LIGHT1);break;

  189. case 'r' : glDisable(GL_LIGHT1);break;

  190. case 't' : glEnable(GL_LIGHT2);break;

  191. case 'y' : glDisable(GL_LIGHT2);break;

  192. //Regulowanie orbity L1

  193. case 'a' : R_L1+=1;break;

  194. case 'z' : R_L1-=1;break;

  195. case 's' : kat_x++;break;

  196. case 'x' : kat_x--;break;

  197. case 'd' : kat_z++;break;

  198. case 'c' : kat_z--;break;

  199. case 27 : exit(0);break;

  200. }

  201. }

  202. int main(int argc, char **argv)

  203. {

  204. glutInit(&argc, argv);

  205. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);

  206. glutInitWindowPosition(100, 100);

  207. glutInitWindowSize(szerokoscOkna, wysokoscOkna);

  208. glutCreateWindow("Modelowanie oświetlenia");

  209. glEnable(GL_DEPTH_TEST);

  210. glClearDepth(1000.0);

  211. glClearColor (0.0f, 0.0f, 0.0f, 0.0f);

  212. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

  213. glutDisplayFunc(WyswietlObraz);

  214. glutReshapeFunc(UstawParametryWidoku);

  215. glutIdleFunc(WyswietlObraz);

  216. glutKeyboardFunc(ObslugaKlawiatury);

  217. glutMainLoop();

  218. return 0;

  219. }


Wyszukiwarka

Podobne podstrony:
Fizyka 25a, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, 25 - Interferencja fal akust
opracowanie laborki dla Dawida 25, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, 25 -
Sprawozdanie 25, chemia nieorganiczna, zalaczniki2
Fizyka 25b, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, 25 - Interferencja fal akust
sprawozdanie (25)
Sprawozdanie 25, STUDIA PŁ, TECHNOLOGIA ŻYWNOŚCI I ŻYWIENIA CZŁOWIEKA, ROK II, SEM 3, INŻYNIERIA PRO
kons. 25, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, 25 - Interferencja fal akustyc
25, Sprawozdanie 25, U1i
Fizyka 25a, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, 25 - Interferencja fal akust
Sprawozdanie 25
poprawa II 25, chemia w nauce i gospodarce Uł, semestr V, sprawozdania chemia fizyczna i analityczna
Ćwiczenie I-25, I Semestr - Materialoznawstwo - sprawozdania
sprawozdanie biochemia 25.11, BIOLOGIA UJ, BIOCHEMIA WBBiB
Ćwiczenie 25 W2, I Semestr - Materialoznawstwo - sprawozdania
25 2, Sprawozdanie z ˙w. nr 25
Cwiczenie 25 wzor sprawozdania
Ćwiczenie 25 W2 Inne, I Semestr - Materialoznawstwo - sprawozdania
Laborka-25, Labolatoria fizyka-sprawozdania, !!!LABORKI - sprawozdania, Lab, !!!LABORKI - sprawozdan
iza 25, chemia w nauce i gospodarce Uł, semestr V, sprawozdania chemia fizyczna i analityczna uł, Ch

więcej podobnych podstron