Advertisement
Guest User

lab5

a guest
Jan 25th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.32 KB | None | 0 0
  1.  
  2. //////////////////////////////////////////////////////////////////////////////////////////
  3. //
  4. // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
  5. // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
  6. //
  7. //////////////////////////////////////////////////////////////////////////////////////////
  8. #include <GL/glut.h>
  9. #include <math.h>
  10.  
  11. // Definicja stalych
  12. #define DLUGOSC_BOKU 5.0
  13. #define OBSERWATOR_ODLEGLOSC 20.0
  14. #define OBSERWATOR_OBROT_X 20.0
  15. #define OBSERWATOR_OBROT_Y 20.0
  16. #define OBSERWATOR_OBROT_Z 0.0
  17. #define OBSERWATOR_FOV_Y 30.0
  18.  
  19. // Zmienne globalne
  20.  
  21. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  22. int szerokoscOkna = 800;
  23. int wysokoscOkna = 600;
  24. float odlmin = -300;
  25. float odlmax = 200;
  26.  
  27. float DEG2RAD = 3.1415926535 / 180.0;
  28. float u = 4;
  29. float alfa = 360.0;
  30. float alfa1 = 30;
  31. float alfa2 = 360.0 / 4;
  32. float R = 2;
  33. float r = 0;
  34. float k = 0.1;
  35. float H = 10;
  36. float h = 3;
  37. float pom1;
  38. float pom2;
  39. int zmiana4 = 0;
  40. float pom3;
  41. float pom4;
  42. float l = 6;
  43. float r1 = 4;
  44. float podz_h = 1.0 / 4.0;
  45. float pom_podz_h = 4;
  46.  
  47.  
  48.  
  49. int zrodlo1 = 1;
  50. int obecnymaterial = 2;
  51. int zrodlo2 = 1;
  52. int normalne = 1;
  53. int smooth = 1;
  54. int fill = 1;
  55. float vector1[3];
  56. float vector2[3];
  57. float vector3out[3];
  58. float n_vector1[3];
  59. float n_vector2[3];
  60. float n_vector3out[3];
  61. float il[3];
  62. float k_vector1[3];
  63. float k_vector2[3];
  64. float k_vector3out[3];
  65. float k_n_vector1[3];
  66. float k_n_vector2[3];
  67. float k_n_vector3out[3];
  68. float k_il[3];
  69. void vectorCreate(float fVecU[3], float fVecV[3], float fVecOut[3])
  70. {
  71. fVecOut[0] = fVecV[0]- fVecU[0];
  72. fVecOut[1] = fVecV[1] - fVecU[1];
  73. fVecOut[2] = fVecV[2] - fVecU[2];
  74. }
  75.  
  76.  
  77.  
  78. void vectorCreate_iloczyn(float fVecU[3], float fVecV[3], float fVecOut[3])
  79. {
  80. fVecOut[0] = (fVecU[1] * fVecV[2] - fVecU[2] * fVecV[1]);
  81. fVecOut[1] = -(fVecU[0] * fVecV[2] - fVecU[2] * fVecV[0]);
  82. fVecOut[2] = (fVecU[0] * fVecV[1] - fVecU[1] * fVecV[0]);;
  83.  
  84. }
  85.  
  86.  
  87. GLfloat swiatlo1[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. {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
  91. {0, 10.0, 0, 1.0},// [3] polozenie
  92. {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
  93. };
  94. // Tablica parametrow zrodla swiatla nr 1
  95. GLfloat swiatlo2[5][4] = {
  96. {1, 1, 1, 1.0}, // [0] otoczenie
  97. {1, 1, 1, 1.0}, // [1] rozproszenie
  98. {0, 1, 1, 1.0}, // [2] lustrzane
  99. {0, -10.0, 0.0, 1.0},// [3] polozenie
  100. {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
  101. };
  102.  
  103. float material1[5][4] = {
  104. {0.192250, 0.192250, 0.192250, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  105. {0.507540, 0.507540, 0.507540, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  106. {0.508273, 0.508273, 0.508273, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  107. {51.2, 0.0, 0.0, 0.0}, // [3] polysk
  108. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  109. // Tablica parametrow materialu nr 2
  110. float material2[5][4] = {
  111. {0.250000, 0.148000, 0.064750, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  112. {0.400000, 0.236800, 0.103600, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  113. {0.774597, 0.458561, 0.200621, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  114. {76.8, 0.0, 0.0, 0.0}, // [3] polysk
  115. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  116. float material3[5][4] = {
  117. {0.247250, 0.199500, 0.074500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
  118. {0.751640, 0.606480, 0.226480, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
  119. {0.628281, 0.555802, 0.366065, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
  120. {52.2, 0.0, 0.0, 0.0}, // [3] polysk
  121. {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
  122.  
  123.  
  124. void UstawSwiatlaIMaterialy()
  125. {
  126. glEnable(GL_LIGHTING);
  127. // Odblokowanie zrodla swiatla nr 1
  128. if (zrodlo1 == 1) {
  129. glEnable(GL_LIGHT0);
  130. glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
  131. glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
  132. glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
  133. glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
  134. glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
  135.  
  136. }
  137. else {
  138. //wylaczenie zrodla swiatla nr 1
  139. glDisable(GL_LIGHT0);
  140. }
  141. // Odblokowanie zrodla swiatla nr 2
  142. if (zrodlo2 == 1) {
  143. glEnable(GL_LIGHT1);
  144. glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
  145. glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
  146. glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
  147. glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
  148. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
  149.  
  150. }
  151. else {
  152. //wylaczenie zrodla swiatla nr 2
  153. glDisable(GL_LIGHT1);
  154. }
  155.  
  156.  
  157. switch (obecnymaterial)
  158. {
  159. case 0:
  160. glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
  161. glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
  162. glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
  163. glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
  164. glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
  165. break;
  166. case 1:
  167. glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
  168. glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
  169. glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
  170. glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
  171. glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
  172. break;
  173. case 2:
  174. glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
  175. glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
  176. glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
  177. glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
  178. glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
  179. break;
  180. default:
  181. break;
  182. }
  183. }
  184.  
  185.  
  186. void RysujTekstRastrowy(void* font, char* tekst)
  187. {
  188. int i = 0;
  189. while (tekst[i] != '\0')
  190. {
  191. glutBitmapCharacter(font, tekst[i]);
  192. i++;
  193. }
  194. }
  195.  
  196. #define numberofoptions 11
  197.  
  198. void RysujNakladke(void)
  199. {
  200. char tab[numberofoptions][50] =
  201. { "+ - PRZYBLIZENIE",
  202. " - -ODDALENIE",
  203. "G/H - ZMNIEJSZANIE ILOSCI PODZIALOW",
  204. "V/B - ZWIEKSZANIE ILOSCI PODZIALOW",
  205. "1 - Zmiana materialu pierscienia",
  206. "6 - Sterowanie swiatlem I",
  207. "7 - Sterowanie swiatlem II",
  208. "2 - Widocznosc normalnych",
  209. "i - GL_SMOOTH <-> GL_FLAT",
  210. "u - GL_FILL <-> GL_LINE",
  211. "w/s, a/d, q/e - Sterowanie osia x,y,z",
  212. };
  213. int i;
  214.  
  215. // Zmiana typu rzutu z perspektywicznego na ortogonalny
  216. glMatrixMode(GL_PROJECTION);
  217. glPushMatrix();
  218. glLoadIdentity();
  219. glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
  220.  
  221. // Modelowanie sceny 2D (zawartosci nakladki)
  222. glMatrixMode(GL_MODELVIEW);
  223. glPushMatrix();
  224. glLoadIdentity();
  225.  
  226. // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
  227. glDisable(GL_LIGHTING);
  228.  
  229. // Okreslenie koloru tekstu
  230. glColor3f(1.0, 1.0, 1.0);
  231.  
  232. // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
  233.  
  234. for (i = 0; i < numberofoptions; i++)
  235. {
  236. glRasterPos2i(10, 10 + i * 13);
  237. RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, tab[numberofoptions - i - 1]);
  238. }
  239.  
  240. glMatrixMode(GL_PROJECTION);
  241. glPopMatrix();
  242. glMatrixMode(GL_MODELVIEW);
  243. glPopMatrix();
  244. }
  245.  
  246.  
  247.  
  248. GLfloat odleglosc_ob = OBSERWATOR_ODLEGLOSC;
  249. GLfloat rot_x = OBSERWATOR_OBROT_X;
  250. GLfloat rot_y = OBSERWATOR_OBROT_Y;
  251. GLfloat rot_z = OBSERWATOR_OBROT_Z;
  252.  
  253. // Prototypy funkcji
  254. void RysujSzescian(double a);
  255. void UstawParametryWidoku(int szer, int wys);
  256. void WyswietlObraz(void);
  257. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  258.  
  259.  
  260.  
  261. //////////////////////////////////////////////////////////////////////////////////////////
  262. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  263. // Srodek szescianu znajduje się w punkcie (0,0,0).
  264.  
  265. stozek2_wektor(void)
  266. {
  267. for (int j = 0; j < 4; j++)
  268. {
  269. /*
  270. glBegin(GL_LINES);
  271. glColor3f(1,0,0);
  272. glVertex3f(0,0,0);
  273. glVertex3f(0,-1,0);
  274. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  275. {
  276. pom1 = DEG2RAD * (i * alfa2);
  277. glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
  278. glVertex3f((float)(2 * cos(pom1)), -1, (float)(2 * sin(pom1)));
  279. }
  280. glEnd();
  281. */
  282.  
  283. glColor3f(1, 0, 0);
  284. for (int j = 1; j * podz_h <= 1; j++)
  285. {
  286. glBegin(GL_LINES);
  287.  
  288. if (j % 2 == 0)
  289. glColor3f(1, 1, 0);
  290. else
  291. glColor3f(1, 0.5, 0);
  292.  
  293. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  294. {
  295. pom1 = DEG2RAD * (i * alfa2);
  296. pom2 = DEG2RAD * ((i - 1) * alfa2);
  297. pom2 = DEG2RAD * ((i + 1) * alfa2);
  298.  
  299. vector1[0] = 2 * (1 - (j - 1) * podz_h) * cos(pom1);
  300. vector1[1] = 4 * ((j - 1) * podz_h);
  301. vector1[2] = 2 * (1 - (j - 1) * podz_h) * sin(pom1);
  302. vector2[0] = 2 * (1 - j * podz_h) * cos(pom1);
  303. vector2[1] = 4 * (j * podz_h);
  304. n_vector2[2] = 2 * (1 - j * podz_h) * sin(pom1);
  305. n_vector2[0] = 2 * (1 - j * podz_h) * cos(pom2);
  306. n_vector2[1] = 4 * (j * podz_h);
  307. vector2[2] = 2 * (1 - j * podz_h) * sin(pom2);
  308. vectorCreate(vector1, vector2, vector3out);
  309. vectorCreate(vector1, n_vector2, n_vector3out);
  310. vectorCreate_iloczyn(vector3out, n_vector3out, il);
  311.  
  312.  
  313.  
  314. // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
  315. // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)) + il[0] / il[1], 4 * ((j - 1) * podz_h) + 1, (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)) + il[2] / il[1]);
  316. glVertex3f((float)(2 * (1 - (j -1)* podz_h) * cos(pom1)), 4 * ((j-1) * podz_h), (float)(2 * (1 - (j-1)* podz_h) * sin(pom1)));
  317. glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom1) + il[0]/il[1])), (4 * ((j-1) * podz_h) + il[1] / il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom1)) + il[2] / il[1]));
  318. // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
  319. // glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom3) + k_il[0] / k_il[1])), (4 * ((j - 1) * podz_h) + k_il[1] / k_il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom3)) + k_il[2] / k_il[1]));
  320. k_il[0] = il[0];
  321. k_il[1] = il[1];
  322. k_il[2] = il[2];
  323. // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom2)));
  324. // glVertex3f(((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)) + il[0]), (4 * ((j - 1) * podz_h) + il[1]), ((float)(2 * (1 - (j - 1) * podz_h) * sin(pom2)) + il[2]));
  325. // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1)* podz_h) * sin(pom2)));
  326. // glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom2) + il[0] / il[1])), (4 * ((j - 1) * podz_h) + il[1]/il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom2)) + il[2]/il[1]));
  327.  
  328. }
  329. glEnd();
  330.  
  331. /* glBegin(GL_QUAD_STRIP);
  332.  
  333. if (j % 2 == 0)
  334. glColor3f(0, 1, 0);
  335. else
  336. glColor3f(0, 0.8, 0);
  337.  
  338. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
  339. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
  340. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  341. glVertex3f(0, 4 * (j * podz_h), 0);
  342. glEnd();
  343.  
  344. glBegin(GL_QUAD_STRIP);
  345.  
  346. if (j % 2 == 0)
  347. glColor3f(0, 1, 1);
  348. else
  349. glColor3f(0, 0.8, 0.8);
  350.  
  351. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
  352. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
  353. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  354. glVertex3f(0, 4 * (j * podz_h), 0);
  355. glEnd();
  356. */
  357. }
  358.  
  359. }
  360. }
  361. void stozek(void)
  362. {
  363. glBegin(GL_TRIANGLE_FAN);
  364. glVertex3f(0, 0, 0);
  365. for (int i = 0; i * alfa2 <= 360.0; i++)
  366. {
  367. pom1 = DEG2RAD * (i * alfa2);
  368. glVertex3f(20 * cos(pom1), 0, 20 * sin(pom1));
  369. }
  370. glEnd();
  371.  
  372. glBegin(GL_TRIANGLE_FAN);
  373. glVertex3f(0, 25, 0);
  374. for (int i = 0; i * alfa2 <= 360.0; i++)
  375. {
  376. pom1 = DEG2RAD * (i * alfa2);
  377. glVertex3f((float)(10 * cos(pom1)), 25, 10 * sin(pom1));
  378. }
  379. glEnd();
  380.  
  381.  
  382. for (int i = 0; i * alfa2 <= 360.0; i++)
  383. {
  384. pom1 = DEG2RAD * (i * alfa2);
  385. pom2 = DEG2RAD * ((i + 1) * alfa2);
  386. glBegin(GL_QUADS);
  387. glVertex3f((float)(20 * cos(pom1)), 0, (float)(20 * sin(pom1)));
  388. glVertex3f((float)(10 * cos(pom1)), 25, (float)(10 * sin(pom1)));
  389. glVertex3f((float)(10 * cos(pom2)), 25, (float)(10 * sin(pom2)));
  390. glVertex3f((float)(20 * cos(pom2)), 0, (float)(20 * sin(pom2)));
  391. glEnd();
  392. }
  393.  
  394.  
  395. }
  396.  
  397. test(void)
  398. {
  399. glBegin(GL_LINES);
  400. {
  401. glVertex3f(0, 0, 0);
  402. glVertex3f(1, 1, 0);
  403. glVertex3f(0, 0, 0);
  404. glVertex3f(0, 1, 1);
  405. vector1[0] = 0;
  406. vector1[1] = 0;
  407. vector1[2] = 0;
  408. vector2[0] = 1;
  409. vector2[1] = 1;
  410. vector2[2] = 0;
  411. n_vector2[0] = 0;
  412. n_vector2[1] = 1;
  413. n_vector2[2] = 1;
  414. vectorCreate(vector1, vector2, vector3out);
  415. vectorCreate(vector1, n_vector2, n_vector3out);
  416. vectorCreate_iloczyn(vector3out,n_vector3out, il);
  417. glVertex3f(0, 0, 0);
  418. glVertex3f(-il[0], -il[1], -il[2]);
  419.  
  420. }
  421. glEnd();
  422. }
  423.  
  424. stozek2(void)
  425. {
  426. for (int j = 0; j < 4; j++)
  427. {
  428.  
  429. glBegin(GL_TRIANGLE_FAN);
  430. glColor3f(1, 0, 0);
  431. glNormal3f(0, 1, 0);
  432. glVertex3f(0, 0, 0);
  433. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  434. {
  435. pom1 = DEG2RAD * (i * alfa2);
  436. glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
  437. }
  438. glEnd();
  439.  
  440.  
  441. glColor3f(1, 0, 0);
  442. for (int j = 1; j * podz_h <= 1; j++)
  443. {
  444. glBegin(GL_QUAD_STRIP);
  445.  
  446. if (j % 2 == 0)
  447. glColor3f(1, 1, 0);
  448. else
  449. glColor3f(1, 0.5, 0);
  450.  
  451. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  452. {
  453. pom1 = DEG2RAD * (i * alfa2);
  454. glNormal3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 2 * (1 - (j ) * podz_h)/(4 * ((j - 1) * podz_h)), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
  455. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
  456.  
  457. glNormal3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 2 * (1 - (j )* podz_h)/ (4 * (j * podz_h)), (float)(2 * (1 - j * podz_h) * sin(pom1)));
  458. glVertex3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(pom1)));
  459. }
  460. glEnd();
  461.  
  462. glBegin(GL_QUAD_STRIP);
  463.  
  464. if (j % 2 == 0)
  465. glColor3f(0, 1, 0);
  466. else
  467. glColor3f(0, 0.8, 0);
  468.  
  469. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
  470. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
  471. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  472. glVertex3f(0, 4 * (j * podz_h), 0);
  473. glEnd();
  474.  
  475. glBegin(GL_QUAD_STRIP);
  476.  
  477. if (j % 2 == 0)
  478. glColor3f(0, 1, 1);
  479. else
  480. glColor3f(0, 0.8, 0.8);
  481.  
  482. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
  483. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
  484. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  485. glVertex3f(0, 4 * (j * podz_h), 0);
  486. glEnd();
  487.  
  488. }
  489. }
  490. }
  491.  
  492. stozek3(void)
  493. {
  494. for (int j = 0; j < 4; j++)
  495. {
  496.  
  497. glBegin(GL_TRIANGLE_FAN);
  498. glColor3f(1, 0, 0);
  499. glVertex3f(0, 0, 0);
  500. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  501. {
  502. pom1 = DEG2RAD * (i * alfa2);
  503. glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
  504. }
  505. glEnd();
  506.  
  507.  
  508. glColor3f(1, 0, 0);
  509. for (int j = 1; j * podz_h <= 1; j++)
  510. {
  511. glBegin(GL_TRIANGLE_STRIP);
  512.  
  513. if (j % 2 == 0)
  514. glColor3f(1, 1, 0);
  515. else
  516. glColor3f(1, 0.5, 0);
  517.  
  518. for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
  519. {
  520. pom1 = DEG2RAD * (i * alfa2);
  521. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
  522. glVertex3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(pom1)));
  523. }
  524. glEnd();
  525.  
  526. glBegin(GL_TRIANGLE_STRIP);
  527.  
  528. // if (j % 2 == 0)
  529. glColor3f(0, 1, 0);
  530. // else
  531. // glColor3f(0, 0.8, 0);
  532.  
  533. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
  534. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
  535. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  536. glVertex3f(0, 4 * (j * podz_h), 0);
  537. glEnd();
  538.  
  539. glBegin(GL_TRIANGLE_STRIP);
  540.  
  541. // if (j % 2 == 0)
  542. glColor3f(0, 1, 1);
  543. // else
  544. // glColor3f(0, 0.8, 0.8);
  545.  
  546. glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
  547. glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
  548. glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
  549. glVertex3f(0, 4 * (j * podz_h), 0);
  550. glEnd();
  551.  
  552. }
  553. }
  554. }
  555. void X_Y_Z(void)
  556. {
  557. glPushMatrix();
  558. glBegin(GL_LINES);
  559. //x
  560. glColor3f(1, 0, 0);
  561. glVertex3f(-30, 0, 0);
  562. glVertex3f(30, 0, 0);
  563. //y
  564. glColor3f(0, 1, 0);
  565. glVertex3f(0, -30, 0);
  566. glVertex3f(0, 30, 0);
  567. //z
  568. glColor3f(0, 0, 1);
  569. glVertex3f(0, 0, -30);
  570. glVertex3f(0, 0, 30);
  571. glEnd();
  572.  
  573. }
  574. void RysujSzescian(double a)
  575. {
  576. // Sciany boczne
  577. glBegin(GL_QUAD_STRIP);
  578. glColor3f(1, 0, 0);
  579. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  580. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  581. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  582. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  583. glColor3f(0, 1, 0);
  584. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  585. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  586. glColor3f(0, 0, 1);
  587. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  588. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  589. glColor3f(0, 1, 1);
  590. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  591. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  592. glEnd();
  593.  
  594. // Gorna sciana
  595. glBegin(GL_QUAD_STRIP);
  596. glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
  597. glVertex3f(a / 2.0, a / 2.0, a / 2.0);
  598. glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
  599. glVertex3f(a / 2.0, a / 2.0, -a / 2.0);
  600. glEnd();
  601.  
  602. // Dolna sciana
  603. glBegin(GL_QUAD_STRIP);
  604. glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
  605. glVertex3f(a / 2.0, -a / 2.0, a / 2.0);
  606. glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
  607. glVertex3f(a / 2.0, -a / 2.0, -a / 2.0);
  608. glEnd();
  609.  
  610. }
  611.  
  612. //////////////////////////////////////////////////////////////////////////////////////////
  613. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  614. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  615. void UstawParametryWidoku(int szer, int wys)
  616. {
  617. // Zapamietanie wielkosci widoku
  618. szerokoscOkna = szer;
  619. wysokoscOkna = wys;
  620.  
  621. // Ustawienie parametrow viewportu
  622. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  623.  
  624. // Przejscie w tryb modyfikacji macierzy rzutowania
  625. glMatrixMode(GL_PROJECTION);
  626. glLoadIdentity();
  627. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  628. }
  629.  
  630.  
  631. //////////////////////////////////////////////////////////////////////////////////////////
  632. // Funkcja wyswietlajaca pojedyncza klatke animacji
  633. void WyswietlObraz(void)
  634. {
  635. // Wyczyszczenie bufora koloru i bufora glebokosci
  636. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  637.  
  638. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  639. glMatrixMode(GL_MODELVIEW);
  640.  
  641. // Zastapienie aktywnej macierzy macierza jednostkowa
  642. glLoadIdentity();
  643.  
  644. // Ustalenie polozenia obserwatora
  645. glTranslatef(0, 0, -odleglosc_ob);
  646. glRotatef(rot_x, 1, 0, 0);
  647. glRotatef(rot_y, 0, 1, 0);
  648. glRotatef(rot_z, 0, 0, 1);
  649.  
  650. RysujNakladke();
  651. UstawSwiatlaIMaterialy();
  652. // Narysowanie szescianu
  653. // RysujSzescian(bok);
  654. //X_Y_Z();
  655. stozek2();
  656. stozek2_wektor();
  657. //test();
  658. // Przelaczenie buforow ramki
  659. glutSwapBuffers();
  660.  
  661. if (zmiana4 == 0)
  662. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  663. else if (zmiana4 == 1)
  664. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  665. if (smooth)
  666. glShadeModel(GL_SMOOTH);
  667. else
  668. glShadeModel(GL_FLAT);
  669.  
  670. }
  671.  
  672.  
  673. //////////////////////////////////////////////////////////////////////////////////////////
  674. // Funkcja obslugi klawiatury
  675. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  676. {
  677. if (klawisz == '-' && odleglosc_ob <= odlmax)
  678. odleglosc_ob += 1;
  679. else if (klawisz == '+' && odleglosc_ob >= odlmin)
  680. odleglosc_ob -= 1;
  681. else if (klawisz == 'w')
  682. rot_x += 1.0;
  683. else if (klawisz == 's')
  684. rot_x -= 1.0;
  685. else if (klawisz == 'd')
  686. rot_y -= 1.0;
  687. else if (klawisz == 'a')
  688. rot_y += 1.0;
  689. else if (klawisz == 'e')
  690. rot_z -= 1.0;
  691. else if (klawisz == 'q')
  692. rot_z += 1.0;
  693.  
  694.  
  695. else if (klawisz == 'b' && r1 >= 4 && r1 < 64)
  696. {
  697. r1 += 1;
  698. alfa2 = 360 * 3 / 4 / r1;
  699. }
  700. else if (klawisz == 'v' && r1 > 4 && r1 <= 64)
  701. {
  702. r1 -= 1;
  703. alfa2 = 360 * 3 / 4 / r1;
  704. }
  705.  
  706. else if (klawisz == 'h' && pom_podz_h >= 4 && pom_podz_h < 64)
  707. {
  708. pom_podz_h++;
  709. podz_h = 1.0 / pom_podz_h;
  710. }
  711. else if (klawisz == 'g' && pom_podz_h > 4 && pom_podz_h <= 64)
  712. {
  713. pom_podz_h--;
  714. podz_h = 1.0 / pom_podz_h;
  715. }
  716.  
  717. else if (klawisz == 'u' && zmiana4 == 0)
  718. {
  719. zmiana4 = 1;
  720. }
  721.  
  722. else if (klawisz == 'u' && zmiana4 == 1)
  723. {
  724. zmiana4 = 0;
  725. }
  726.  
  727. else if (klawisz == '6' && zrodlo1 == 0)
  728. {
  729. zrodlo1 = 1;
  730. }
  731.  
  732. else if (klawisz == '6' && zrodlo1 == 1)
  733. {
  734. zrodlo1 = 0;
  735. }
  736.  
  737. else if (klawisz == '7' && zrodlo2 == 0)
  738. {
  739. zrodlo2 = 1;
  740. }
  741.  
  742. else if (klawisz == '7' && zrodlo2 == 1)
  743. {
  744. zrodlo2 = 0;
  745. }
  746.  
  747. else if (klawisz == '1' && obecnymaterial == 0)
  748. {
  749. obecnymaterial = 1;
  750. }
  751.  
  752. else if (klawisz == '1' && obecnymaterial == 1)
  753. {
  754. obecnymaterial = 2;
  755. }
  756.  
  757. else if (klawisz == '1' && obecnymaterial == 2)
  758. {
  759. obecnymaterial = 0;
  760. }
  761.  
  762. else if (klawisz == 'i' && smooth == 0)
  763. {
  764. smooth = 1;
  765. }
  766.  
  767. else if (klawisz == 'i' && smooth == 1)
  768. {
  769. smooth = 0;
  770. }
  771.  
  772. }
  773.  
  774.  
  775. //////////////////////////////////////////////////////////////////////////////////////////
  776. // Glowna funkcja programu
  777. int main(int argc, char** argv)
  778. {
  779. // Zainicjowanie biblioteki GLUT
  780. glutInit(&argc, argv);
  781.  
  782. // Ustawienie trybu wyswietlania
  783. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  784.  
  785. // Ustawienie polozenia dolenego lewego rogu okna
  786. glutInitWindowPosition(100, 100);
  787.  
  788. // Ustawienie rozmiarow okna
  789. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  790.  
  791. // Utworzenie okna
  792. glutCreateWindow("Szescian");
  793.  
  794. // Odblokowanie bufora glebokosci
  795. glEnable(GL_DEPTH_TEST);
  796.  
  797. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  798. glClearDepth(1000.0);
  799.  
  800. // Ustawienie koloru czyszczenia bufora ramki
  801. glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  802.  
  803. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  804.  
  805. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  806.  
  807.  
  808. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  809. glutDisplayFunc(WyswietlObraz);
  810.  
  811. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  812. // zmieniane sa rozmiary okna
  813. glutReshapeFunc(UstawParametryWidoku);
  814.  
  815. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  816. // zadnych zadan
  817. glutIdleFunc(WyswietlObraz);
  818.  
  819. // Zarejestrowanie funkcji obslugi klawiatury
  820. glutKeyboardFunc(ObslugaKlawiatury);
  821.  
  822. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  823. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  824. glutMainLoop();
  825.  
  826. return 0;
  827. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement