Advertisement
Guest User

Untitled

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