Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.11 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 <GL/glut.h>
  8. #include <math.h>
  9. #define M_PI acos(-1.0)
  10.  
  11. // Definicja stalych
  12. #define DLUGOSC_BOKU 5.0
  13. #define OBSERWATOR_FOV_Y 30.0
  14.  
  15. // Zmienne globalne
  16. double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
  17. int szerokoscOkna = 1280;
  18. int wysokoscOkna = 720;
  19. float R = 20;
  20. float r = 5;
  21. float h = 10;
  22. float pion = 4;
  23. float dAlfa = 360 / 4;
  24. float podzialp = 4;
  25. GLfloat odlmin = -23;
  26. GLfloat odlmax = -140;
  27. GLfloat odl = -50;
  28. GLfloat rotObsY = 40.0;
  29. GLfloat rotObsX = 10.0;
  30. GLfloat rotObsZ = 0.0;
  31.  
  32. // Prototypy funkcji
  33. void RysujSzescian(double a);
  34. void UstawParametryWidoku(int szer, int wys);
  35. void WyswietlObraz(void);
  36. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  37.  
  38. double DEG2RAD(double deg) {
  39. return (deg * M_PI) / 180.0;
  40. }
  41.  
  42. void RysujXYZ() {
  43. glBegin(GL_LINES);
  44.  
  45. // Os X
  46. glColor3f(1.0, 0.0, 0.0);
  47. glVertex3f(-140.0, 0.0, 0.0);
  48. glVertex3f(140.0, 0.0, 0.0);
  49.  
  50. // Os Y
  51. glColor3f(0.0, 1.0, 0.0);
  52. glVertex3f(0.0, -80.0, 0.0);
  53. glVertex3f(0.0, 80.0, 0.0);
  54.  
  55. // Os Z
  56. glColor3f(0.0, 0.0, 1.0);
  57. glVertex3f(0.0, 0.0, -120.0);
  58. glVertex3f(0.0, 0.0, 120.0);
  59.  
  60. // Koniec tworzenia ukladu wspolrzednych
  61. glEnd();
  62. }
  63.  
  64.  
  65.  
  66.  
  67. //////////////////////////////////////////////////////////////////////////////////////////
  68. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  69. // Srodek szescianu znajduje się w punkcie (0,0,0).
  70. void RysujSzescian(double a)
  71. {
  72. // Sciany boczne
  73. glBegin(GL_QUAD_STRIP);
  74. glVertex3f(a/2.0, a/2.0, a/2.0);
  75. glVertex3f(a/2.0, -a/2.0, a/2.0);
  76. glVertex3f(a/2.0, a/2.0, -a/2.0);
  77. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  78.  
  79. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  80. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  81.  
  82. glVertex3f(-a/2.0, a/2.0, a/2.0);
  83. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  84.  
  85. glVertex3f(a/2.0, a/2.0, a/2.0);
  86. glVertex3f(a/2.0, -a/2.0, a/2.0);
  87. glEnd();
  88.  
  89. // Gorna sciana
  90. glBegin(GL_QUAD_STRIP);
  91. glVertex3f(-a/2.0, a/2.0, a/2.0);
  92. glVertex3f(a/2.0, a/2.0, a/2.0);
  93. glVertex3f(-a/2.0, a/2.0, -a/2.0);
  94. glVertex3f(a/2.0, a/2.0, -a/2.0);
  95. glEnd();
  96.  
  97. // Dolna sciana
  98. glBegin(GL_QUAD_STRIP);
  99. glVertex3f(-a/2.0, -a/2.0, a/2.0);
  100. glVertex3f(a/2.0, -a/2.0, a/2.0);
  101. glVertex3f(-a/2.0, -a/2.0, -a/2.0);
  102. glVertex3f(a/2.0, -a/2.0, -a/2.0);
  103. glEnd();
  104. }
  105. void RysujCylinder() {
  106. float temp_r = R;
  107. float podzial_r = (R-r) / podzialp;
  108. float temp_h = 0;
  109. float podzial_h = h / podzialp;
  110. glBegin(GL_TRIANGLE_FAN);
  111. glVertex3f(0, 0, 0);
  112. for (int b = 0; b * dAlfa <= 360.0; b++)
  113. {
  114. glVertex3f(R * cos(DEG2RAD(b * dAlfa)), 0.0, R * sin(DEG2RAD(b * dAlfa)));
  115. }
  116. glEnd();
  117.  
  118. for (int a = 0; a < podzialp; a++) {
  119. glBegin(GL_QUADS);
  120. float i = 0;
  121. glVertex3f(temp_r * cos(DEG2RAD(i * dAlfa)), temp_h, temp_r * sin(DEG2RAD(i * dAlfa)));
  122. glVertex3f((temp_r - podzial_r) * cos(DEG2RAD(i * dAlfa)), temp_h + podzial_h, (temp_r - podzial_r) * sin(DEG2RAD(i * dAlfa)));
  123. for (i = 1; i * dAlfa < 360.0; i++)
  124. {
  125. glVertex3f((temp_r - podzial_r) * cos(DEG2RAD(i * dAlfa)), temp_h + podzial_h, (temp_r - podzial_r) * sin(DEG2RAD(i * dAlfa)));
  126. glVertex3f(temp_r * cos(DEG2RAD(i * dAlfa)), temp_h, temp_r * sin(DEG2RAD(i * dAlfa)));
  127.  
  128. glVertex3f(temp_r * cos(DEG2RAD(i * dAlfa)), temp_h, temp_r * sin(DEG2RAD(i * dAlfa)));
  129. glVertex3f((temp_r - podzial_r) * cos(DEG2RAD(i * dAlfa)), temp_h + podzial_h, (temp_r - podzial_r) * sin(DEG2RAD(i * dAlfa)));
  130. }
  131. glVertex3f((temp_r - podzial_r) * cos(DEG2RAD(360)), temp_h + podzial_h, (temp_r - podzial_r) * sin(DEG2RAD(360)));
  132. glVertex3f(temp_r * cos(DEG2RAD(360)), temp_h, temp_r * sin(DEG2RAD(360)));
  133. temp_r -= podzial_r;
  134. temp_h += podzial_h;
  135. glEnd();
  136. glBegin(GL_TRIANGLE_FAN);
  137. glVertex3f(0, h, 0);
  138. for (int b = 0; b * dAlfa <= 360.0; b++)
  139. {
  140. glVertex3f(r * cos(DEG2RAD(b * dAlfa)), h, r * sin(DEG2RAD(b * dAlfa)));
  141. }
  142. glEnd();
  143. }
  144.  
  145. }
  146.  
  147. //////////////////////////////////////////////////////////////////////////////////////////
  148. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  149. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  150. void UstawParametryWidoku(int szer, int wys)
  151. {
  152. // Zapamietanie wielkosci widoku
  153. szerokoscOkna = szer;
  154. wysokoscOkna = wys;
  155.  
  156. // Ustawienie parametrow viewportu
  157. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  158.  
  159. // Przejscie w tryb modyfikacji macierzy rzutowania
  160. glMatrixMode(GL_PROJECTION);
  161. glLoadIdentity();
  162. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
  163. }
  164.  
  165.  
  166. //////////////////////////////////////////////////////////////////////////////////////////
  167. // Funkcja wyswietlajaca pojedyncza klatke animacji
  168. void WyswietlObraz(void)
  169. {
  170. // Wyczyszczenie bufora koloru i bufora glebokosci
  171. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  172.  
  173. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  174. glMatrixMode(GL_MODELVIEW);
  175.  
  176. // Zastapienie aktywnej macierzy macierza jednostkowa
  177. glLoadIdentity();
  178.  
  179. // Ustalenie polozenia obserwatora
  180. if (odl < odlmax) odl = odlmax;
  181. if (odl > odlmin) odl = odlmin;
  182. glTranslatef(0, 0, odl);
  183. glRotatef(rotObsX, 1, 0, 0);
  184. glRotatef(rotObsY, 0, 1, 0);
  185. glRotatef(rotObsZ, 0, 0, 1);
  186.  
  187.  
  188. RysujXYZ(); //Rysowanie linii układu
  189. glColor3f(1, 0, 1);
  190. RysujCylinder();
  191. glPushMatrix();
  192. glTranslatef(40, 0, 0);
  193. glColor3f(1, 1, 1);
  194. // Narysowanie szescianu
  195. RysujSzescian(bok);
  196. glPopMatrix;
  197.  
  198. // Przelaczenie buforow ramki
  199. glutSwapBuffers();
  200. }
  201.  
  202. // Funkcja klawiszy specjalnych
  203. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  204. {
  205. switch (klawisz)
  206. {
  207. case GLUT_KEY_UP:
  208. rotObsX += 1.0;
  209. break;
  210.  
  211. case GLUT_KEY_DOWN:
  212. rotObsX -= 1.0;
  213. break;
  214.  
  215. case GLUT_KEY_LEFT:
  216. rotObsY += 1.0;
  217. break;
  218.  
  219. case GLUT_KEY_RIGHT:
  220. rotObsY -= 1.0;
  221. break;
  222. }
  223. }
  224.  
  225. //////////////////////////////////////////////////////////////////////////////////////////
  226. // Funkcja obslugi klawiatury
  227. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  228. {
  229. switch (klawisz) {
  230. case '+':
  231. bok *= 2.0;
  232. break;
  233. case '-':
  234. bok /= 2.0;
  235. break;
  236. case '[':
  237. rotObsZ -= 1.0;
  238. break;
  239. case ']':
  240. rotObsZ += 1.0;
  241. break;
  242. case 'o': //oddalanie obserwatora
  243. odl -= 1.0;
  244. break;
  245. case 'p': //przybliżanie obserwatora
  246. odl += 1.0;
  247. break;
  248. case '1':
  249. pion++;
  250. if (pion > 64)pion = 64;
  251. dAlfa = 360 / pion;
  252. break;
  253. case '!':
  254. pion--;
  255. if (pion < 4)pion = 4;
  256. dAlfa = 360 / pion;
  257. break;
  258. case '2':
  259. podzialp++;
  260. if (podzialp > 64)podzialp = 64;
  261. break;
  262. case '@':
  263. podzialp--;
  264. if (podzialp < 4)podzialp = 4;
  265. break;
  266. }
  267. if(klawisz == 27)
  268. exit(0);
  269.  
  270. }
  271.  
  272.  
  273. //////////////////////////////////////////////////////////////////////////////////////////
  274. // Glowna funkcja programu
  275. int main(int argc, char **argv)
  276. {
  277. // Zainicjowanie biblioteki GLUT
  278. glutInit(&argc, argv);
  279.  
  280. // Ustawienie trybu wyswietlania
  281. glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  282.  
  283. // Ustawienie polozenia dolenego lewego rogu okna
  284. glutInitWindowPosition(100, 100);
  285.  
  286. // Ustawienie rozmiarow okna
  287. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  288.  
  289. // Utworzenie okna
  290. glutCreateWindow("Szescian");
  291.  
  292. // Odblokowanie bufora glebokosci
  293. glEnable(GL_DEPTH_TEST);
  294.  
  295. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  296. glClearDepth(1000.0);
  297.  
  298. // Ustawienie koloru czyszczenia bufora ramki
  299. glClearColor (0.0f, 0.0f, 0.3f, 0.0f);
  300.  
  301. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  302. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  303.  
  304. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  305. glutDisplayFunc(WyswietlObraz);
  306.  
  307. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  308. // zmieniane sa rozmiary okna
  309. glutReshapeFunc(UstawParametryWidoku);
  310.  
  311. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  312. // zadnych zadan
  313. glutIdleFunc(WyswietlObraz);
  314.  
  315. // Zarejestrowanie funkcji obslugi klawiatury
  316. glutKeyboardFunc(ObslugaKlawiatury);
  317.  
  318. // Zarejestrowanie funkcji obslugi klawiszy specjalnych
  319. glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  320.  
  321. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  322. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  323. glutMainLoop();
  324.  
  325. return 0;
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement