Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.78 KB | None | 0 0
  1. #include <GL/glut.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. // Definicja stalych
  7. #define DLUGOSC_BOKU 5.0
  8. #define OBSERWATOR_ODLEGLOSC 20.0
  9. #define OBSERWATOR_OBROT_X 20.0
  10. #define OBSERWATOR_OBROT_Y 20.0
  11. #define OBSERWATOR_OBROT_Z 20.0
  12. #define OBSERWATOR_FOV_Y 30.0
  13. #define X 4
  14. #define PI 3.1415926535
  15. #define DEG2RAD(x) ((float)(x)*PI/180.0)
  16. #define Beta (360.0/e)
  17.  
  18. #define X_SW 10
  19. #define Y_SW 120
  20. #define X_MAT 10
  21. #define Y_MAT 220
  22. #define X_OB 10
  23. #define Y_OB 300
  24. #define ID_SW 0
  25. #define ID_MAT 1
  26.  
  27. double e = X;
  28. double mode = 1;
  29. double HW = 3;
  30. double RW = 2;
  31. double OsX = 20;
  32. double OsY = 20;
  33. double OsZ = 0;
  34. float odmin = 1;
  35. float odmax = 200;
  36. float od = 60;
  37. double kat_x = 0.0;
  38. double kat_y = 0.0;
  39. double kat_z = 0.0;
  40. double predkosc = 0;
  41. double R_L1 = 10.0;
  42. double S = 0;
  43. int M = 0;
  44.  
  45. double i;
  46. int t=0;
  47. double j=0;
  48. // Zmienne globalne
  49. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  50. int szerokoscOkna = 800;
  51. int wysokoscOkna = 600;
  52.  
  53.  
  54. // Prototypy funkcji
  55. void UstawParametryWidoku(int szer, int wys);
  56. void WyswietlObraz(void);
  57. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  58.  
  59. void WlaczSwiatlo1() {
  60. GLfloat swiatlo1[5][4] = {
  61. {0.5, 0.1, 0.5, 1.0}, //[0] otoczenie
  62. {0.5, 0.1, 0.5, 1.0}, //[1] rozproszenie
  63. {1.0, 1.0, 1.0, 1.0}, //[2] lustrzane
  64. {0.0, 0.0, 0.0, 0.9}, //[3] polozenie
  65. {-1.0, 0.0, 0.0, 0.0} //[4] kierunek swiecenia
  66. };
  67.  
  68. glPushMatrix();
  69. glRotatef(kat_x, 1, 0, 0);
  70. glRotatef(kat_y, 0, 1, 0);
  71. glRotatef(kat_z, 0, 0, 1);
  72. glTranslatef(R_L1, 0, 0);
  73. glutSolidCube(1);
  74.  
  75. glEnable(GL_LIGHTING);
  76. glEnable(GL_LIGHT1);
  77. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo1[0]);
  78. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo1[1]);
  79. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo1[2]);
  80. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo1[3]);
  81. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo1[4]);
  82. glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
  83. glPopMatrix();
  84. }
  85.  
  86. void WlaczSwiatlo2() {
  87. GLfloat swiatlo2[5][4] = {
  88. {1.0, 1.0, 1.0, 1.0}, //[0] otoczenie
  89. {1.0, 1.0, 1.0, 1.0}, //[1] rozproszenie
  90. {0.5, 0.1, 0.5, 1.0}, //[2] lustrzane
  91. {-10.0, 5.0, 10.0, 0.9}, //[3] polozenie
  92. {0.0, 0.0, 0.0, 0.0} //[4] kierunek swiecenia
  93. };
  94.  
  95.  
  96. glEnable(GL_LIGHTING);
  97. glEnable(GL_LIGHT2);
  98. glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo2[0]);
  99. glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo2[1]);
  100. glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo2[2]);
  101. glLightfv(GL_LIGHT2, GL_POSITION, swiatlo2[3]);
  102. glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo2[4]);
  103. glPopMatrix();
  104. }
  105.  
  106. float material1[5][4] = {
  107. {0.5, 0.3, 0.0, 0.0},
  108. {1.0, 1.0, 1.0, 0.0},
  109. {0.5, 0.3, 0.0, 0.0},
  110. {0.0, 0.0, 0.0, 0.0},
  111. {0.0, 0.0, 0.0, 0.0}
  112. };
  113.  
  114. float material2[5][4] = {
  115. {1.0, 0.0, 0.0, 0.0},
  116. {1.0, 1.0, 1.0, 1.0},
  117. {0.0, 0.0, 0.0, 0.0},
  118. {0.0, 0.0, 0.0, 0.0},
  119. {0.0, 0.0, 0.0, 0.0}
  120. };
  121.  
  122. float material3[5][4] = {
  123. {1.0, 0.0, 1.0, 1.0},
  124. {1.0, 0.0, 1.0, 1.0},
  125. {1.0, 0.0, 1.0, 1.0},
  126. {3.0, 0.0, 0.0, 0.0},
  127. {0.0, 0.0, 0.0, 1.0}
  128. };
  129.  
  130. void WlaczMaterial(int mat) {
  131. if (mat == 1) {
  132. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  133. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  134. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  135. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  136. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  137. } else if (mat == 2) {
  138. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  139. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  140. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  141. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  142. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  143. } else if (mat == 3) {
  144. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  145. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  146. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  147. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  148. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  149. }
  150. }
  151.  
  152. void walec(){
  153.  
  154. double Y;
  155. double Y0 = 0.0;
  156.  
  157. glColor3f(1, 0, 0);
  158. if (mode == 1) {
  159. glBegin(GL_LINES);
  160. glVertex3f(0, 0, 0);
  161. glVertex3f(0, -4, 0);
  162. glEnd();
  163. }
  164.  
  165. glBegin(GL_TRIANGLE_FAN);
  166. glNormal3f(0, -1, 0);
  167. glVertex3f(0, 0, 0);
  168. for (i = 0; i*Beta <= 360.0; i++)
  169. {
  170. glNormal3f(cos(DEG2RAD(3*i*Beta/4)), -0.5, sin(DEG2RAD(3*i*Beta/4)));
  171. glVertex3f(RW/2*cos(DEG2RAD(3*i*Beta/4)), 0, RW/2*sin(DEG2RAD(3*i*Beta/4)));
  172. }
  173. glEnd();
  174.  
  175. if (mode == 1) {
  176. glBegin(GL_LINES);
  177. glVertex3f(0, HW, 0);
  178. glVertex3f(0, HW + 3, 0);
  179. glEnd();
  180. }
  181.  
  182. glColor3f(0, 1, 0);
  183. glBegin(GL_TRIANGLE_FAN);
  184. glNormal3f(0, 1, 0);
  185. glVertex3f(0, HW, 0);
  186. for (i = 0; i*Beta <= 360.0; i++)
  187. {
  188. glNormal3f(cos(DEG2RAD(3*i*Beta/4)), 0.5, sin(DEG2RAD(3*i*Beta/4)));
  189. glVertex3f(RW/2*cos(DEG2RAD(3*i*Beta/4)), HW, RW/2*sin(DEG2RAD(3*i*Beta/4)));
  190. }
  191. glEnd();
  192.  
  193. //sciana "okragla" kratka
  194.  
  195. for (j = 3.0 / e; j <= 3.1; j += (3.0 / e)) {
  196. Y = j;
  197. if (j > 3) Y = 3.0;
  198. glBegin(GL_QUAD_STRIP);
  199. for (i = 0; i*Beta <= 360.0; i++)
  200. {
  201. glColor3f(0, 0, 1);
  202. glNormal3f(cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)));
  203. glVertex3f(RW / 2 * cos(DEG2RAD(3*i*Beta / 4)), Y0, RW / 2 * sin(DEG2RAD(3*i*Beta / 4)));
  204. glNormal3f(cos(DEG2RAD(3*i*Beta / 4)), Y, sin(DEG2RAD(3*i*Beta / 4)));
  205. glVertex3f(RW / 2 * cos(DEG2RAD(3*i*Beta / 4)), Y, RW / 2 * sin(DEG2RAD(3*i*Beta / 4)));
  206. }
  207. glEnd();
  208.  
  209. if (mode == 1) {
  210. glBegin(GL_LINES);
  211. for (i = 0; i*Beta <= 360.0; i++)
  212. {
  213. glColor3f(0, 1, 0);
  214. glVertex3f(cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)));
  215. glVertex3f(cos(DEG2RAD(3*i*Beta / 4)) + 3 * cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)) + 3 * sin(DEG2RAD(3*i*Beta / 4)));
  216. }
  217. glEnd();
  218. }
  219.  
  220. Y0 = Y;
  221. }
  222. Y0 = 0.0;
  223. for (j = 1.0 / e; j <= 1.1; j += (1.0 / e)) {
  224. Y = j;
  225. if (j > 1) Y = 1.0;
  226.  
  227. for (i = 0; i*Beta <= 360.0; i++)
  228. {
  229.  
  230. glColor3f(0.5, 0.5, 1);
  231. glBegin(GL_QUAD_STRIP);
  232. glVertex3f(0, 0, -Y0);
  233. glVertex3f(0, HW, -Y0);
  234. glVertex3f(0, 0, -Y);
  235. glVertex3f(0, HW, -Y);
  236. glEnd();
  237.  
  238.  
  239. glBegin(GL_QUAD_STRIP);
  240. glVertex3f(Y0, 0, 0);
  241. glVertex3f(Y0, HW, 0);
  242. glVertex3f(Y, 0, 0);
  243. glVertex3f(Y, HW, 0);
  244. glEnd();
  245.  
  246. }
  247. Y0 = Y;
  248. }
  249.  
  250. }
  251.  
  252. //////////////////////////////////////////////////////////////////////////////////////////
  253. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  254. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  255. void UstawParametryWidoku(int szer, int wys)
  256. {
  257. // Zapamietanie wielkosci widoku
  258. szerokoscOkna = szer;
  259. wysokoscOkna = wys;
  260.  
  261. // Ustawienie parametrow viewportu
  262. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  263.  
  264. // Przejscie w tryb modyfikacji macierzy rzutowania
  265. glMatrixMode(GL_PROJECTION);
  266. glLoadIdentity();
  267. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  268. }
  269.  
  270. //////////////////////////////////////////////////////////////////////////////////////////
  271. // Funkcja wyswietlajaca pojedyncza klatke animacji
  272. void WyswietlObraz(void)
  273. {
  274. // Wyczyszczenie bufora koloru i bufora glebokosci
  275. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  276.  
  277. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  278. glMatrixMode(GL_MODELVIEW);
  279.  
  280. // Zastapienie aktywnej macierzy macierza jednostkowa
  281. glLoadIdentity();
  282.  
  283. // Ustalenie polozenia obserwatora
  284. glTranslatef(0, 0, -od);
  285. glRotatef(OsX, 1, 0, 0);
  286. glRotatef(OsY, 0, 1, 0);
  287. glRotatef(OsZ, 0, 0, 1);
  288.  
  289. glEnable(GL_LIGHTING);
  290. if (S == 1)
  291. WlaczSwiatlo1();
  292. WlaczMaterial(M);
  293. walec();
  294. //menu();
  295. // Przelaczenie buforow ramki
  296. glutSwapBuffers();
  297. }
  298.  
  299. //////////////////////////////////////////////////////////////////////////////////////////
  300. // Funkcja obslugi klawiatury
  301. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  302. {
  303. switch (klawisz)
  304. {
  305. case ',':
  306. S = 1;
  307. break;
  308. case 'k':
  309. glDisable(GL_LIGHTING);
  310. glDisable(GL_LIGHT1);
  311. S = 0;
  312. break;
  313. case '.':
  314. WlaczSwiatlo2();
  315. break;
  316. case 'l':
  317. glDisable(GL_LIGHTING);
  318. glDisable(GL_LIGHT2);
  319. break;
  320. case '4':
  321. M = 1;
  322. break;
  323. case '5':
  324. M = 2;
  325. break;
  326. case '6':
  327. M = 3;
  328. break;
  329. }
  330. if(klawisz == '+')
  331. bok *= 2.0;
  332. else if (klawisz == '-')
  333. bok /= 2.0;
  334. else if (klawisz == 'n')
  335. {
  336. if (od + 1 <= odmax)
  337. od++;
  338. }
  339. else if (klawisz == 'm')
  340. {
  341. if (od - 1 >= odmin)
  342. od--;
  343. }
  344. else if (klawisz == 'w')
  345. OsX++;
  346. else if (klawisz == 's')
  347. OsX--;
  348. else if (klawisz == 'a')
  349. OsY++;
  350. else if (klawisz == 'd')
  351. OsY--;
  352. else if (klawisz == 'q')
  353. OsZ++;
  354. else if (klawisz == 'e')
  355. OsZ--;
  356. else if (klawisz == '1')
  357. {
  358. if (e <= 63)
  359. e++;
  360. }
  361. else if (klawisz == '2')
  362. {
  363. if (e > 4)
  364. e--;
  365. }
  366. else if (klawisz == 'o')
  367. {
  368. mode = 1;
  369. }
  370. else if (klawisz == 'p')
  371. {
  372. mode = 0;
  373. }
  374. else if (klawisz == '[')
  375. {
  376. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  377. }
  378. else if (klawisz == ']')
  379. {
  380. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  381. }
  382. else if (klawisz == 'z')
  383. {
  384. glShadeModel(GL_FLAT);
  385. }
  386. else if (klawisz == 'x')
  387. {
  388. glShadeModel(GL_SMOOTH);
  389. }
  390. else if (klawisz == 27)
  391. exit(0);
  392. }
  393.  
  394. //////////////////////////////////////////////////////////////////////////////////////////
  395. // Glowna funkcja programu
  396. int main(int argc, char **argv)
  397. {
  398. // Zainicjowanie biblioteki GLUT
  399. glutInit(&argc, argv);
  400.  
  401. // Ustawienie trybu wyswietlania
  402. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  403.  
  404. // Ustawienie polozenia dolenego lewego rogu okna
  405. glutInitWindowPosition(100, 100);
  406.  
  407. // Ustawienie rozmiarow okna
  408. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  409.  
  410. // Utworzenie okna
  411. glutCreateWindow("Szescian");
  412.  
  413. // Odblokowanie bufora glebokosci
  414. glEnable(GL_DEPTH_TEST);
  415.  
  416. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  417. glClearDepth(1000.0);
  418.  
  419. // Ustawienie koloru czyszczenia bufora ramki
  420. glClearColor (0.3f, 0.3f, 0.3f, 0.0f);
  421.  
  422. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  423. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  424.  
  425. glShadeModel(GL_FLAT);
  426. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  427. glutDisplayFunc(WyswietlObraz);
  428.  
  429. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  430. // zmieniane sa rozmiary okna
  431. glutReshapeFunc(UstawParametryWidoku);
  432.  
  433. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  434. // zadnych zadan
  435. glutIdleFunc(WyswietlObraz);
  436.  
  437. // Zarejestrowanie funkcji obslugi klawiatury
  438. glutKeyboardFunc(ObslugaKlawiatury);
  439.  
  440. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  441. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  442. glutMainLoop();
  443.  
  444. return 0;
  445. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement