Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.78 KB | None | 0 0
  1. /*************************************************************************************/
  2.  
  3. // Szkielet programu do tworzenia modelu sceny 3-D z wizualizacj? osi
  4. // uk?adu wspó?rz?dnych dla rzutowania perspektywicznego
  5.  
  6. /*************************************************************************************/
  7.  
  8. #include <windows.h>
  9. #include <gl/gl.h>
  10. #include <gl/glut.h>
  11.  
  12.  
  13. typedef float point3[3];
  14.  
  15. static GLfloat viewer[]= {0.0, 0.0, 10.0};
  16. // inicjalizacja po?o?enia obserwatora
  17. static GLfloat theta[2] = {0.0,0.0}; // k?t obrotu obiektu
  18. static GLfloat pix2angle; // przelicznik pikseli na stopnie
  19.  
  20. static GLint status = 0; // stan klawiszy myszy
  21. static GLint statusprawy = 0; // 0 - nie naci?ni?to ?adnego klawisza
  22. // 1 - naci?ni?ty zosta? lewy klawisz
  23.  
  24. static int x_pos_old=0;
  25. static int y_pos_old=0; // poprzednia pozycja kursora myszy
  26.  
  27. static int delta_x = 0; // ró?nica pomi?dzy pozycj? bie??c?
  28. // i poprzedni? kursora myszy
  29. static int delta_y = 0; // ró?nica pomi?dzy pozycj? bie??c?
  30. // i poprzedni? kursora myszy
  31. /*************************************************************************************/
  32.  
  33. // Funkcja "bada" stan myszy i ustawia warto?ci odpowiednich zmiennych globalnych
  34.  
  35. void Mouse(int btn, int state, int x, int y)
  36. {
  37.  
  38.  
  39. if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  40. {
  41. x_pos_old=x; // przypisanie aktualnie odczytanej pozycji kursora
  42. y_pos_old=y; // jako pozycji poprzedniej
  43. status = 1; // wci?ni?ty zosta? lewy klawisz myszy
  44. }
  45. else
  46.  
  47. status = 0; // nie zosta? wci?ni?ty ?aden klawisz
  48. if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  49. {
  50. // przypisanie aktualnie odczytanej pozycji kursora
  51. y_pos_old=y; // jako pozycji poprzedniej
  52. statusprawy = 1; // wci?ni?ty zosta? lewy klawisz myszy
  53. }
  54. else
  55.  
  56. statusprawy = 0;
  57. }
  58.  
  59. /*************************************************************************************/
  60.  
  61. // Funkcja "monitoruje" po?o?enie kursora myszy i ustawia warto?ci odpowiednich
  62. // zmiennych globalnych
  63.  
  64. void Motion( GLsizei x, GLsizei y )
  65. {
  66.  
  67. delta_x=x-x_pos_old; // obliczenie ró?nicy po?o?enia kursora myszy
  68. delta_y=y-y_pos_old;
  69. x_pos_old=x; // podstawienie bie?acego po?o?enia jako poprzednie
  70. y_pos_old=y;
  71. glutPostRedisplay(); // przerysowanie obrazu sceny
  72. }
  73.  
  74. /*************************************************************************************/
  75. /*************************************************************************************/
  76.  
  77. // Funkcja rysuj?ca osie uk?adu wspó?rz?dnych
  78.  
  79.  
  80.  
  81. void Axes(void)
  82. {
  83.  
  84. point3 x_min = {-5.0, 0.0, 0.0};
  85. point3 x_max = { 5.0, 0.0, 0.0};
  86. // pocz?tek i koniec obrazu osi x
  87.  
  88. point3 y_min = {0.0, -5.0, 0.0};
  89. point3 y_max = {0.0, 5.0, 0.0};
  90. // pocz?tek i koniec obrazu osi y
  91.  
  92. point3 z_min = {0.0, 0.0, -5.0};
  93. point3 z_max = {0.0, 0.0, 5.0};
  94. // pocz?tek i koniec obrazu osi y
  95.  
  96. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  97. glBegin(GL_LINES); // rysowanie osi x
  98.  
  99. glVertex3fv(x_min);
  100. glVertex3fv(x_max);
  101.  
  102. glEnd();
  103.  
  104. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  105. glBegin(GL_LINES); // rysowanie osi y
  106.  
  107. glVertex3fv(y_min);
  108. glVertex3fv(y_max);
  109.  
  110. glEnd();
  111.  
  112. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  113. glBegin(GL_LINES); // rysowanie osi z
  114.  
  115. glVertex3fv(z_min);
  116. glVertex3fv(z_max);
  117.  
  118. glEnd();
  119.  
  120. }
  121.  
  122. /*************************************************************************************/
  123.  
  124. // Funkcja okre?laj?ca co ma by? rysowane (zawsze wywo?ywana, gdy trzeba
  125. // przerysowa? scen?)
  126.  
  127.  
  128.  
  129. void RenderScene(void)
  130. {
  131.  
  132. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  133. // Czyszczenie okna aktualnym kolorem czyszcz?cym
  134.  
  135. glLoadIdentity();
  136. // Czyszczenie macierzy bie??cej
  137. if(statusprawy == 1)
  138. {
  139.  
  140. viewer[2] += delta_y*pix2angle;
  141.  
  142. }
  143. gluLookAt(viewer[0],viewer[1],viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  144. // Zdefiniowanie po?o?enia obserwatora
  145.  
  146. Axes();
  147. // Narysowanie osi przy pomocy funkcji zdefiniowanej powy?ej
  148. if(status == 1) // je?li lewy klawisz myszy wci?ni?ty
  149. {
  150. theta[0] += delta_x*pix2angle;
  151. theta[1] += delta_y*pix2angle;
  152. // modyfikacja k?ta obrotu o k?t proporcjonalny
  153. }
  154.  
  155.  
  156.  
  157. glRotatef(theta[0], 0.0, 1.0, 0.0); //obrót obiektu o nowy k?t
  158. glRotatef(theta[1], 0.0, 0.0, 1.0);
  159. glColor3f(1.0f, 1.0f, 1.0f);
  160. // Ustawienie koloru rysowania na bia?y
  161.  
  162. glutWireTeapot(3.0);
  163. // Narysowanie czajnika
  164.  
  165. glFlush();
  166. // Przekazanie polece? rysuj?cych do wykonania
  167.  
  168.  
  169.  
  170. glutSwapBuffers();
  171. //
  172.  
  173. }
  174. /*************************************************************************************/
  175.  
  176. // Funkcja ustalaj?ca stan renderowania
  177.  
  178.  
  179.  
  180. void MyInit(void)
  181. {
  182.  
  183. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  184. // Kolor czyszcz?cy (wype?nienia okna) ustawiono na czarny
  185.  
  186. }
  187.  
  188. /*************************************************************************************/
  189.  
  190. // Funkcja ma za zadanie utrzymanie sta?ych proporcji rysowanych
  191. // w przypadku zmiany rozmiarów okna.
  192. // Parametry vertical i horizontal (wysoko?? i szeroko?? okna) s?
  193. // przekazywane do funkcji za ka?dym razem gdy zmieni si? rozmiar okna.
  194.  
  195. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  196. {
  197.  
  198. pix2angle = 360.0/(float)horizontal; // przeliczenie pikseli na stopnie
  199. glMatrixMode(GL_PROJECTION);
  200. // Prze??czenie macierzy bie??cej na macierz projekcji
  201.  
  202. glLoadIdentity();
  203. // Czyszcznie macierzy bie??cej
  204.  
  205. gluPerspective(70, 1.0, 1.0, 30.0);
  206. // Ustawienie parametrów dla rzutu perspektywicznego
  207.  
  208.  
  209. if(horizontal <= vertical)
  210. glViewport(0, (vertical-horizontal)/2, horizontal, horizontal);
  211.  
  212. else
  213. glViewport((horizontal-vertical)/2, 0, vertical, vertical);
  214. // Ustawienie wielko?ci okna okna widoku (viewport) w zale?no?ci
  215. // relacji pomi?dzy wysoko?ci? i szeroko?ci? okna
  216.  
  217. glMatrixMode(GL_MODELVIEW);
  218. // Prze??czenie macierzy bie??cej na macierz widoku modelu
  219.  
  220. glLoadIdentity();
  221. // Czyszczenie macierzy bie??cej
  222.  
  223. }
  224.  
  225. /*************************************************************************************/
  226.  
  227. // G?ówny punkt wej?cia programu. Program dzia?a w trybie konsoli
  228.  
  229.  
  230.  
  231. void main(void)
  232. {
  233.  
  234. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |GLUT_DEPTH);
  235.  
  236. glutInitWindowSize(300, 300);
  237.  
  238. glutCreateWindow("Rzutowanie perspektywiczne");
  239.  
  240. glutDisplayFunc(RenderScene);
  241. // Okre?lenie, ?e funkcja RenderScene b?dzie funkcj? zwrotn?
  242. // (callback function). B?dzie ona wywo?ywana za ka?dym razem
  243. // gdy zajdzie potrzeba przerysowania okna
  244. glutMouseFunc(Mouse);
  245. // Ustala funkcj? zwrotn? odpowiedzialn? za badanie stanu myszy
  246.  
  247. glutMotionFunc(Motion);
  248. // Ustala funkcj? zwrotn? odpowiedzialn? za badanie ruchu myszy
  249.  
  250.  
  251. glutReshapeFunc(ChangeSize);
  252. // Dla aktualnego okna ustala funkcj? zwrotn? odpowiedzialn?
  253. // za zmiany rozmiaru okna
  254.  
  255.  
  256.  
  257. MyInit();
  258. // Funkcja MyInit() (zdefiniowana powy?ej) wykonuje wszelkie
  259. // inicjalizacje konieczne przed przyst?pieniem do renderowania
  260.  
  261. glEnable(GL_DEPTH_TEST);
  262. // W??czenie mechanizmu usuwania niewidocznych elementów sceny
  263.  
  264. glutMainLoop();
  265. // Funkcja uruchamia szkielet biblioteki GLUT
  266.  
  267. }
  268.  
  269.  
  270.  
  271. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement