Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.16 KB | None | 0 0
  1.  
  2. #include <windows.h>
  3. #include <gl/gl.h>
  4. #include <gl/glut.h>
  5. #include <array>
  6. #include <math.h>
  7. #include <cstdlib>
  8. #include <ctime>
  9. #include <math.h>
  10.  
  11.  
  12. typedef float point3[3];
  13.  
  14. static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
  15. GLfloat light_position[] = { 5.0, 5.0, 5.0, 1.0 };
  16. GLfloat light_position1[] = { -5.0, -5.0, 5.0, 1.0 };
  17.  
  18. static GLfloat thetaX = 0.0; // kąt obrotu obiektu
  19. static GLfloat thetaY = 0.0;
  20. static GLfloat thetaZ= 0.0;
  21. static GLfloat pix2angle; // przelicznik pikseli na stopnie
  22.  
  23.  
  24.  
  25. static GLint status = 0; // stan klawiszy myszy
  26. // 0 - nie naciśnięto żadnego klawisza
  27. // 1 - naciśnięty zostać lewy klawisz
  28.  
  29. static int x_pos_old = 0; // poprzednia pozycja kursora myszy
  30.  
  31. static int delta_x = 0; // różnica pomiędzy pozycją bieżącą
  32. // i poprzednią kursora myszy
  33. static int y_pos_old = 0;
  34. static int delta_y = 0;
  35. static int z_pos_old = 0;
  36. static int delta_z = 0;
  37.  
  38. float xs, ys, zs =10, xc, yc, zc, vx, vy, vz;
  39.  
  40.  
  41.  
  42. void Mouse(int btn, int state, int x, int y)
  43. {
  44.  
  45. if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  46. {
  47. x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
  48. y_pos_old = y;
  49. //z_pos_old = y;
  50. status = 1; // wcięnięty został lewy klawisz myszy
  51. //glDisable(GL_LIGHT1);
  52. glutPostRedisplay();
  53. }
  54. else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  55. {
  56. //z_pos_old = y;
  57. status = 2;
  58. //glEnable(GL_LIGHT1);
  59. light_position1[0] = (float)x / 100;
  60. light_position1[1] = (float)y / 100;
  61. glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
  62. glutPostRedisplay();
  63. }
  64. else
  65. status = 0; // nie został wcięnięty żaden klawisz
  66. }
  67.  
  68.  
  69. void Motion(GLsizei x, GLsizei y)
  70. {
  71. delta_x = x - x_pos_old; // obliczenie różnicy położenia kursora myszy
  72.  
  73. x_pos_old = x; // podstawienie bieżącego położenia jako poprzednie
  74.  
  75. delta_y = y - y_pos_old;
  76. y_pos_old = y;
  77.  
  78. delta_z = y - z_pos_old;
  79. //z_pos_old = y;
  80. vx = delta_x;
  81. vy = delta_y;
  82.  
  83. glutPostRedisplay(); // przerysowanie obrazu sceny
  84. }
  85.  
  86.  
  87. void Axes(void)
  88. {
  89. point3 x_min = { -5.0, 0.0, 0.0 };
  90. point3 x_max = { 5.0, 0.0, 0.0 };
  91. // pocz?tek i koniec obrazu osi x
  92.  
  93. point3 y_min = { 0.0, -5.0, 0.0 };
  94. point3 y_max = { 0.0, 5.0, 0.0 };
  95. // pocz?tek i koniec obrazu osi y
  96.  
  97. point3 z_min = { 0.0, 0.0, -5.0 };
  98. point3 z_max = { 0.0, 0.0, 5.0 };
  99. // pocz?tek i koniec obrazu osi y
  100. glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
  101. glBegin(GL_LINES); // rysowanie osi x
  102. glVertex3fv(x_min);
  103. glVertex3fv(x_max);
  104. glEnd();
  105.  
  106. glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
  107. glBegin(GL_LINES); // rysowanie osi y
  108.  
  109. glVertex3fv(y_min);
  110. glVertex3fv(y_max);
  111. glEnd();
  112.  
  113. glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
  114. glBegin(GL_LINES); // rysowanie osi z
  115.  
  116. glVertex3fv(z_min);
  117. glVertex3fv(z_max);
  118. glEnd();
  119.  
  120. }
  121.  
  122.  
  123. void RenderScene(void)
  124. {
  125. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  126. glLoadIdentity();
  127. // Czyszczenie macierzy bie??cej
  128. gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  129. Axes();
  130. // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  131.  
  132. if (status == 1) // jeśli lewy klawisz myszy wcięnięty
  133. {
  134. thetaX += delta_x * pix2angle; // modyfikacja kąta obrotu o kat proporcjonalny
  135. thetaY += delta_y * pix2angle;
  136. } // do różnicy położeń kursora myszy
  137.  
  138. else if (status == 2)
  139. {
  140. //thetaZ += delta_z;
  141. }
  142.  
  143. //glTranslatef(0.0, 0.0, thetaZ);
  144. glRotatef(thetaX, 0.0, 1.0, 0.0); //obrót obiektu o nowy kąt
  145. glRotatef(thetaY, 1.0, 0.0, 0.0);
  146. glColor3f(1.0f, 1.0f, 1.0f);
  147. // Ustawienie koloru rysowania na biały
  148.  
  149. glutSolidTeapot(3.0);
  150. // Narysowanie czajnika
  151. glFlush();
  152. // Przekazanie poleceń rysujących do wykonania
  153. glutSwapBuffers();
  154.  
  155. }
  156.  
  157. // Funkcja ustalająca stan renderowania
  158.  
  159.  
  160.  
  161. void MyInit(void)
  162. {
  163. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  164. // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
  165. GLfloat mat_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
  166. // współczynniki ka =[kar,kag,kab] dla światła otoczenia
  167.  
  168. GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  169. // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
  170.  
  171. GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  172. // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego
  173.  
  174. GLfloat mat_shininess = { 20.0 };
  175. // współczynnik n opisujący połysk powierzchni
  176.  
  177.  
  178. //GLfloat light_position[] = { 5.0, 0.1, -2.0, 1.0 };
  179. //GLfloat light_position1[] = { -5.5, 0.1, -2.0, 1.0 };
  180. // położenie źródła
  181.  
  182. GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
  183. GLfloat light_ambient1[] = { 0.0, 0.0, 0.0, 1.0 };
  184. // składowe intensywności świecenia źródła światła otoczenia
  185. // Ia = [Iar,Iag,Iab]
  186.  
  187. GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 0.0 };
  188. GLfloat light_diffuse1[] = { 0.0, 0.0, 1.0, 0.0 };
  189. // składowe intensywności świecenia źródła światła powodującego
  190. // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
  191.  
  192. GLfloat light_specular[] = { 1.0, 0.0, 0.0, 1.0 };
  193. GLfloat light_specular1[] = { 1.0, 0.0, 0.0, 1.0 };
  194. // składowe intensywności świecenia źródła światła powodującego
  195. // odbicie kierunkowe Is = [Isr,Isg,Isb]
  196.  
  197. GLfloat att_constant = { 1.0 };
  198. GLfloat att_constant1 = { 1.0 };
  199. // składowa stała ds dla modelu zmian oświetlenia w funkcji
  200. // odległości od źródła
  201.  
  202. GLfloat att_linear = { 0.05 };
  203. GLfloat att_linear1 = { 0.05 };
  204. // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
  205. // odległości od źródła
  206.  
  207. GLfloat att_quadratic = { 0.001 };
  208. GLfloat att_quadratic1 = { 0.001 };
  209. // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
  210. // odległości od źródła
  211.  
  212.  
  213.  
  214. glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  215. glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  216. glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  217. glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
  218.  
  219.  
  220. glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  221. glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  222. glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  223. glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  224.  
  225. glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
  226. glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
  227. glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
  228.  
  229.  
  230. glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient1);
  231. glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
  232. glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);
  233. glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
  234.  
  235. glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, att_constant1);
  236. glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, att_linear1);
  237. glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, att_quadratic1);
  238.  
  239. glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
  240. glEnable(GL_LIGHTING); // właczenie systemu oświetlenia sceny
  241. glEnable(GL_LIGHT0); // włączenie źródła o numerze 0
  242. glEnable(GL_LIGHT1); // włączenie źródła o numerze 0
  243. glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
  244. }
  245.  
  246. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  247. {
  248.  
  249. pix2angle = 360.0 / (float)horizontal; // przeliczenie pikseli na stopnie
  250. glMatrixMode(GL_PROJECTION);
  251. // Przełączenie macierzy bieżącej na macierz projekcji
  252.  
  253. glLoadIdentity();
  254. // Czyszcznie macierzy bieżącej
  255.  
  256. gluPerspective(70, 1.0, 1.0, 30.0);
  257.  
  258. if (horizontal <= vertical)
  259. glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  260.  
  261. glMatrixMode(GL_MODELVIEW);
  262.  
  263. glLoadIdentity();
  264.  
  265. }
  266.  
  267. void main(void)
  268. {
  269.  
  270. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  271.  
  272. glutInitWindowSize(300, 300);
  273.  
  274. glutCreateWindow("Rzutowanie perspektywiczne");
  275. glutMouseFunc(Mouse);
  276. // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  277.  
  278. glutMotionFunc(Motion);
  279. // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  280.  
  281. glutDisplayFunc(RenderScene);
  282.  
  283. glutReshapeFunc(ChangeSize);
  284. MyInit();
  285.  
  286.  
  287.  
  288. glEnable(GL_DEPTH_TEST);
  289. // Włączenie mechanizmu usuwania niewidocznych elementów sceny
  290.  
  291. glutMainLoop();
  292. // Funkcja uruchamia szkielet biblioteki GLUT
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement