Advertisement
Guest User

Untitled

a guest
Jan 26th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.39 KB | None | 0 0
  1. // Perspektywa.cpp : This file contains the 'main' function. Program execution begins and ends there.
  2. //
  3.  
  4. #include "pch.h"
  5. #include <iostream>
  6. #include <windows.h>
  7. #include <gl/gl.h>
  8. #include <gl/glut.h>
  9. #include <cmath>
  10.  
  11.  
  12. /*************************************************************************************/
  13.  
  14. // Szkielet programu do tworzenia modelu sceny 3-D z wizualizacją osi
  15. // układu współrzędnych dla rzutowania perspektywicznego
  16.  
  17. /*************************************************************************************/
  18. # define M_PI 3.14159265358979323846 /* pi */
  19.  
  20.  
  21. typedef float point3[3];
  22.  
  23. static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
  24. //static GLfloat viewer[] = { 3.0, 3.0, 10.0 };
  25.  
  26.  
  27. // Kąt obroty obiektu wokół osi Y
  28. static GLfloat thetaY = 0.0;
  29.  
  30. // Kąt obrotu obiektu wokół osi X
  31. static GLfloat thetaX = 0.0;
  32.  
  33. // Skala
  34. static GLfloat scale = 1.0;
  35.  
  36.  
  37. static GLfloat pix2angle; // przelicznik pikseli na stopnie
  38.  
  39. static GLint status = 0; // stan klawiszy myszy
  40. // 0 - nie naciśnięto żadnego klawisza
  41. // 1 - naciśnięty zostać lewy klawisz
  42.  
  43.  
  44.  
  45.  
  46. // Stara pozycja w płaszczyźnie X
  47. static int x_pos_old = 0;
  48.  
  49. // Stara pozycja w płaszczyźnie Y
  50. static int y_pos_old = 0;
  51.  
  52. // Stara pozycja w płaszczyźnie Z - DLA ZOOMA
  53. static int z_pos_old = 0;
  54.  
  55.  
  56. // Zmiana pomiedzy ruszaniem imbryczka, a kamery
  57. int model = 1;
  58.  
  59. // Odległość
  60. float R = 10;
  61.  
  62.  
  63.  
  64. // Różnica poruszenia myszką prawo lewo
  65. static int delta_x = 0; // różnica pomiędzy pozycją bieżącą
  66. // i poprzednią kursora myszy
  67.  
  68.  
  69. // Różnica poruszenia myszką góra dół
  70. static int delta_y = 0;
  71.  
  72. // Różnica poruszenia myszką góra dół - DLA ZOOMA
  73. static int delta_z = 0;
  74.  
  75.  
  76. // inicjalizacja położenia obserwatora
  77.  
  78. /*************************************************************************************/
  79.  
  80.  
  81. /*************************************************************************************/
  82. // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
  83. void Mouse(int btn, int state, int x, int y)
  84. {
  85. if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  86. {
  87. x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
  88. // jako pozycji poprzedniej
  89. y_pos_old = y;
  90. status = 1; // wcięnięty został lewy klawisz myszy
  91. }
  92. else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  93. {
  94. // Przypisanie starej pozycji myszki
  95. z_pos_old = y;
  96.  
  97. status = 2;
  98. }
  99. else status = 0; // nie został wcięnięty żaden klawisz
  100. }
  101.  
  102.  
  103.  
  104. void keys(unsigned char key, int x, int y)
  105. {
  106. if (key == 'p') model = 1;
  107. if (key == 'k') model = 2;
  108. }
  109.  
  110.  
  111. /*************************************************************************************/
  112. // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
  113. // zmiennych globalnych
  114. void Motion(GLsizei x, GLsizei y)
  115. {
  116. delta_x = x - x_pos_old; // obliczenie różnicy położenia kursora myszy
  117. delta_y = y - y_pos_old;
  118.  
  119. delta_z = (y - z_pos_old) * 0.5;
  120.  
  121. x_pos_old = x; // podstawienie bieżącego położenia jako poprzednie
  122. y_pos_old = y;
  123. z_pos_old = y;
  124.  
  125. glutPostRedisplay(); // przerysowanie obrazu sceny
  126. }
  127.  
  128.  
  129.  
  130. // Funkcja rysująca osie układu wspó?rz?dnych
  131. void Axes(void)
  132. {
  133.  
  134. point3 x_min = { -5.0, 0.0, 0.0 };
  135. point3 x_max = { 5.0, 0.0, 0.0 };
  136. // pocz?tek i koniec obrazu osi x
  137.  
  138. point3 y_min = { 0.0, -5.0, 0.0 };
  139. point3 y_max = { 0.0, 5.0, 0.0 };
  140. // pocz?tek i koniec obrazu osi y
  141.  
  142. point3 z_min = { 0.0, 0.0, -5.0 };
  143. point3 z_max = { 0.0, 0.0, 5.0 };
  144. // pocz?tek i koniec obrazu osi y
  145.  
  146. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  147. glBegin(GL_LINES); // rysowanie osi x
  148.  
  149. glVertex3fv(x_min);
  150. glVertex3fv(x_max);
  151.  
  152. glEnd();
  153.  
  154. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  155. glBegin(GL_LINES); // rysowanie osi y
  156.  
  157. glVertex3fv(y_min);
  158. glVertex3fv(y_max);
  159.  
  160. glEnd();
  161.  
  162. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  163. glBegin(GL_LINES); // rysowanie osi z
  164.  
  165. glVertex3fv(z_min);
  166. glVertex3fv(z_max);
  167.  
  168. glEnd();
  169.  
  170. }
  171.  
  172. /*************************************************************************************/
  173.  
  174. // Funkcja określająca co ma być rysowane (zawsze wywoływana, gdy trzeba
  175. // przerysować scenę)
  176. void RenderScene(void)
  177. {
  178. if (model == 1)
  179. {
  180. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  181. // Czyszczenie okna aktualnym kolorem czyszczącym
  182. glLoadIdentity();
  183. // Czyszczenie macierzy bieżącej
  184. gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  185. // Zdefiniowanie położenia obserwatora
  186. Axes();
  187. // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  188.  
  189. if (status == 1) // jeśli lewy przycisk myszy wcięnięty
  190. {
  191. // Modyfikacja kąta Y
  192. thetaY += delta_x * pix2angle; // modyfikacja kąta obrotu o kat proporcjonalny do różnicy położeń kursora myszy
  193.  
  194. // Modyfikacja kąta X
  195. thetaX += delta_y * pix2angle;
  196. }
  197.  
  198. if (status == 2)
  199. {
  200. // Modyfikacja zooma
  201. scale += delta_z * pix2angle;
  202. }
  203.  
  204. // Obrót wokół osi Y
  205. glRotatef(thetaY, 0.0, 1.0, 0.0);
  206.  
  207. // Obrót wokół osi X
  208. glRotatef(thetaX, 1.0, 0.0, 0.0);
  209.  
  210. // Przeskalowanie obrazu
  211. glScalef(scale, scale, scale);
  212. glColor3f(1.0f, 1.0f, 1.0f);
  213. // Ustawienie koloru rysowania na biały
  214. glutWireTeapot(3.0);
  215. // Narysowanie czajnika
  216. glFlush();
  217. // Przekazanie poleceń rysujących do wykonania
  218. glutSwapBuffers();
  219. }
  220.  
  221. if (model == 2)
  222. {
  223. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  224. // Czyszczenie okna aktualnym kolorem czyszczącym
  225.  
  226. glLoadIdentity();
  227. // Czyszczenie macierzy bieżącej
  228.  
  229. if (status == 1) // Jeśli lewy przycisk myszy wcięnięty
  230. {
  231. // Modyfikacja kąta Y
  232. thetaY += delta_x * pix2angle * 0.5;
  233.  
  234. // Modyfikacja kąta X
  235. thetaX += delta_y * pix2angle * 0.5;
  236. }
  237.  
  238. if (status == 2)
  239. {
  240. R += delta_y;
  241. if (R < 3)R = 15;
  242. if (R > 15) R = 3;
  243. }
  244.  
  245. viewer[0] = R * cos(thetaX * (M_PI / 2)) * cos(thetaY * (M_PI / 2));
  246. viewer[1] = R * cos(thetaY * (M_PI / 2));
  247. viewer[2] = R * sin(thetaX * (M_PI / 2)) * cos(thetaY * (M_PI / 2));
  248.  
  249. gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  250. // Zdefiniowanie położenia obserwatora
  251.  
  252. Axes();
  253. // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  254. glColor3f(1.0f, 1.0f, 1.0f);
  255. // Ustawienie koloru rysowania na biały
  256. glutWireTeapot(3.0);
  257. // Narysowanie czajnika
  258. glFlush();
  259. // Przekazanie poleceń rysujących do wykonania
  260. glutSwapBuffers();
  261. }
  262.  
  263. }
  264. /*************************************************************************************/
  265.  
  266. // Funkcja ustalająca stan renderowania
  267.  
  268.  
  269.  
  270. void MyInit(void)
  271. {
  272.  
  273. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  274. // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
  275.  
  276. }
  277.  
  278. /*************************************************************************************/
  279.  
  280. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  281. // w przypadku zmiany rozmiarów okna.
  282. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  283. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  284.  
  285.  
  286.  
  287. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  288. {
  289. pix2angle = 360.0 / (float)horizontal; // przeliczenie pikseli na stopnie
  290.  
  291. glMatrixMode(GL_PROJECTION);
  292. // Przełączenie macierzy bieżącej na macierz projekcji
  293.  
  294. glLoadIdentity();
  295. // Czyszcznie macierzy bieżącej
  296.  
  297. gluPerspective(70, 1.0, 1.0, 30.0);
  298. // Ustawienie parametrów dla rzutu perspektywicznego
  299.  
  300.  
  301. if (horizontal <= vertical)
  302. glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  303.  
  304. else
  305. glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  306. // Ustawienie wielkości okna okna widoku (viewport) w zależności
  307. // relacji pomiędzy wysokością i szerokością okna
  308.  
  309. glMatrixMode(GL_MODELVIEW);
  310. // Przełączenie macierzy bieżącej na macierz widoku modelu
  311.  
  312. glLoadIdentity();
  313. // Czyszczenie macierzy bieżącej
  314.  
  315. }
  316.  
  317. /*************************************************************************************/
  318.  
  319. // Główny punkt wejścia programu. Program działa w trybie konsoli
  320.  
  321.  
  322.  
  323. void main(void)
  324. {
  325.  
  326. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  327.  
  328. glutInitWindowSize(300, 300);
  329.  
  330. glutCreateWindow("Rzutowanie perspektywiczne");
  331.  
  332. glutDisplayFunc(RenderScene);
  333. // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  334. // (callback function). Będzie ona wywoływana za każdym razem
  335. // gdy zajdzie potrzeba przerysowania okna
  336.  
  337.  
  338.  
  339. glutReshapeFunc(ChangeSize);
  340. // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  341. // za zmiany rozmiaru okna
  342.  
  343.  
  344.  
  345. MyInit();
  346. // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  347. // inicjalizacje konieczne przed przystąpieniem do renderowania
  348.  
  349.  
  350.  
  351. glutMouseFunc(Mouse);
  352. // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  353.  
  354. glutMotionFunc(Motion);
  355. // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  356.  
  357.  
  358.  
  359. glutKeyboardFunc(keys);
  360.  
  361. glEnable(GL_DEPTH_TEST);
  362. // Włączenie mechanizmu usuwania niewidocznych elementów sceny
  363.  
  364. glutMainLoop();
  365. // Funkcja uruchamia szkielet biblioteki GLUT
  366.  
  367. }
  368.  
  369. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement