Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.75 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  4. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  5. //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7. #include <glut.h>
  8. #include <math.h>
  9. #include <string.h>
  10. #include <stdio.h>
  11. #include "materials.h"
  12.  
  13. // Definicja stalych
  14. #define DLUGOSC_BOKU 5.0
  15. #define PI 3.14159265359
  16.  
  17. #define OBSERWATOR_FOV_Y 30.0
  18. // Makro przeliczajace stopnie na radiany
  19. #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
  20. #define KROK_FLOAT 0.1
  21. #define X_OFFSET_SWIATLO 10
  22. #define Y_OFFSET_SWIATLO 120
  23. #define X_OFFSET_MAT 10
  24. #define Y_OFFSET_MAT 220
  25. #define X_OFFSET_OBIEKT 10
  26. #define Y_OFFSET_OBIEKT 300
  27. #define ID_MENU_SWIATLA 0
  28. #define ID_MENU_MATERIALU 1
  29. #define LPOZ_MENU_SWIATLA 10
  30. #define LPOZ_MENU_MATERIALU 5
  31.  
  32. int sIndeks; // Wybrana pozycja w tablicy parametrow swiatla
  33. int mIndeks; // Wybrana pozycja w tablicy parametrow materialu
  34. int menu; // Identyfikator wybranego menu (menu swiatla lub menu materialu)
  35. // Zmienne globalne
  36. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  37. int szerokoscOkna = 800;
  38. int wysokoscOkna = 600;
  39. double r2=5;
  40. double r1=2.5,r3=2.0;
  41. double h=10;
  42. double angle;
  43. double pom = 0;
  44. GLfloat OBSERWATOR_OBROT_X = 20.0;
  45. GLfloat OBSERWATOR_OBROT_Y = 20.0;
  46. GLfloat OBSERWATOR_OBROT_Z = 0.0;
  47. GLfloat OBSERWATOR_ODLEGLOSC = 20.0;
  48. GLfloat N=20;
  49. GLfloat N2=20;
  50. // Zerowy parametr Emission
  51. const GLfloat Emission[4] = {0.0 , 0.0, 0.0, 0.0};
  52.  
  53. // Tablica parametrow swiatla
  54. GLfloat swiatlo[10][4];
  55.  
  56. // Tablica parametrow materialu z jakiego wykonany jest walec
  57. GLfloat material[6][4];
  58.  
  59.  
  60. // Prototypy funkcji
  61. void RysujSzescian(double a);
  62. void UstawParametryWidoku(int szer, int wys);
  63. void WyswietlObraz(void);
  64. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  65. void WlaczOswietlenie(void);
  66. void DefiniujMaterial(void);
  67. void UstawParametryOswietlenia(int indeks, char operacja);
  68. void UstawParametryMaterialu(int indeks, char operacja);
  69. void UstawDomyslneWartosciParametrow(void);
  70. /////////////////////////////////////////////////////////////////////////////////////////
  71. // Funkcja ustawiajaca domyslne parametry walca, materialu i zrodla swiatla
  72. //////////////////////////////////////////////////////////////////////////////////////////
  73. // Wlaczenie oswietlenia sceny
  74.  
  75. void WlaczOswietlenie(void)
  76. {
  77. // Odblokowanie oswietlenia
  78. glEnable(GL_LIGHTING);
  79.  
  80. // Odblokowanie zerowego zrodla swiatla
  81. glEnable(GL_LIGHT0);
  82.  
  83. // Inicjowanie zrodla swiatla
  84. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo[0]);
  85. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo[1]);
  86. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo[2]);
  87. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo[3]);
  88. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo[4]);
  89. glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, swiatlo[5][0]);
  90. glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, swiatlo[6][0]);
  91. glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, swiatlo[7][0]);
  92. glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, swiatlo[8][0]);
  93. glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, swiatlo[9][0]);
  94. }
  95. void material2()
  96. {
  97.  
  98. GLfloat param_materialu2[6][4] = {
  99. {0.0, 0.0, 0.0, 0.0}, // [0] wspolczynnik odbicia swiatla otoczenia
  100. {0.0, 0.0, 1.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  101. {0.0, 0.0, 0.0, 0.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
  102. {0.0, 0.0, 0.0, 0.0}}; // [3] polysk
  103. memcpy(material[0], param_materialu2[0], 4*sizeof(GLfloat));
  104. memcpy(material[1], param_materialu2[1], 4*sizeof(GLfloat));
  105. memcpy(material[2], param_materialu2[2], 4*sizeof(GLfloat));
  106. memcpy(material[3], param_materialu2[3], 4*sizeof(GLfloat));
  107. memcpy(material[4], Emission, 4*sizeof(GLfloat));
  108.  
  109. }
  110. void material1()
  111. {
  112.  
  113.  
  114. GLfloat param_materialu[6][4] = {
  115. {1.0, 1.0, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
  116. {1.0, 1.0, 0.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  117. {1.0, 1.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
  118. {1.0, 1.0, 0.0, 1.0}}; // [3] polysk
  119.  
  120. memcpy(material[0], param_materialu[0], 4*sizeof(GLfloat));
  121. memcpy(material[1], param_materialu[1], 4*sizeof(GLfloat));
  122. memcpy(material[2], param_materialu[2], 4*sizeof(GLfloat));
  123. memcpy(material[3], param_materialu[3], 4*sizeof(GLfloat));
  124. memcpy(material[4], Emission, 4*sizeof(GLfloat));
  125.  
  126. }
  127. void material3()
  128. {
  129. memcpy(material[0], BronzeAmbient, 4*sizeof(GLfloat));
  130. memcpy(material[1], BronzeDiffuse, 4*sizeof(GLfloat));
  131. memcpy(material[2], BronzeSpecular, 4*sizeof(GLfloat));
  132. memcpy(material[3], &BronzeShininess, 4*sizeof(GLfloat));
  133. memcpy(material[4], Emission, 4*sizeof(GLfloat));
  134.  
  135.  
  136. }
  137. void UstawDomyslneWartosciParametrow(void)
  138. {
  139. // Tablica parametrow materialu
  140. /* GLfloat param_materialu[6][4] = {
  141. {0.2, 0.2, 0.2, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
  142. {0.8, 0.8, 0.8, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  143. {0.0, 0.0, 0.0, 1.0}, // [2] wspolczynnik odbicia swiatla lustrzanego
  144. {0.0, 0.0, 0.0, 0.0}, // [3] polysk
  145. {0.0, 0.0, 0.0, 1.0}}; // [4] kolor swiatla emitowanego
  146. */
  147. // Tablica parametrow swiatla
  148. GLfloat param_swiatla[10][4] = {
  149. {0.0, 0.0, 0.0, 0.0}, // [0] otoczenie
  150. {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
  151. {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
  152. {0.0, 0.0, 1.0, 1.0}, // [3] polozenie
  153. {0.0, 0.0, -1.0, 0.0}, // [4] kierunek swiecenia
  154. {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
  155. {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
  156. {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
  157. {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
  158. {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
  159.  
  160. // Skopiowanie zawartosci tablic param_* do tablic globalnych
  161. memcpy(swiatlo, param_swiatla, LPOZ_MENU_SWIATLA*4*sizeof(GLfloat));
  162. // memcpy(material, param_materialu, LPOZ_MENU_MATERIALU*4*sizeof(GLfloat));
  163.  
  164. // Skopiowanie Właściwości materiału - złoto
  165. memcpy(material[0], GoldAmbient, 4*sizeof(GLfloat));
  166. memcpy(material[1], GoldDiffuse, 4*sizeof(GLfloat));
  167. memcpy(material[2], GoldSpecular, 4*sizeof(GLfloat));
  168. memcpy(material[3], &GoldShininess, 4*sizeof(GLfloat));
  169. memcpy(material[4], Emission, 4*sizeof(GLfloat));
  170.  
  171. // Pozostale parametry
  172. sIndeks = 0; // Wybrana pozycja w tablicy parametrow swiatla
  173. mIndeks = 0; // Wybrana pozycja w tablicy parametrow materialu
  174. menu = ID_MENU_SWIATLA;
  175.  
  176. glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
  177. }
  178. //////////////////////////////////////////////////////////////////////////////////////////
  179. // Zdefiniowanie walasciwosci materialu walca na podstawie zapisanych w tablcy 'material'
  180. // parametrow (material obowiazuje tylko do scian skierowanych przodem do obserwatora)
  181. void DefiniujMaterial(void)
  182. {
  183. glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
  184. glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
  185. glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
  186. glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
  187. glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
  188. }
  189.  
  190. //////////////////////////////////////////////////////////////////////////////////////////
  191. // Ustawienie parametrow oswietlenia sceny
  192. void oswietl()
  193. {
  194. GLfloat param_swiatla[10][4] = {
  195. {3.0, 3.0, 0.0, 0.0}, // [0] otoczenie
  196. {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
  197. {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
  198. {0.0, 0.0, 1.0, 1.0}, // [3] polozenie
  199. {0.0, 0.0, -1.0, 0.0}, // [4] kierunek swiecenia
  200. {0.0, 0.0, 0.0, 0.0}, // [5] tlumienie katowe swiatla
  201. {180.0, 0.0, 0.0, 0.0},// [6] kat odciecia swiatla
  202. {1.0, 0.0, 0.0, 0.0}, // [7] stale tlumienie
  203. {0.0, 0.0, 0.0, 0.0}, // [8] tlumienie liniowe
  204. {0.0, 0.0, 0.0, 0.0}}; // [9] tlumienie kwadratowe
  205. memcpy(swiatlo, param_swiatla, LPOZ_MENU_SWIATLA*4*sizeof(GLfloat));
  206.  
  207. }
  208. void UstawParametryOswietlenia(int indeks, char operacja)
  209. {
  210. switch(indeks)
  211. {
  212. // Parametry swiatla otoczenia, rozproszenia i odbicia lustrzanego
  213. case 0:
  214. case 1:
  215. case 2:
  216. switch(operacja)
  217. {
  218. // Zwiekszenie skladowej R o wartosc KROK_FLOAT
  219. case '1':
  220. swiatlo[indeks][0] = (swiatlo[indeks][0] >= 1.0) ? 1.0 : swiatlo[indeks][0]+ KROK_FLOAT;
  221. break;
  222.  
  223. // Zmniejszenie skladowej R o wartosc KROK_FLOAT
  224. case '!':
  225. swiatlo[indeks][0] = (swiatlo[indeks][0] <= 0.1) ? 0.0 : swiatlo[indeks][0]- KROK_FLOAT;
  226. break;
  227.  
  228. // Zwiekszenie skladowej G o wartosc KROK_FLOAT
  229. case '2':
  230. swiatlo[indeks][1] = (swiatlo[indeks][1] >= 1.0) ? 1.0 : swiatlo[indeks][1]+ KROK_FLOAT;
  231. break;
  232.  
  233. // Zmniejszenie skladowej G o wartosc KROK_FLOAT
  234. case '@':
  235. swiatlo[indeks][1] = (swiatlo[indeks][1] <= 0.01) ? 0.0 : swiatlo[indeks][1]- KROK_FLOAT;
  236. break;
  237.  
  238. // Zwiekszenie skladowej B o wartosc KROK_FLOAT
  239. case '3':
  240. swiatlo[indeks][2] = (swiatlo[indeks][2] >= 1.0) ? 1.0 : swiatlo[indeks][2]+ KROK_FLOAT;
  241. break;
  242.  
  243. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  244. case '#':
  245. swiatlo[indeks][2] = (swiatlo[indeks][2] <= 0.1) ? 0.0 : swiatlo[indeks][2]- KROK_FLOAT;
  246. break;
  247.  
  248. // Zwiekszenie skladowej A o wartosc KROK_FLOAT
  249. case '4':
  250. swiatlo[indeks][3] = (swiatlo[indeks][3] >= 1.0) ? 1.0 : swiatlo[indeks][3]+ KROK_FLOAT;
  251. break;
  252.  
  253. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  254. case '$':
  255. swiatlo[indeks][3] = (swiatlo[indeks][3] <= 0.1) ? 0.0 : swiatlo[indeks][3]- KROK_FLOAT;
  256. break;
  257. }
  258. break;
  259.  
  260. // Parametry opisujace polozenie i orientacje swiatla
  261. case 3:
  262. case 4:
  263. case 5:
  264. case 6:
  265. switch(operacja)
  266. {
  267. // Zwiekszenie wspolrzednej X o wartosc KROK_FLOAT
  268. case '1':
  269. swiatlo[indeks][0] += KROK_FLOAT;
  270. break;
  271.  
  272. // Zmniejszenie wspolrzednej X o wartosc KROK_FLOAT
  273. case '!':
  274. swiatlo[indeks][0] -= KROK_FLOAT;
  275. break;
  276.  
  277. // Zwiekszenie wspolrzednej Y o wartosc KROK_FLOAT
  278. case '2':
  279. swiatlo[indeks][1] += KROK_FLOAT;
  280. break;
  281.  
  282. // Zmniejszenie wspolrzednej Y o KROK_FLOAT
  283. case '@':
  284. swiatlo[indeks][1] -= KROK_FLOAT;
  285. break;
  286.  
  287. // Zwiekszenie wspolrzednej Z o wartosc KROK_FLOAT
  288. case '3':
  289. swiatlo[indeks][2] += KROK_FLOAT;
  290. break;
  291.  
  292. // Zmniejszenie wspolrzednej Z o wartosc KROK_FLOAT
  293. case '#':
  294. swiatlo[indeks][2] -= KROK_FLOAT;
  295. break;
  296.  
  297. // Zwiekszenie wspolrzednej W o wartosc KROK_FLOAT
  298. case '4':
  299. swiatlo[indeks][3] += KROK_FLOAT;
  300. break;
  301.  
  302. // Zmniejszenie wspolrzednej W o wartosc KROK_FLOAT
  303. case '$':
  304. swiatlo[indeks][3] -= KROK_FLOAT;
  305. break;
  306. }
  307. break;
  308. case 7:
  309. case 8:
  310. case 9:
  311. switch(operacja)
  312. {
  313. // Zwiekszenie skladowych tlumienia wartosc KROK_FLOAT/10
  314. case '1':
  315. swiatlo[indeks][0] += KROK_FLOAT/10.0;
  316. break;
  317.  
  318. // Zmniejszenie stalych tlumienia o wartosc KROK_FLOAT/10
  319. case '!':
  320. swiatlo[indeks][0] -= KROK_FLOAT/10.0;
  321. break;
  322. }
  323. }
  324. }
  325.  
  326. //////////////////////////////////////////////////////////////////////////////////////////
  327. // Ustawienie parametrow materoalu
  328. void UstawParametryMaterialu(int indeks, char operacja)
  329. {
  330. switch(indeks)
  331. {
  332. // Parametry odbicia swiatla swiatla otoczenia, swiatla rozproszonego, swiatla
  333. // kierunkowego i emitowanego
  334. case 0:
  335. case 1:
  336. case 2:
  337. case 4:
  338. switch(operacja)
  339. {
  340. // Zwiekszenie skladowej R o wartosc KROK_FLOAT
  341. case '1':
  342. material[indeks][0] = (material[indeks][0] >= 1.0) ? 1.0 : material[indeks][0]+ KROK_FLOAT;
  343. break;
  344.  
  345. // Zmniejszenie skladowej R o wartosc KROK_FLOAT
  346. case '!':
  347. material[indeks][0] = (material[indeks][0] <= 0.1) ? 0.0 : material[indeks][0]- KROK_FLOAT;
  348. break;
  349.  
  350. // Zwiekszenie skladowej G o wartosc KROK_FLOAT
  351. case '2':
  352. material[indeks][1] = (material[indeks][1] >= 1.0) ? 1.0 : material[indeks][1]+ KROK_FLOAT;
  353. break;
  354.  
  355. // Zmniejszenie skladowej G o wartosc KROK_FLOAT
  356. case '@':
  357. material[indeks][1] = (material[indeks][1] <= 0.1) ? 0.0 : material[indeks][1]- KROK_FLOAT;
  358. break;
  359.  
  360. // Zwiekszenie skladowej B o wartosc KROK_FLOAT
  361. case '3':
  362. material[indeks][2] = (material[indeks][2] >= 1.0) ? 1.0 : material[indeks][2]+ KROK_FLOAT;
  363. break;
  364.  
  365. // Zmniejszenie skladowej B o wartosc KROK_FLOAT
  366. case '#':
  367. material[indeks][2] = (material[indeks][2] <= 0.1) ? 0.0 : material[indeks][2]- KROK_FLOAT;
  368. break;
  369.  
  370. // Zwiekszenie skladowej A o wartosc KROK_FLOAT
  371. case '4':
  372. material[indeks][3] = (material[indeks][3] >= 1.0) ? 1.0 : material[indeks][3]+ KROK_FLOAT;
  373. break;
  374.  
  375. // Zmniejszenie skladowej A o wartosc KROK_FLOAT
  376. case '$':
  377. material[indeks][3] = (material[indeks][3] <= 0.1) ? 0.0 : material[indeks][3]- KROK_FLOAT;
  378. break;
  379. }
  380. break;
  381.  
  382. // Parametr opisujacy polysk powierzchni
  383. case 3:
  384. switch(operacja)
  385. {
  386. // Zwiekszenie skladowej R o wartosc KROK_FLOAT*10
  387. case '1':
  388. material[indeks][0] = (material[indeks][0] >= 100.0) ? 100.0 : material[indeks][0]+ KROK_FLOAT * 10.0;
  389. break;
  390.  
  391. // Zmniejszenie skladowej R o wartosc KROK_FLOAT*10
  392. case '!':
  393. material[indeks][0] = (material[indeks][0] <= 0.0) ? 0.0 : material[indeks][0]- KROK_FLOAT * 10.0;
  394. break;
  395. }
  396. break;
  397. }
  398. }
  399.  
  400.  
  401. //////////////////////////////////////////////////////////////////////////////////////////
  402. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  403. // Srodek szescianu znajduje się w punkcie (0,0,0).
  404. void RysujSzescian(double a)
  405. {
  406. /* // Pocztaek tworzenia ukladu wspolrzednych
  407. glBegin(GL_LINES);
  408.  
  409. // Os X
  410. glColor3f(1.0, 0.0, 0.0);
  411. glVertex3f(-40.0, 0.0, 0.0);
  412. glVertex3f(40.0, 0.0, 0.0);
  413.  
  414. // Os Y
  415. glColor3f(0.0,1.0,0.0);
  416. glVertex3f(0.0, -20.0, 0.0);
  417. glVertex3f(0.0, 20.0, 0.0);
  418.  
  419. // Os Z
  420. glColor3f(0.0,0.0,1.0);
  421. glVertex3f(0.0, 0.0, -20.0);
  422. glVertex3f(0.0, 0.0, 20.0);
  423.  
  424. // Koniec tworzenia ukladu wspolrzednych
  425. glEnd();*/
  426. /* glColor3f(1.0,1.0,1.0);
  427. // Sciany boczne
  428. glBegin(GL_QUAD_STRIP);
  429. glVertex3f(a/2.0, a/2.0, a/2.0);
  430. glVertex3f(a/2.0, -a/2.0, a/2.0);
  431. glVertex3f(a/2.0, a/2.0, -a/2.0);
  432. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  433.  
  434. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  435. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  436.  
  437. glVertex3f(-a/2.0, a/2.0, a/2.0);
  438. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  439.  
  440. glVertex3f(a/2.0, a/2.0, a/2.0);
  441. glVertex3f(a/2.0, -a/2.0, a/2.0);
  442. glEnd();
  443.  
  444. // Gorna sciana
  445. glBegin(GL_QUAD_STRIP);
  446. glVertex3f(-a/2.0, a/2.0, a/2.0);
  447. glVertex3f(a/2.0, a/2.0, a/2.0);
  448. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  449. glVertex3f(a/2.0, a/2.0, -a/2.0);
  450. glEnd();
  451.  
  452. // Dolna sciana
  453. glBegin(GL_QUAD_STRIP);
  454. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  455. glVertex3f(a/2.0, -a/2.0, a/2.0);
  456. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  457. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  458. glEnd();
  459. */
  460. /* glTranslatef(10.0,0.0 , 0.0);
  461. glColor3f(1.0, 1.0, 1.0);
  462. glBegin(GL_TRIANGLE_FAN); // dolna podstawa
  463. glVertex3f(0.0,0.0,0.0);
  464. for (angle=0.0; angle<=(2.0*PI); angle+=(2*PI/N))
  465. {
  466. glVertex3f(r1*cos(angle),0.0,r1*sin(angle));
  467. }
  468. glEnd();
  469.  
  470. glBegin(GL_TRIANGLE_FAN); // gorna podstawa
  471. glVertex3f(0.0,10.0,0.0);
  472. for (angle=0.0; angle<=(2.0*PI); angle+=(2*PI/N))
  473. {
  474. glVertex3f(r2*cos(angle),h,r2*sin(angle));
  475. }
  476. glEnd();
  477. glBegin(GL_QUAD_STRIP); // scianaboczna
  478.  
  479.  
  480. for (angle=0.0; angle<=(2.0*PI+0.1); angle+=(2*PI/N))
  481. {
  482. glVertex3f(r1*cos(angle),0.0,r1*sin(angle));
  483. glVertex3f(r2*cos(angle),h,r2*sin(angle));
  484. }
  485. glEnd();
  486. glTranslatef(-10.0,0.0 , 0.0);
  487. */
  488. /////////////////////////////////
  489. glBegin(GL_QUAD_STRIP); // stozek
  490. glColor3f(1.0,0.0,0.0);
  491. for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
  492. {
  493. //glNormal3f(0.0, 0.0, 1.0);
  494. glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
  495. glVertex3f(r3*cos(angle),3.0,r3*sin(angle));
  496. }
  497. glEnd();
  498. glColor3f(1.0,1.0,0.0);
  499. glBegin(GL_QUAD_STRIP); // dol
  500. for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
  501. {
  502. // glNormal3f(0.0, -1.0, 0.0);
  503. glVertex3f(0.0,0.0,0.0);
  504. glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
  505. }
  506. glEnd();
  507. glColor3f(0.0,1.0,0.0);
  508. glBegin(GL_QUAD_STRIP); // gora
  509. for (angle=0.0; angle<=(PI+0.01); angle+=(PI/N))
  510. {
  511. //glNormal3f(0.0, 1.0, 0.0);
  512. glVertex3f(0.0,3.0,0.0);
  513. glVertex3f(r3*cos(angle),3.0,r3*sin(angle));
  514. }
  515. glEnd();
  516. //podzialy poziome
  517.  
  518. glColor3f(1.0, 1.0, 0.0);
  519. for (pom=0.0; pom < 3.01; pom += (3.0 / N2))
  520. {
  521. glBegin(GL_QUAD_STRIP);
  522. for (angle = 0.0; angle <= (PI + 0.01); angle += (PI / N))
  523. {
  524. glVertex3f(0.0, pom, 0.0);
  525. glVertex3f(r3*cos(angle), pom, r3*sin(angle));
  526. }glEnd();
  527. }
  528.  
  529. glColor3f(0.0,1.0,1.0);
  530. glBegin(GL_QUAD_STRIP); // bok
  531. /*for (angle=0.0; angle<=4.01; angle+=0.2)
  532. {
  533. glVertex3f(-2.0+angle,0.0,0.0);
  534. glVertex3f(-2.0+angle,3.0,0.0);
  535. }*/
  536. for (angle = 0.0; angle <= 4.01; angle += (4/N))
  537. {
  538. glVertex3f(-2.0 + angle, 0.0, 0.0);
  539. glVertex3f(-2.0 + angle, 3.0, 0.0);
  540. }
  541. glEnd();
  542. ///////////////////////////////////
  543. /* glBegin(GL_QUAD_STRIP); //DOL
  544. glVertex3f(0.0,0.0,0.0);
  545. for (angle=0.0; angle<=(PI+0.1); angle+=(2*PI/N))
  546. {
  547. glVertex3f(r3*cos(angle),0.0,r3*sin(angle));
  548.  
  549. }
  550. glEnd();*/
  551. }
  552. //////////////////////////////////////////////////////////////////////////////////////////
  553. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  554. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  555. void UstawParametryWidoku(int szer, int wys)
  556. {
  557. // Zapamietanie wielkosci widoku
  558. szerokoscOkna = szer;
  559. wysokoscOkna = wys;
  560.  
  561. // Ustawienie parametrow viewportu
  562. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  563.  
  564. // Przejscie w tryb modyfikacji macierzy rzutowania
  565. glMatrixMode(GL_PROJECTION);
  566. glLoadIdentity();
  567. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  568. }
  569.  
  570.  
  571. //////////////////////////////////////////////////////////////////////////////////////////
  572. // Funkcja wyswietlajaca pojedyncza klatke animacji
  573. void WyswietlObraz(void)
  574. {
  575. // Wyczyszczenie bufora koloru i bufora glebokosci
  576. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  577.  
  578. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  579. glMatrixMode(GL_MODELVIEW);
  580.  
  581. // Zastapienie aktywnej macierzy macierza jednostkowa
  582. glLoadIdentity();
  583.  
  584. // Ustalenie polozenia obserwatora
  585. glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  586. glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
  587. glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
  588. glRotatef(OBSERWATOR_OBROT_Z, 0, 0, 1);
  589. // Narysowanie szescianu
  590. RysujSzescian(bok);
  591.  
  592. // Przelaczenie buforow ramki
  593. glutSwapBuffers();
  594. }
  595.  
  596.  
  597. //////////////////////////////////////////////////////////////////////////////////////////
  598. // Funkcja obslugi klawiatury
  599. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  600. {
  601. if(klawisz == '+')
  602. bok *= 2.0;
  603. else if (klawisz == '-')
  604. bok /= 2.0;
  605. else if (klawisz == '1')
  606. OBSERWATOR_OBROT_X++;
  607. else if (klawisz == '!')
  608. OBSERWATOR_OBROT_X--;
  609. else if (klawisz == '2')
  610. OBSERWATOR_OBROT_Y++;
  611. else if (klawisz == '@')
  612. OBSERWATOR_OBROT_Y--;
  613. else if (klawisz == '3')
  614. OBSERWATOR_OBROT_Z++;
  615. else if (klawisz == '#')
  616. OBSERWATOR_OBROT_Z--;
  617. else if (klawisz == '4')
  618. {if(OBSERWATOR_ODLEGLOSC < 80 ) OBSERWATOR_ODLEGLOSC++;}
  619. else if (klawisz == '$')
  620. {if(OBSERWATOR_ODLEGLOSC > -20 ) OBSERWATOR_ODLEGLOSC--;}
  621. else if (klawisz == '5')
  622. { if (N < 64) N++;}
  623. else if (klawisz == '%')
  624. {if(N > 4 ) N--;}
  625. else if (klawisz == '6')
  626. {
  627. if (N2 < 64) N2++;
  628. }
  629. else if (klawisz == '^')
  630. {
  631. if (N2 > 4) N2--;
  632. }
  633. else if (klawisz == 'z')
  634. {
  635. UstawDomyslneWartosciParametrow();
  636. WlaczOswietlenie();
  637. }
  638. else if (klawisz == 'x')
  639. {
  640. glDisable(GL_LIGHTING);
  641.  
  642. // Odblokowanie zerowego zrodla swiatla
  643. glDisable(GL_LIGHT0);
  644. }
  645.  
  646. else if (klawisz == 'c')
  647. {
  648. material1();
  649. DefiniujMaterial();
  650. }
  651. else if (klawisz == 'v')
  652. {
  653. material2();
  654. DefiniujMaterial();
  655. }
  656. else if (klawisz == 'b')
  657. {
  658. material3();
  659. DefiniujMaterial();
  660. }
  661. else if (klawisz == 27)
  662. exit(0);
  663. }
  664.  
  665.  
  666. //////////////////////////////////////////////////////////////////////////////////////////
  667. // Glowna funkcja programu
  668. int main(int argc, char **argv)
  669. {
  670. // Zainicjowanie biblioteki GLUT
  671. glutInit(&argc, argv);
  672.  
  673. // Ustawienie trybu wyswietlania
  674. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  675.  
  676. // Ustawienie polozenia dolenego lewego rogu okna
  677. glutInitWindowPosition(100, 100);
  678.  
  679. // Ustawienie rozmiarow okna
  680. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  681.  
  682. // Utworzenie okna
  683. glutCreateWindow("Szescian");
  684.  
  685. // Odblokowanie bufora glebokosci
  686. glEnable(GL_DEPTH_TEST);
  687.  
  688. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  689. glClearDepth(1000.0);
  690.  
  691. // Ustawienie koloru czyszczenia bufora ramki
  692. glClearColor (0.0f, 0.0f, 0.3f, 0.0f);
  693.  
  694. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  695. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  696.  
  697. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  698. glutDisplayFunc(WyswietlObraz);
  699.  
  700. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  701. // zmieniane sa rozmiary okna
  702. glutReshapeFunc(UstawParametryWidoku);
  703.  
  704. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  705. // zadnych zadan
  706. glutIdleFunc(WyswietlObraz);
  707.  
  708. // Zarejestrowanie funkcji obslugi klawiatury
  709. glutKeyboardFunc(ObslugaKlawiatury);
  710.  
  711. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  712. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  713. glutMainLoop();
  714.  
  715. return 0;
  716. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement