Advertisement
Guest User

Untitled

a guest
Jan 17th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 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.  
  10.  
  11. // Definicja stalych
  12. #define WYSOKOSC 4.0
  13. #define PROMIEN 5.0
  14. #define PROMIEN2 1.0
  15. #define OBSERWATOR_FOV_Y 30.0
  16. #define PODZIAL_X 20.0
  17. #define PODZIAL_Y 20.0
  18. GLfloat N = 60.0;
  19. GLfloat OBSERWATOR_OBROT_Z = 20.0;
  20. GLfloat OBSERWATOR_OBROT_X = 20.0;
  21. GLfloat OBSERWATOR_OBROT_Y = 20.0;
  22. GLfloat OBSERWATOR_ODLEGLOSC = 20.0;
  23. GLfloat odminimalna = 5;
  24. GLfloat odmaxymalna = 200;
  25.  
  26. // Zmienne globalne
  27. double promien = PROMIEN; // Dlugosc boku szescianu
  28. double promien2 = PROMIEN2; // Dlugosc boku szescianu
  29. double wysokosc = WYSOKOSC;
  30. int szerokoscOkna = 1024;
  31. int wysokoscOkna = 768;
  32. float j = 0, i = 0;
  33. float a, x, y, z;
  34.  
  35.  
  36. // Prototypy funkcji
  37. void UstawParametryWidoku(int szer, int wys);
  38. void WyswietlObraz(void);
  39. void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
  40.  
  41.  
  42. //////////////////////////////////////////////////////////////////////////////////////////
  43. // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
  44. // Srodek szescianu znajduje się w punkcie (0,0,0).
  45. void RysujStozek(double R1, double R2, double H)
  46. {
  47.  
  48. float x, y, z, fi, OD, DO, OD1, DO1, R = R1;
  49. const long double PI = 3.1415926535897932384626433832795028841971693993751058209, EPS = PODZIAL_X, EPS2 = PODZIAL_Y;
  50. OD1 = 0.0;
  51. DO1 = 2.0001*PI;
  52. OD = 0.0;
  53. DO = 2.0001*PI;
  54.  
  55. glBegin(GL_LINES);
  56.  
  57. // Os X
  58. glColor3f(1.0, 0.0, 0.0);
  59. glVertex3f(-40.0, 0.0, 0.0);
  60. glVertex3f(40.0, 0.0, 0.0);
  61.  
  62. // Os Y
  63. glColor3f(0.0, 1.0, 0.0);
  64. glVertex3f(0.0, -20.0, 0.0);
  65. glVertex3f(0.0, 20.0, 0.0);
  66.  
  67. // Os Z
  68. glColor3f(0.0, 0.0, 1.0);
  69. glVertex3f(0.0, 0.0, -20.0);
  70. glVertex3f(0.0, 0.0, 20.0);
  71.  
  72. // Koniec tworzenia ukladu wspolrzednych
  73. glEnd();
  74.  
  75. glTranslatef(0, WYSOKOSC, 0);
  76. glBegin(GL_TRIANGLE_STRIP);
  77. for (y = 0; (y <= H) && (R >= R2); y -= H / N, R -= ((R1 - R2) / N))
  78. {
  79.  
  80. for (fi = OD1; fi < DO1; fi += PI / N)
  81. {
  82. x = R * cos(fi);
  83. z = R * sin(fi);
  84. glVertex3f(x, y, z);
  85.  
  86. x = (R - ((R1 - R2) / N)) * cos(fi - PI / N);
  87. z = (R - ((R1 - R2) / N)) * sin(fi - PI / N);
  88. glVertex3f(x, (y + H / N), z);
  89.  
  90.  
  91.  
  92. }
  93. }
  94. glEnd();
  95. glTranslatef(0, -WYSOKOSC, 0);
  96. glBegin(GL_TRIANGLE_FAN);
  97.  
  98. glVertex3f(0.0, 0.0, 0.0);
  99. for (fi = OD; fi <= DO; fi += PI / N)
  100. {
  101. x = R2 * cos(fi);
  102. z = R2 * sin(fi);
  103. glVertex3f(x, 0, z);
  104.  
  105. }
  106.  
  107. glEnd();
  108.  
  109. glBegin(GL_TRIANGLE_FAN);
  110.  
  111. glVertex3f(0, H, 0);
  112. for (fi = OD; fi < DO; fi += PI / N)
  113. {
  114. x = R1 * cos(fi);
  115. z = R1 * sin(fi);
  116. glVertex3f(x, H, z);
  117.  
  118. }
  119.  
  120. glEnd();
  121. }
  122.  
  123. //////////////////////////////////////////////////////////////////////////////////////////
  124. // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
  125. // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
  126. void UstawParametryWidoku(int szer, int wys)
  127. {
  128. // Zapamietanie wielkosci widoku
  129. szerokoscOkna = szer;
  130. wysokoscOkna = wys;
  131.  
  132. // Ustawienie parametrow viewportu
  133. glViewport(0, 0, szerokoscOkna, wysokoscOkna);
  134.  
  135. // Przejscie w tryb modyfikacji macierzy rzutowania
  136. glMatrixMode(GL_PROJECTION);
  137. glLoadIdentity();
  138. gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna / (float)wysokoscOkna, 1.0, 1000.0);
  139. }
  140.  
  141.  
  142. //////////////////////////////////////////////////////////////////////////////////////////
  143. // Funkcja wyswietlajaca pojedyncza klatke animacji
  144. void WyswietlObraz(void)
  145. {
  146. // Wyczyszczenie bufora koloru i bufora glebokosci
  147. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  148.  
  149. // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
  150. glMatrixMode(GL_MODELVIEW);
  151.  
  152. // Zastapienie aktywnej macierzy macierza jednostkowa
  153. glLoadIdentity();
  154.  
  155. // Ustalenie polozenia obserwatora
  156. glTranslatef(0, 0, -OBSERWATOR_ODLEGLOSC);
  157. glRotatef(OBSERWATOR_OBROT_X, 1, 0, 0);
  158. glRotatef(OBSERWATOR_OBROT_Y, 0, 1, 0);
  159. glRotatef(OBSERWATOR_OBROT_Z, 0, 0, 1);
  160.  
  161. // Narysowanie szescianu
  162. RysujStozek(promien, promien2, wysokosc);
  163.  
  164. // Przelaczenie buforow ramki
  165. glutSwapBuffers();
  166. }
  167.  
  168.  
  169. //////////////////////////////////////////////////////////////////////////////////////////
  170. // Funkcja obslugi klawiatury
  171. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  172. {
  173. /* if (klawisz == '+')
  174. {
  175. promien *= 1.01;
  176. promien2 *= 1.01;
  177. }
  178. else if (klawisz == '-')
  179. {
  180. promien /= 1.01;
  181. promien2 /= 1.01;
  182. }
  183. else if (klawisz == 27)
  184. exit(0);
  185. else if (klawisz == 'w')
  186. OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X + 1.0;
  187. else if (klawisz == 's')
  188. OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X - 1.0;
  189. else if (klawisz == 'd')
  190. OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y + 1.0;
  191. else if (klawisz == 'a')
  192. OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y - 1.0;
  193. else if (klawisz == 'e')
  194. OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z + 1.0;
  195. else if (klawisz == 'q')
  196. OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z - 1.0;
  197. else if (klawisz == 'g')
  198. OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC < odminimalna) ? OBSERWATOR_ODLEGLOSC + 1.0 : OBSERWATOR_ODLEGLOSC;
  199. else if (klawisz == 'r')
  200. OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC > odmaxymalna) ? OBSERWATOR_ODLEGLOSC - 1.0 : OBSERWATOR_ODLEGLOSC;
  201. else if (klawisz == '1')
  202. N += 5.0;
  203. else if (klawisz == '2')
  204. N -= 5.0;*/
  205.  
  206.  
  207. switch (klawisz) {
  208. case 'w':OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X + 1.0; break;
  209. case 's':OBSERWATOR_OBROT_X = OBSERWATOR_OBROT_X - 1.0; break;
  210. case 'a':OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y - 1.0; break;
  211. case 'd':OBSERWATOR_OBROT_Y = OBSERWATOR_OBROT_Y + 1.0; break;
  212. case 'q':OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z - 1.0; break;
  213. case 'e':OBSERWATOR_OBROT_Z = OBSERWATOR_OBROT_Z + 1.0; break;
  214. case 'r':OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC < odmaxymalna) ? OBSERWATOR_ODLEGLOSC + 1.0 : OBSERWATOR_ODLEGLOSC; break;
  215. case 'f':OBSERWATOR_ODLEGLOSC = (OBSERWATOR_ODLEGLOSC > odmaxymalna) ? OBSERWATOR_ODLEGLOSC - 1.0 : OBSERWATOR_ODLEGLOSC; break;
  216. case '1': N += 5.0; break;
  217. case '2': N -= 5.0; break;
  218. case '3':
  219. {
  220. promien *= 1.01;promien2 *= 1.01;
  221. }break;
  222. case '4':
  223. {
  224. promien /= 1.01; promien2 /= 1.01;
  225. }break;
  226.  
  227. }//koniec switcha
  228. }
  229.  
  230.  
  231. //////////////////////////////////////////////////////////////////////////////////////////
  232. // Glowna funkcja programu
  233. int main(int argc, char **argv)
  234. {
  235. // Zainicjowanie biblioteki GLUT
  236. glutInit(&argc, argv);
  237.  
  238. // Ustawienie trybu wyswietlania
  239. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  240.  
  241. // Ustawienie polozenia dolenego lewego rogu okna
  242. glutInitWindowPosition(100, 100);
  243.  
  244. // Ustawienie rozmiarow okna
  245. glutInitWindowSize(szerokoscOkna, wysokoscOkna);
  246.  
  247. // Utworzenie okna
  248. glutCreateWindow("Stozek - GL_TRIANGLE_STRIP");
  249.  
  250. // Odblokowanie bufora glebokosci
  251. glEnable(GL_DEPTH_TEST);
  252.  
  253. // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
  254. glClearDepth(1000.0);
  255.  
  256. // Ustawienie koloru czyszczenia bufora ramki
  257. glClearColor(0.0f, 0.0f, 0.3f, 0.0f);
  258.  
  259. // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
  260. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  261.  
  262. // Zarejestrowanie funkcji (callback) odpowiedzialnej za
  263. glutDisplayFunc(WyswietlObraz);
  264.  
  265. // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
  266. // zmieniane sa rozmiary okna
  267. glutReshapeFunc(UstawParametryWidoku);
  268.  
  269. // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
  270. // zadnych zadan
  271. glutIdleFunc(WyswietlObraz);
  272.  
  273. // Zarejestrowanie funkcji obslugi klawiatury
  274. glutKeyboardFunc(ObslugaKlawiatury);
  275.  
  276. // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
  277. // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
  278. glutMainLoop();
  279.  
  280. return 0;
  281. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement