Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2020
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.66 KB | None | 0 0
  1. #include <math.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include "glut.h"
  5. #include "materials.h"
  6.  
  7. // Definicja stalych
  8. #define DLUGOSC_BOKU 5.0
  9. #define OBSERWATOR_ODLEGLOSC 20.0
  10. #define OBSERWATOR_OBROT_X 20.0
  11. #define OBSERWATOR_OBROT_Y 20.0
  12. #define OBSERWATOR_OBROT_Z 0.0
  13. #define OBSERWATOR_FOV_Y 30.0
  14. #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
  15. #define X_OFFSET_SWIATLO 10
  16. #define Y_OFFSET_SWIATLO 120
  17. #define rA 2.0
  18. #define rB 2.0
  19. #define rC 2.0
  20. #define KATpion 180.0
  21. #define KATpoz 180.0
  22. #define LPOZ_MAX 100
  23. #define LPOZ_MIN 4
  24. #define LPION_MAX 100
  25. #define LPION_MIN 4
  26. float podzial_pionowy = 10.0;
  27. float podzial_poziomy = 10.0;
  28. float PI = 3.14159265;
  29. float H = 5.0;
  30.  
  31. int lPionowych = 8; // Liczba podzialow pionowych
  32. int lPoziomych = 4; // Liczba podzialow poziomych
  33. double promien = 2; // Promien walca
  34. double wysokosc = 4; // Wysokosc walca
  35.  
  36. int ktory_material = 1;
  37.  
  38. // Zmienne globalne
  39. GLfloat M_PI = 3.14159265359;
  40. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  41. int szerokoscOkna = 800;
  42. int wysokoscOkna = 600;
  43. GLfloat rotObsY = 40.0;
  44. GLfloat rotObsX = 40.0;
  45. GLfloat rotObsZ = 0.0;
  46. int odleglosc = 20, i, j;
  47. int N = 40;
  48. int mat1 = 0, mat2 = 0, mat3 = 0;
  49. int zrodlo1 = 0, zrodlo2 = 0;
  50. int czyWypelnienie;
  51. int czywektor = 0;
  52.  
  53.  
  54. float material1[5][4] = {
  55. {1.0, 0.0, 1.0, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
  56. {1.0, 0.0, 1.0, 1.0}, // [1] wspolczynnik odbicia swiatla rozproszonego
  57. {0.508273, 0.508273, 0.508273, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  58. {51.2, 0.0, 0.0, 0.0}, // [3] polysk
  59. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  60. // Tablica parametrow materialu nr 2 - fiolet
  61.  
  62. float material2[5][4] = { //polerowany braz
  63. {0.250000, 0.148000, 0.064750, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  64. {0.400000, 0.236800, 0.103600, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  65. {0.774597, 0.458561, 0.200621, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  66. {76.8, 0.0, 0.0, 0.0}, // [3] polysk
  67. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  68.  
  69. float material3[5][4] = { //polerowane zloto
  70. {0.247250, 0.224500, 0.064500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  71. {0.346150, 0.314300, 0.090300, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  72. {0.797357, 0.723991, 0.208006, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  73. {83.2, 0.0, 0.0, 0.0}, // [3] polysk
  74. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  75.  
  76.  
  77. // Tablica parametrow zrodla swiatla nr 1
  78. GLfloat swiatlo1[5][4] = {
  79. {0.2, 0.2, 0.2, 1.0}, // [0] otoczenie
  80. {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
  81. {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
  82. {10.0, 10.0, 10.0, 1.0},// [3] polozenie
  83. {0.0, 0.0, -1.0, 0.0}// [4] kierunek swiecenia
  84. };
  85.  
  86. // Tablica parametrow zrodla swiatla nr 2
  87. GLfloat swiatlo2[5][4] = {
  88. {0, 1, 1, 1.0}, // [0] otoczenie
  89. {0, 1, 1, 1.0}, // [1] rozproszenie
  90. {0, 18, 1, 1.0}, // [2] lustrzane
  91. {-10.0, -10.0, -10.0, 1.0},// [3] polozenie
  92. {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
  93. };
  94.  
  95.  
  96. // Prototypy funkcji
  97. void RysujSzescian(double a);
  98. void UstawParametryWidoku(int szer, int wys);
  99. void WyswietlObraz(void);
  100. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  101. void RysujTekstRastrowy(void* font, char* tekst);
  102.  
  103. void Material1(void) { //Fiolet z przykladu
  104. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  105. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  106. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  107. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  108. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  109. }
  110. void Material2(void) { //Polerowany braz
  111. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  112. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  113. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  114. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  115. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  116. }
  117. void Material3(void) { //Polerowane zloto
  118. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  119. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  120. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  121. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  122. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  123. }
  124.  
  125.  
  126.  
  127.  
  128. void RysujTekstRastrowy(void* font, char* tekst)
  129. {
  130. int i;
  131. for (i = 0; i < (int)strlen(tekst); i++)
  132. glutBitmapCharacter(font, tekst[i]);
  133. }
  134.  
  135. void RysujSfere(double h, double r, int nv, int nh)
  136. {
  137. glEnable(GL_LIGHTING);
  138. // Odblokowanie zrodla swiatla nr 1
  139. if (zrodlo1 == 1) {
  140. glEnable(GL_LIGHT0);
  141. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  142. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  143. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  144. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  145. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  146.  
  147. }
  148. else {
  149. //wylaczenie zrodla swiatla nr 1
  150. glDisable(GL_LIGHT0);
  151. }
  152. // Odblokowanie zrodla swiatla nr 2
  153. if (zrodlo2 == 1) {
  154. glEnable(GL_LIGHT1);
  155. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  156. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  157. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  158. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  159. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  160.  
  161. }
  162. else {
  163. //wylaczenie zrodla swiatla nr 2
  164. glDisable(GL_LIGHT1);
  165. }
  166.  
  167.  
  168.  
  169. int ktorypoziom = 0;
  170. int b = 0;
  171. float POZi = 0.0, PIONj = 0.0, i2 = 0.0, j2 = 0.0, x1 = 0.0, y1 = 0.0, z1 = 0.0, x2 = 0.0, y2 = 0.0, z2 = 0.0, x3 = 0.0, y3 = 0.0, z3 = 0.0, x4 = 0.0, y4 = 0.0, z4 = 0.0;
  172.  
  173. /*
  174. glBegin(GL_LINES);
  175.  
  176. // Os X
  177. glColor3f(1.0, 0.0, 0.0);
  178. glVertex3f(-20.0, 0.0, 0.0);
  179. glVertex3f(20.0, 0.0, 0.0);
  180.  
  181. // Os Y
  182. glColor3f(0.0, 1.0, 0.0);
  183. glVertex3f(0.0, -20.0, 0.0);
  184. glVertex3f(0.0, 20.0, 0.0);
  185.  
  186. // Os Z
  187. glColor3f(0.0, 0.0, 1.0);
  188. glVertex3f(0.0, 0.0, -20.0);
  189. glVertex3f(0.0, 0.0, 20.0);
  190.  
  191. // Koniec tworzenia ukladu wspolrzednych
  192. glEnd();
  193. */
  194.  
  195. for (POZi = 0; POZi <= KATpoz - 1; POZi = POZi + KATpoz / podzial_poziomy)
  196. {
  197. if (ktorypoziom == 0)
  198. {
  199. ktorypoziom = 1;
  200. }
  201. else ktorypoziom = 0;
  202. for (PIONj = 90.0; PIONj <= ((KATpion - 1.0) + 90.0); PIONj = PIONj + KATpion / podzial_pionowy)
  203. {
  204. switch (ktorypoziom)
  205. {
  206. case 0:
  207. //Material1();
  208. ktorypoziom++;
  209. break;
  210. case 1:
  211. //Material2();
  212. ktorypoziom = 0;
  213. break;
  214. }
  215.  
  216. switch (ktory_material)
  217. {
  218. case 1:
  219. Material1();
  220. break;
  221. case 2:
  222. Material2();
  223. break;
  224. case 3:
  225. Material3();;
  226. break;
  227. }
  228. x1 = rA * sin(POZi * PI / 180) * cos(PIONj * PI / 180);
  229. y1 = rB * cos(POZi * PI / 180);
  230. z1 = rC * sin(POZi * PI / 180) * sin(PIONj * PI / 180);
  231.  
  232. i2 = POZi + KATpoz / podzial_poziomy;
  233. j2 = PIONj + KATpion / podzial_pionowy;
  234.  
  235. x2 = rA * sin(i2 * PI / 180) * cos(PIONj * PI / 180);
  236. y2 = rB * cos(i2 * PI / 180);
  237. z2 = rC * sin(i2 * PI / 180) * sin(PIONj * PI / 180);
  238.  
  239. x3 = rA * sin(POZi * PI / 180) * cos(j2 * PI / 180);
  240. y3 = rB * cos(POZi * PI / 180);
  241. z3 = rC * sin(POZi * PI / 180) * sin(j2 * PI / 180);
  242.  
  243. x4 = rA * sin(i2 * PI / 180) * cos(j2 * PI / 180);
  244. y4 = rB * cos(i2 * PI / 180);
  245. z4 = rC * sin(i2 * PI / 180) * sin(j2 * PI / 180);
  246.  
  247. // Sciany boczne
  248. //Material1();
  249. glColor3f(0.0, 0.0, 1.0);
  250. glBegin(GL_QUAD_STRIP);
  251. glNormal3f(x1 / rA, y1 / rB, z1 / rC);
  252. glVertex3f(x1, y1, z1);
  253. glNormal3f(x2 / rA, y2 / rB, z2 / rC);
  254. glVertex3f(x2, y2, z2);
  255. glNormal3f(x3 / rA, y3 / rB, z3 / rC);
  256. glVertex3f(x3, y3, z3);
  257. glNormal3f(x4 / rA, y4 / rB, z4 / rC);
  258. glVertex3f(x4, y4, z4);
  259.  
  260. glEnd();
  261. glColor3f(1.0, 1.0, 1.0);
  262.  
  263. if (PIONj == 90.0)
  264. {
  265. //Material1();
  266. glBegin(GL_QUAD_STRIP);
  267. glNormal3f(1.0, 0.0, 0.0);
  268. glVertex3f(0, y1, 0);
  269. glVertex3f(x2, y1, z1);
  270. glVertex3f(0, y2, 0);
  271. glVertex3f(x2, y2, z2);
  272.  
  273. glEnd();
  274. }
  275. if (j2 >= ((KATpion - 1.0) + 90.0))
  276. {
  277. //Material1();
  278. glBegin(GL_QUAD_STRIP);
  279. glNormal3f(1.0, 0.0, 0.0);
  280. glVertex3f(0, y1, 0);
  281. glVertex3f(x4, y3, z3);
  282. glVertex3f(0, y2, 0);
  283. glVertex3f(x4, y4, z4);
  284.  
  285. glEnd();
  286. }
  287. }
  288. }
  289.  
  290.  
  291. //Swiatlo1();
  292. //Swiatlo2();
  293. }
  294.  
  295. void RysujNormalne()
  296. {
  297.  
  298. glEnable(GL_LIGHTING);
  299. // Odblokowanie zrodla swiatla nr 1
  300. if (zrodlo1 == 1) {
  301. glEnable(GL_LIGHT0);
  302. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  303. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  304. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  305. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  306. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  307.  
  308. }
  309. else {
  310. //wylaczenie zrodla swiatla nr 1
  311. glDisable(GL_LIGHT0);
  312. }
  313. // Odblokowanie zrodla swiatla nr 2
  314. if (zrodlo2 == 1) {
  315. glEnable(GL_LIGHT1);
  316. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  317. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  318. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  319. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  320. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  321.  
  322. }
  323. else {
  324. //wylaczenie zrodla swiatla nr 2
  325. glDisable(GL_LIGHT1);
  326. }
  327.  
  328.  
  329.  
  330. int ktorypoziom = 0;
  331. int b = 0;
  332. float POZi = 0.0, PIONj = 0.0, i2 = 0.0, j2 = 0.0, x1 = 0.0, y1 = 0.0, z1 = 0.0, x2 = 0.0, y2 = 0.0, z2 = 0.0, x3 = 0.0, y3 = 0.0, z3 = 0.0, x4 = 0.0, y4 = 0.0, z4 = 0.0;
  333.  
  334. for (POZi = 0; POZi <= KATpoz - 1; POZi = POZi + KATpoz / podzial_poziomy)
  335. {
  336. if (ktorypoziom == 0)
  337. {
  338. ktorypoziom = 1;
  339. }
  340. else ktorypoziom = 0;
  341. for (PIONj = 90.0; PIONj <= ((KATpion - 1.0) + 90.0); PIONj = PIONj + KATpion / podzial_pionowy)
  342. {
  343. switch (ktorypoziom)
  344. {
  345. case 0:
  346. //Material1();
  347. ktorypoziom++;
  348. break;
  349. case 1:
  350. //Material2();
  351. ktorypoziom = 0;
  352. break;
  353. }
  354.  
  355. switch (ktory_material)
  356. {
  357. case 1:
  358. Material1();
  359. break;
  360. case 2:
  361. Material2();
  362. break;
  363. case 3:
  364. Material3();;
  365. break;
  366. }
  367. x1 = rA * sin(POZi * PI / 180) * cos(PIONj * PI / 180);
  368. y1 = rB * cos(POZi * PI / 180);
  369. z1 = rC * sin(POZi * PI / 180) * sin(PIONj * PI / 180);
  370.  
  371. i2 = POZi + KATpoz / podzial_poziomy;
  372. j2 = PIONj + KATpion / podzial_pionowy;
  373.  
  374. x2 = rA * sin(i2 * PI / 180) * cos(PIONj * PI / 180);
  375. y2 = rB * cos(i2 * PI / 180);
  376. z2 = rC * sin(i2 * PI / 180) * sin(PIONj * PI / 180);
  377.  
  378. x3 = rA * sin(POZi * PI / 180) * cos(j2 * PI / 180);
  379. y3 = rB * cos(POZi * PI / 180);
  380. z3 = rC * sin(POZi * PI / 180) * sin(j2 * PI / 180);
  381.  
  382. x4 = rA * sin(i2 * PI / 180) * cos(j2 * PI / 180);
  383. y4 = rB * cos(i2 * PI / 180);
  384. z4 = rC * sin(i2 * PI / 180) * sin(j2 * PI / 180);
  385.  
  386. glColor3f(0.0, 0.0, 1.0);
  387. glBegin(GL_LINES);
  388. glVertex3f(x1 * rA, y1 * rB, z1 * rC);
  389. glVertex3f(x1, y1, z1);
  390. glVertex3f(x2 * rA, y2 * rB, z2 * rC);
  391. glVertex3f(x2, y2, z2);
  392. glVertex3f(x3 * rA, y3 * rB, z3 * rC);
  393. glVertex3f(x3, y3, z3);
  394. glVertex3f(x4 * rA, y4 * rB, z4 * rC);
  395. glVertex3f(x4, y4, z4);
  396.  
  397. glEnd();
  398. glColor3f(1.0, 1.0, 1.0);
  399.  
  400. if (PIONj == 90.0)
  401. {
  402. //Material1();
  403. glBegin(GL_LINES);
  404. glVertex3f(1.0, y1, 0.0);
  405. glVertex3f(0, y1, 0);
  406.  
  407. glVertex3f(1, y1, z1);
  408. glVertex3f(x2, y1, z1);
  409.  
  410. glVertex3f(1, y2, 0);
  411. glVertex3f(0, y2, 0);
  412.  
  413. glVertex3f(1, y2, z2);
  414. glVertex3f(x2, y2, z2);
  415.  
  416. glEnd();
  417. }
  418. if (j2 >= ((KATpion - 1.0) + 90.0))
  419. {
  420. //Material1();
  421. glBegin(GL_LINES);
  422. glVertex3f(1.0, y1, 0.0);
  423. glVertex3f(0, y1, 0);
  424.  
  425. glVertex3f(1, y3, z3);
  426. glVertex3f(x4, y3, z3);
  427.  
  428. glVertex3f(1, y2, 0);
  429. glVertex3f(0, y2, 0);
  430.  
  431. glVertex3f(1, y4, z4);
  432. glVertex3f(x4, y4, z4);
  433.  
  434. glEnd();
  435. }
  436.  
  437.  
  438.  
  439. // Gorna sciana
  440. /*}}*/
  441. }
  442. }
  443.  
  444. }
  445.  
  446.  
  447.  
  448. //////////////////////////////////////////////////////////////////////////////////////////
  449. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  450. // Srodek szescianu znajduje się w punkcie (0,0,0).
  451. void RysujSzescian(double a)
  452. {
  453. glEnable(GL_LIGHTING);
  454. // Odblokowanie zrodla swiatla nr 1
  455. if (zrodlo1 == 1) {
  456. glEnable(GL_LIGHT0);
  457. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  458. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  459. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  460. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  461. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  462.  
  463. }
  464. else {
  465. //wylaczenie zrodla swiatla nr 1
  466. glDisable(GL_LIGHT0);
  467. }
  468. // Odblokowanie zrodla swiatla nr 2
  469. if (zrodlo2 == 1) {
  470. glEnable(GL_LIGHT1);
  471. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  472. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  473. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  474. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  475. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  476.  
  477. }
  478. else {
  479. //wylaczenie zrodla swiatla nr 2
  480. glDisable(GL_LIGHT1);
  481. }
  482.  
  483. if (mat1 == 1) {
  484. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  485. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  486. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  487. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  488. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  489. }
  490. else if (mat2 == 1) {
  491. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  492. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  493. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  494. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  495. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  496. }
  497. else if (mat3 == 1) { //Polerowane zloto
  498. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  499. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  500. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  501. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  502. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  503. }
  504. // Pocztaek tworzenia ukladu wspolrzednych
  505.  
  506.  
  507.  
  508.  
  509.  
  510. glColor3f(1, 0, 2);
  511.  
  512. double i;
  513. double dAlfa = 360 / N;
  514. float stala = 4;
  515. int promien = 15;
  516.  
  517. // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  518.  
  519. glBegin(GL_TRIANGLE_STRIP);
  520. // glPolygonMode(GL_BACK, GL_FILL);
  521. // glColor3f(1.0, 1.0, 0.0);
  522.  
  523.  
  524. //A
  525.  
  526.  
  527.  
  528. for (i = 0; i * dAlfa <= 360.0; i++) {
  529.  
  530. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
  531. glVertex3f(promien * cos(DEG2RAD((i)*dAlfa)), 4, promien * sin(DEG2RAD((i)*dAlfa)));
  532. //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  533. //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
  534.  
  535.  
  536.  
  537. }
  538. glVertex3f(promien * cos(DEG2RAD(360)), 0, promien * sin(DEG2RAD(360)));
  539. glVertex3f(promien * cos(DEG2RAD(360)), 4, promien * sin(DEG2RAD(360)));
  540.  
  541.  
  542. for (i = 0; i * dAlfa <= 360.0; i++) {
  543.  
  544. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
  545. glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), 0, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
  546. //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  547. //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
  548.  
  549. }
  550.  
  551. glVertex3f(promien * cos(DEG2RAD(360)), 0, promien * sin(DEG2RAD(360)));
  552. glVertex3f((promien + 4) * cos(DEG2RAD(360)), 0, (promien + 4) * sin(DEG2RAD(360)));
  553.  
  554. for (i = 0; i * dAlfa <= 360.0; i++) {
  555.  
  556. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  557. glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), 0, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
  558. //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  559. //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
  560.  
  561. }
  562.  
  563.  
  564.  
  565.  
  566. glEnd();
  567.  
  568.  
  569.  
  570.  
  571.  
  572. /*
  573.  
  574. // Sciany boczne
  575. glBegin(GL_QUAD_STRIP);
  576. glVertex3f(a/2.0, a/2.0, a/2.0);
  577. glVertex3f(a/2.0, -a/2.0, a/2.0);
  578. glVertex3f(a/2.0, a/2.0, -a/2.0);
  579. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  580.  
  581. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  582. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  583.  
  584. glVertex3f(-a/2.0, a/2.0, a/2.0);
  585. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  586.  
  587. glVertex3f(a/2.0, a/2.0, a/2.0);
  588. glVertex3f(a/2.0, -a/2.0, a/2.0);
  589. glEnd();
  590.  
  591. // Gorna sciana
  592. glBegin(GL_QUAD_STRIP);
  593. glVertex3f(-a/2.0, a/2.0, a/2.0);
  594. glVertex3f(a/2.0, a/2.0, a/2.0);
  595. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  596. glVertex3f(a/2.0, a/2.0, -a/2.0);
  597. glEnd();
  598.  
  599. // Dolna sciana
  600. glBegin(GL_QUAD_STRIP);
  601. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  602. glVertex3f(a/2.0, -a/2.0, a/2.0);
  603. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  604. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  605. glEnd();
  606. */
  607. }
  608.  
  609.  
  610.  
  611.  
  612. void RysujWektor(double a) {
  613.  
  614. glDisable(GL_LIGHTING);
  615. glColor3f(0, 0, 2);
  616.  
  617. double i;
  618. double dAlfa = 360 / N;
  619. float stala = 4;
  620. int promien = 15;
  621.  
  622. // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  623. glColor3f(0.0, 0.0, 0.0);
  624. glBegin(GL_LINES);
  625. // glPolygonMode(GL_BACK, GL_FILL);
  626.  
  627.  
  628.  
  629. //A
  630.  
  631.  
  632.  
  633. for (i = 0; i * dAlfa < 360.0; i++) {
  634.  
  635. // lewy dol dol
  636. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
  637. glVertex3f(promien * cos(DEG2RAD((i)*dAlfa)), -1, promien * sin(DEG2RAD((i)*dAlfa)));
  638. }
  639.  
  640. for (i = 0; i * dAlfa < 360.0; i++) {
  641.  
  642. // lewy dol lewo
  643. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
  644. glVertex3f((promien - 1) * cos(DEG2RAD((i)*dAlfa)), 0, (promien - 1) * sin(DEG2RAD((i)*dAlfa)));
  645. }
  646.  
  647.  
  648. for (i = 0; i * dAlfa < 360.0; i++) {
  649.  
  650. // lewy gorny lewo
  651. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  652. glVertex3f((promien - 1) * cos(DEG2RAD((i)*dAlfa)), 4, (promien - 1) * sin(DEG2RAD((i)*dAlfa)));
  653. }
  654.  
  655. for (i = 0; i * dAlfa < 360.0; i++) {
  656.  
  657. // lewy gorny prawo
  658. glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
  659. glVertex3f((promien + 1 / 1.4142) * cos(DEG2RAD((i)*dAlfa)), 4 + 1 / 1.4142, (promien + 1 / 1.4142) * sin(DEG2RAD((i)*dAlfa)));
  660. //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
  661.  
  662. }
  663.  
  664. for (i = 0; i * dAlfa < 360.0; i++) {
  665.  
  666. // prawy dolny prawo
  667. glVertex3f((promien + 4) * cos(DEG2RAD(i * dAlfa)), 0, (promien + 4) * sin(DEG2RAD(i * dAlfa)));
  668. glVertex3f((promien + 4 + 1 / 1.4142) * cos(DEG2RAD((i)*dAlfa)), 1 / 1.4142, (promien + 4 + 1 / 1.4142) * sin(DEG2RAD((i)*dAlfa)));
  669. //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
  670.  
  671. }
  672.  
  673. for (i = 0; i * dAlfa < 360.0; i++) {
  674.  
  675. // prawy dolny dol
  676. glVertex3f((promien + 4) * cos(DEG2RAD(i * dAlfa)), 0, (promien + 4) * sin(DEG2RAD(i * dAlfa)));
  677. glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), -1, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
  678. //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
  679.  
  680. }
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688. glEnable(GL_LIGHTING);
  689.  
  690. glEnd();
  691.  
  692.  
  693. }
  694.  
  695.  
  696.  
  697. //////////////////////////////////////////////////////////////////////////////////////////
  698. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  699. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  700. void UstawParametryWidoku(int szer, int wys)
  701. {
  702. // Zapamietanie wielkosci widoku
  703. szerokoscOkna = szer;
  704. wysokoscOkna = wys;
  705.  
  706. // Ustawienie parametrow viewportu
  707. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  708.  
  709. // Przejscie w tryb modyfikacji macierzy rzutowania
  710. glMatrixMode(GL_PROJECTION);
  711. glLoadIdentity();
  712. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  713. }
  714.  
  715.  
  716. void RysujNakladke(void)
  717. {
  718.  
  719. char buf[255];
  720.  
  721. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  722. glMatrixMode(GL_PROJECTION);
  723. glPushMatrix();
  724. glLoadIdentity();
  725. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  726.  
  727. // Modelowanie sceny 2D (zawartosci nakladki)
  728. glMatrixMode(GL_MODELVIEW);
  729. glPushMatrix();
  730. glLoadIdentity();
  731.  
  732. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  733. glDisable(GL_LIGHTING);
  734.  
  735. // Okreslenie koloru tekstu
  736. glColor3f(1.0, 1.0, 1.0);
  737.  
  738. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  739.  
  740. sprintf(buf, "Wlaczenie/wylaczenie pierwszego swiatla 1/!");
  741. glRasterPos2i(10, 180);
  742. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  743.  
  744. glColor3f(1.0, 1.0, 1.0);
  745. sprintf(buf, "Wlaczenie/wylaczenie drugiego swiatla 2/@");
  746. glRasterPos2i(10, 160);
  747. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  748.  
  749. glColor3f(1.0, 1.0, 1.0);
  750. sprintf(buf, "Zwiekszenie/zmniejszenie podzialow poziomych - [/{");
  751. glRasterPos2i(10, 140);
  752. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  753.  
  754. glColor3f(1.0, 1.0, 1.0);
  755. sprintf(buf, "Zwiekszenie/zmniejszenie podzialow pionowych - ]/}");
  756. glRasterPos2i(10, 120);
  757. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  758.  
  759. glColor3f(1.0, 1.0, 1.0);
  760. sprintf(buf, "Zmiana pozycji obserwatora - strzalki");
  761. glRasterPos2i(10, 100);
  762. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  763.  
  764.  
  765. glColor3f(1.0, 1.0, 1.0);
  766. sprintf(buf, "Przyblizenie/oddalenie - +/-");
  767. glRasterPos2i(10, 80);
  768. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  769.  
  770. glColor3f(1.0, 1.0, 1.0);
  771. sprintf(buf, "GL_LINES/GL_FILL - f/g");
  772. glRasterPos2i(10, 60);
  773. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  774.  
  775. glColor3f(1.0, 1.0, 1.0);
  776. sprintf(buf, "Cieniowanie gladkie/plaskie - v/b");
  777. glRasterPos2i(10, 40);
  778. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  779.  
  780. glColor3f(1.0, 1.0, 1.0);
  781. sprintf(buf, "Zmiana materialu - m");
  782. glRasterPos2i(10, 20);
  783. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
  784.  
  785. // Odblokowanie oswietlenia
  786. glEnable(GL_LIGHTING);
  787.  
  788. }
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798. //////////////////////////////////////////////////////////////////////////////////////////
  799. // Funkcja wyswietlajaca pojedyncza klatke animacji
  800. void WyswietlObraz(void)
  801. {
  802. // Wyczyszczenie bufora koloru i bufora glebokosci
  803. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  804.  
  805. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  806. glMatrixMode(GL_MODELVIEW);
  807.  
  808. // Zastapienie aktywnej macierzy macierza jednostkowa
  809. glLoadIdentity();
  810.  
  811. UstawParametryWidoku(szerokoscOkna, wysokoscOkna);
  812. // Ustalenie polozenia obserwatora
  813. glTranslatef(0, 0, -odleglosc);
  814. glRotatef(rotObsX, 1, 0, 0);
  815. glRotatef(rotObsY, 0, 1, 0);
  816. glRotatef(rotObsZ, 0, 0, 1);
  817.  
  818.  
  819. // Narysowanie szescianu
  820. //RysujSzescian(bok);
  821. if (czywektor == 1) {
  822. RysujNormalne();
  823. }
  824. // Narysowanie tekstow z opisem parametrow oswietlenia i materialu
  825. RysujSfere(wysokosc, promien, lPoziomych, lPionowych);
  826. RysujNakladke();
  827.  
  828. // Przelaczenie buforow ramki
  829. glutSwapBuffers();
  830. }
  831.  
  832.  
  833. //////////////////////////////////////////////////////////////////////////////////////////
  834. // Funkcja obslugi klawiatury
  835. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  836. {
  837. /*
  838. if(klawisz == '+')
  839. bok *= 1.1;
  840. else if (klawisz == '-')
  841. bok /= 1.1;
  842. else if (klawisz == 27)
  843. exit(0);
  844. */
  845. switch (klawisz)
  846. {
  847. case 'q':
  848. rotObsZ = rotObsZ - 1.0;
  849. break;
  850.  
  851. case 'm':
  852. if (ktory_material == 1) ktory_material = 2;
  853. else if (ktory_material == 2) ktory_material = 3;
  854. else ktory_material = 1;
  855. break;
  856.  
  857. case 'e':
  858. rotObsZ = rotObsZ + 1.0;
  859. break;
  860.  
  861. case '-':
  862. case '_':
  863. odleglosc = (odleglosc < 200) ? odleglosc + 1 : odleglosc;
  864. break;
  865.  
  866. case '+':
  867. case '=':
  868. odleglosc = (odleglosc > 10) ? odleglosc - 1 : odleglosc;
  869. break;
  870.  
  871. case 'a':
  872. N = (N < 64) ? N + 2 : N;
  873. break;
  874.  
  875. case 's':
  876. N = (N > 4) ? N - 2 : N;
  877. break;
  878.  
  879. case '1':
  880. zrodlo1 = 1;
  881. break;
  882.  
  883. case '!':
  884. zrodlo1 = 0;
  885. break;
  886.  
  887. case '2':
  888. zrodlo2 = 1;
  889. break;
  890.  
  891. case '@':
  892. zrodlo2 = 0;
  893. break;
  894.  
  895. case '5':
  896. mat1 = 1;
  897. mat2 = 0;
  898. mat3 = 0;
  899. break;
  900.  
  901. case '6':
  902. mat1 = 0;
  903. mat2 = 1;
  904. mat3 = 0;
  905. break;
  906. case '7':
  907. mat1 = 0;
  908. mat2 = 0;
  909. mat3 = 1;
  910. break;
  911.  
  912. case ',':
  913. czywektor = 0;
  914. break;
  915. case '.':
  916. czywektor = 1;
  917. break;
  918. case ']':
  919. podzial_pionowy = (podzial_pionowy == LPION_MAX) ? LPION_MAX : podzial_pionowy + 2; //zwiększenie liczby podziałów pionowych
  920. break;
  921.  
  922. case '}':
  923. podzial_pionowy = (podzial_pionowy == LPION_MIN) ? LPION_MIN : podzial_pionowy - 2; //zmniejszenie liczby podziałów pionowych
  924. break;
  925.  
  926. case '[':
  927. podzial_poziomy = (podzial_poziomy == LPOZ_MAX) ? LPOZ_MAX : podzial_poziomy + 2; //zwiększenie liczby podziałów poziomych
  928. break;
  929.  
  930. case '{':
  931. podzial_poziomy = (podzial_poziomy == LPOZ_MIN) ? LPOZ_MIN : podzial_poziomy - 2; //zmniejszenie liczby podziałów poziomych
  932. break;
  933.  
  934. case 'v':
  935. glShadeModel(GL_SMOOTH);
  936. break;
  937. case 'b':
  938. glShadeModel(GL_FLAT);
  939. break;
  940. break;
  941.  
  942. case 'f':
  943. czyWypelnienie = 1;
  944. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  945. break;
  946.  
  947. case 'g':
  948. czyWypelnienie = 0;
  949. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  950. break;
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958. }
  959. if (klawisz == 27)
  960. exit(0);
  961. }
  962.  
  963.  
  964. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  965. {
  966. switch (klawisz)
  967. {
  968. case GLUT_KEY_UP:
  969. rotObsX--;
  970. break;
  971.  
  972. case GLUT_KEY_DOWN:
  973. rotObsX++;
  974. break;
  975.  
  976. case GLUT_KEY_LEFT:
  977. rotObsY--;
  978. break;
  979.  
  980. case GLUT_KEY_RIGHT:
  981. rotObsY++;
  982. break;
  983. }
  984. }
  985.  
  986.  
  987. //////////////////////////////////////////////////////////////////////////////////////////
  988. // Glowna funkcja programu
  989. int main(int argc, char** argv)
  990. {
  991. // Zainicjowanie biblioteki GLUT
  992. glutInit(&argc, argv);
  993.  
  994. // Ustawienie trybu wyswietlania
  995. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  996.  
  997. // Ustawienie polozenia dolenego lewego rogu okna
  998. glutInitWindowPosition(100, 100);
  999.  
  1000. // Ustawienie rozmiarow okna
  1001. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  1002.  
  1003. // Utworzenie okna
  1004. glutCreateWindow("Szescian");
  1005.  
  1006. // Odblokowanie bufora glebokosci
  1007. glEnable(GL_DEPTH_TEST);
  1008.  
  1009. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  1010. glClearDepth(1000.0);
  1011.  
  1012. // Ustawienie koloru czyszczenia bufora ramki
  1013. glClearColor(0.0, 0.0, 0.0, 0.0);
  1014.  
  1015. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  1016. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  1017.  
  1018. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  1019. glutDisplayFunc(WyswietlObraz);
  1020.  
  1021. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  1022. // zmieniane sa rozmiary okna
  1023. glutReshapeFunc(UstawParametryWidoku);
  1024.  
  1025. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  1026. // zadnych zadan
  1027. glutIdleFunc(WyswietlObraz);
  1028.  
  1029. // Zarejestrowanie funkcji obslugi klawiatury
  1030. glutKeyboardFunc(ObslugaKlawiatury);
  1031.  
  1032.  
  1033. /// obsloga klawiszy specjalnych
  1034. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  1035.  
  1036. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  1037. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  1038. glutMainLoop();
  1039.  
  1040. return 0;
  1041. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement