Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.73 KB | None | 0 0
  1.  
  2.  
  3. #include <GL\glew.h>
  4. #include<GLFW\glfw3.h>
  5. #include<GL\glut.h>
  6. #include<iostream>
  7. #include <stdio.h>
  8. #include <vector>
  9. void Rocket();
  10. int cx = 0, cy = 0, cz = 0;
  11. int d;
  12. int time1;
  13. enum
  14. {
  15. FULL_WINDOW, // aspekt obrazu - całe okno
  16. ASPECT_1_1, // aspekt obrazu 1:1
  17. EXIT // wyjście
  18. };
  19.  
  20. // aspekt obrazu
  21.  
  22. int aspect = FULL_WINDOW;
  23.  
  24. // usunięcie definicji makr near i far
  25.  
  26. #ifdef near
  27. #undef near
  28. #endif
  29. #ifdef far
  30. #undef far
  31. #endif
  32.  
  33. // rozmiary bryły obcinania
  34.  
  35. const GLdouble left = -2.0;
  36. const GLdouble right = 2.0;
  37. const GLdouble bottom = -2.0;
  38. const GLdouble top = 2.0;
  39. const GLdouble near = 3.0;
  40. const GLdouble far = 7.0;
  41.  
  42. // kąty obrotu
  43.  
  44. GLfloat rotatex = 0.0;
  45. GLfloat rotatey = 0.0;
  46.  
  47.  
  48. // wskaźnik naciśnięcia lewego przycisku myszki
  49.  
  50. int button_state = GLUT_UP;
  51. //glTranslatef(5.0, 0.0, 0.0);
  52.  
  53. // położenie kursora myszki
  54.  
  55. int button_x, button_y;
  56.  
  57. // współczynnik skalowania
  58.  
  59. GLfloat scale = 0.3;
  60. //szybkosc poruszania sie
  61. int speed = 100;
  62.  
  63. // współrzędne wektorów normalnych i wierzchołków
  64.  
  65. GLfloat normal_vertex[27 * 6] =
  66. {
  67. 0,0,0,0,0,0, //v0
  68. -1, 0, 0,-1, 0, 0, // v1
  69. -0.7071, 0, -0.7071, -0.7071, 0, -0.7071, // v2
  70. 0.000, 0, -1, 0.000, 0, -1, // v3
  71. 0.7071, 0,-0.7071, 0.7071, 0, -0.7071, // v4
  72. 1, 0, 0, 1, 0, 0, // v5
  73. 0.7071, 0, 0.7071, 0.7071, 0, 0.7071, // v6
  74. 0, 0, 1, 0, 0, 1, // v7
  75. -0.7071, 0, 0.7071, -0.7071, 0, 0.7071, // v8
  76.  
  77.  
  78. 0,22,0,0,22,0, //v9
  79. -1, 20, 0,-1, 20, 0, // v12
  80. -0.7071, 20, -0.7071, -0.7071, 20, -0.7071, // v11
  81. 0.000, 20, -1, 0.000, 20, -1, // v12
  82. 0.7071, 20,-0.7071, 0.7071, 20, -0.7071, // v113
  83. 1, 20, 0, 1, 20, 0, // v14
  84. 0.7071, 20, 0.7071, 0.7071, 20, 0.7071, // v15
  85. 0, 20, 1, 0, 20, 1, // v16
  86. -0.7071, 20, 0.7071, -0.7071, 20, 0.7071, // v17
  87.  
  88. -2, -2, 0,-2, -2, 0, // v18
  89. 0,-2,-2, 0,-2,-2, //19
  90. 2, -2, 0, 2, -2, 0, // v20
  91. 0,-2,2, 0,-2,2, //21
  92. -1, 5, 0,-1, 5, 0, //22
  93. 0, 5, -1, 0, 5, -1, //23
  94. 1, 5, 0, 1, 5, 0, //24
  95. 0, 5, 1, 0, 5, 1, //25
  96. //0.529976, 0.000000, 0.848013, 0.500, 0.000, 0.667, // v8
  97. //-0.529976, 0.000000, 0.848013, -0.500, 0.000, 0.667, // v9
  98. //-0.529976, 0.000000, -0.848013, -0.500, 0.000, -0.667, // v10
  99. //0.529976, 0.000000, -0.848013, 0.500, 0.000, -0.667 // v11
  100. };
  101. GLfloat normal_vertex1[15 * 3]
  102. {
  103.  
  104. };
  105.  
  106. // składowe kolorów wierzchołków
  107.  
  108. GLfloat color[27 * 3] =
  109. {
  110. 0.5, 0.5, 0.5, // v0
  111. 0.5, 0.5, 0.5, // v1
  112. 0.5, 0.5, 0.5, // v2
  113. 0.5, 0.5, 0.5, // v3
  114. 0.5, 0.5, 0.5, // v4
  115. 0.5, 0.5, 0.5,// v5
  116. 0.5, 0.5, 0.5, // v6
  117. 0.5, 0.5, 0.5, // v7
  118. 0.5, 0.5, 0.5, // v8
  119. 0.5, 0.5, 0.5, // v9
  120. 0.5, 0.5, 0.5, // v10
  121. 0.5, 0.5, 0.5, // v11
  122. 0.5, 0.5, 0.5, // v12
  123. 0.5, 0.5, 0.5, // v13
  124. 0.5, 0.5, 0.5,// v14
  125. 0.5, 0.5, 0.5, // v15
  126. 0.5, 0.5, 0.5, // v16
  127. 0.5, 0.5, 0.5, // v17
  128. 0.5, 0.5, 0.5,// v14
  129. 0.5, 0.5, 0.5, // v15
  130. 0.5, 0.5, 0.5, // v16
  131.  
  132. 0.5, 0.5, 0.5, // v17
  133. 0.5, 0.5, 0.5,// v14
  134. 0.5, 0.5, 0.5, // v15
  135. 0.5, 0.5, 0.5, // v16
  136. 0.5, 0.5, 0.5, // v17
  137. //0.0, 1.0, 1.0, // v9
  138. //0.0, 0.0, 1.0, // v10
  139. //0.0, 1.0, 1.0 // v11
  140. };
  141.  
  142.  
  143. GLubyte triangles[50 * 3] =
  144. {
  145.  
  146. 0,1,2,
  147. 0,2,3,
  148. 0,3,4,
  149. 0,4,5,
  150. 0,5,6,
  151. 0,6,7,
  152. 0,7,8,
  153. 0,8,1,
  154. 9,10,11,
  155. 9,11,12,
  156. 9,12,13,
  157. 9,13,14,
  158. 9,14,15,
  159. 9,15,16,
  160. 9,16,17,
  161. 9,17,10,
  162. 1,10,11,
  163. 1,2,11,
  164. 2,11,12,
  165. 2,3,12,
  166. 3,12,13,
  167. 3,4,13,
  168. 4,13,14,
  169. 4,5,14,
  170. 5,14,15,
  171. 5,6,15,
  172. 6,15,16,
  173. 6,7,16,
  174. 7,16,17,
  175. 7,8,17,
  176. 1,8,17,
  177. 1,10,17,
  178. 1,18,22,
  179. 3,19,23,
  180. 5,20,24,
  181. 7,21,25,
  182.  
  183. };
  184.  
  185. // funkcja generująca scenę 3D
  186.  
  187. void Display()
  188. {
  189. // kolor tła - zawartość bufora koloru
  190. glClearColor(1.0, 1.0, 1.0, 1.0);
  191.  
  192. // czyszczenie bufora koloru i bufora głębokości
  193. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  194. //tworzymy mini powierzchnie
  195. glPushMatrix();
  196. glColor3f(1.0, 1.0, 1.0);
  197. glBegin(GL_LINES);
  198. for (GLfloat i = -1000; i <= 1000; i += 0.25) {
  199. glVertex3f(i, 0, 2.5); glVertex3f(i, 0, -2.5);
  200. glVertex3f(2.5, 0, i); glVertex3f(-2.5, 0, i);
  201. }
  202. glEnd();
  203. glPopMatrix();
  204. // wybór macierzy modelowania
  205. glMatrixMode(GL_MODELVIEW);
  206.  
  207. // macierz modelowania = macierz jednostkowa
  208. glLoadIdentity();
  209.  
  210. // przesunięcie układu współrzędnych obiektu do środka bryły odcinania
  211. glTranslatef(0, 0, -(near + far) / 2);
  212.  
  213. // obroty obiektu
  214. glRotatef(rotatex, 1.0, 0.0, 0.0);
  215. glRotatef(rotatey, 0.0, 1.0, 0.0);
  216. //ruszanie sie
  217. glTranslatef(cx, cy, cz);
  218. // skalowanie obiektu - klawisze "+" i "-"
  219. glScalef(scale, scale, scale);
  220.  
  221. // włączenie testu bufora głębokości
  222. glEnable(GL_DEPTH_TEST);
  223.  
  224. // włączenie oświetlenia
  225. glEnable(GL_LIGHTING);
  226.  
  227. // włączenie światła GL_LIGHT0 z parametrami domyślnymi
  228. glEnable(GL_LIGHT0);
  229.  
  230. // włączenie automatycznej normalizacji wektorów normalnych
  231. glEnable(GL_NORMALIZE);
  232.  
  233. // włączenie obsługi właściwości materiałów
  234. glEnable(GL_COLOR_MATERIAL);
  235.  
  236. // utworzenie danych o wektorach normalnych i współrzędnych wierzchołków
  237. glInterleavedArrays(GL_N3F_V3F, 0, normal_vertex);
  238.  
  239. // włączenie tablicy z danymi o kolorach wierzchołków
  240. glEnableClientState(GL_COLOR_ARRAY);
  241. glColorPointer(3, GL_FLOAT, 0, color);
  242.  
  243. // narysowanie tablic wierzchołków - wybór funkcji zależy
  244. // od dostępnoścglPushMatrix();
  245.  
  246. Rocket();
  247.  
  248.  
  249. // skierowanie poleceń do wykonania
  250. glFlush();
  251.  
  252. // zamiana buforów koloru
  253. glutSwapBuffers();
  254.  
  255. }
  256. void Rocket()
  257. {
  258. glPushMatrix();
  259. glTranslatef(2.0, 0.0, 1.0);
  260.  
  261. if (GLUT_KEY_LEFT)
  262. {
  263. glTranslatef(2, 0.0, 2.0);
  264. }
  265. glFlush();
  266. if (glDrawRangeElementsEXT == NULL)
  267. glDrawElements(GL_TRIANGLES, 50 * 3, GL_UNSIGNED_BYTE, triangles);
  268.  
  269. else
  270. glDrawRangeElementsEXT(GL_TRIANGLES, 0, 27, 50 * 3, GL_UNSIGNED_BYTE, triangles);
  271. if (GLUT_KEY_LEFT)
  272. {
  273. glTranslatef(2, 0.0, 2.0);
  274. }
  275. glTranslatef(cx, cy, cz);
  276.  
  277. glPopMatrix();
  278. }
  279. // zmiana wielkości okna
  280. void update(void )
  281.  
  282. {
  283. d += 1;
  284.  
  285. }
  286. void Reshape(int width, int height)
  287. {
  288. // obszar renderingu - całe okno
  289. glViewport(0, 0, width, height);
  290.  
  291. // wybór macierzy rzutowania
  292. glMatrixMode(GL_PROJECTION);
  293.  
  294. // macierz rzutowania = macierz jednostkowa
  295. glLoadIdentity();
  296.  
  297. // parametry bryły obcinania
  298. if (aspect == ASPECT_1_1)
  299. {
  300. // wysokość okna większa od wysokości okna
  301. if (width < height && width > 0)
  302. glFrustum(left, right, bottom * height / width, top * height / width, near, far);
  303. else
  304.  
  305. // szerokość okna większa lub równa wysokości okna
  306. if (width >= height && height > 0)
  307. glFrustum(left * width / height, right * width / height, bottom, top, near, far);
  308.  
  309. }
  310. else
  311. glFrustum(left, right, bottom, top, near, far);
  312.  
  313. // generowanie sceny 3D
  314. Display();
  315. int time = GetTickCount();
  316. int delta = time - time1;
  317. time1 = time;
  318. int yt = delta * speed;
  319. //update();
  320.  
  321. }
  322.  
  323. // obsługa klawiatury
  324.  
  325. void Keyboard(unsigned char key, int x, int y)
  326. {
  327. //przesuwamy scena
  328. if (key == 's') { cz -= 1; }
  329. if (key == 'd') { cx -= 1; }
  330. if (key == 'q') { cy += 1; }
  331. if (key == 'w') { cz += 1; }
  332. if (key == 'a') { cx += 1; }
  333. if (key == 'z') { cy -= 1; }
  334. // klawisz +
  335. if (key == '+')
  336. scale += 0.05;
  337.  
  338. // klawisz -
  339. if (key == '-' && scale > 0.05)
  340. scale -= 0.05;
  341.  
  342. // narysowanie sceny
  343. Display();
  344. glutPostRedisplay();
  345. }
  346.  
  347. // obsługa klawiszy funkcyjnych i klawiszy kursora
  348.  
  349. void SpecialKeys(int key, int x, int y)
  350. {
  351.  
  352. switch (key)
  353. {
  354. // kursor w lewo
  355. case GLUT_KEY_LEFT:
  356. glRotatef(31.0, 0.0, 1.0,0.0);
  357. break;
  358.  
  359. // kursor w górę
  360. case GLUT_KEY_UP:
  361. rotatex -= 1;
  362. break;
  363.  
  364. // kursor w prawo
  365. case GLUT_KEY_RIGHT:
  366. rotatey += 1;
  367. break;
  368.  
  369. // kursor w dół
  370. case GLUT_KEY_DOWN:
  371. rotatex += 1;
  372. //glTranslatef(key, x, y);
  373. //glRotatef(180.0,0.0,1.0,1.0);
  374. break;
  375. }
  376.  
  377. // odrysowanie okna
  378. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  379. }
  380.  
  381. // obsługa przycisków myszki
  382.  
  383. void MouseButton(int button, int state, int x, int y)
  384. {
  385. if (button == GLUT_LEFT_BUTTON)
  386. {
  387. // zapamiętanie stanu lewego przycisku myszki
  388. button_state = state;
  389.  
  390. // zapamiętanie położenia kursora myszki
  391. if (state == GLUT_DOWN)
  392. {
  393. button_x = x;
  394. button_y = y;
  395.  
  396. }
  397. }
  398. }
  399.  
  400. // obsługa ruchu kursora myszki
  401.  
  402. void MouseMotion(int x, int y)
  403. {
  404.  
  405. if (button_state == GLUT_DOWN)
  406. {
  407. rotatey += 30 * (right - left) / glutGet(GLUT_WINDOW_WIDTH) *(x - button_x);
  408. button_x = x;
  409. rotatex -= 30 * (top - bottom) / glutGet(GLUT_WINDOW_HEIGHT) *(button_y - y);
  410. button_y = y;
  411. glutPostRedisplay();
  412. }
  413.  
  414. }
  415.  
  416. // obsługa menu podręcznego
  417.  
  418. void Menu(int value)
  419. {
  420. switch (value)
  421. {
  422. // obszar renderingu - całe okno
  423. case FULL_WINDOW:
  424. aspect = FULL_WINDOW;
  425. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  426. break;
  427.  
  428. // obszar renderingu - aspekt 1:1
  429. case ASPECT_1_1:
  430. aspect = ASPECT_1_1;
  431. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  432. break;
  433.  
  434. // wyjście
  435. case EXIT:
  436. exit(0);
  437. }
  438. }
  439.  
  440. // sprawdzenie i przygotowanie obsługi wybranych rozszerzeń
  441.  
  442. void ExtensionSetup()
  443. {
  444. // pobranie numeru wersji biblioteki OpenGL
  445. const char * version = (char *)glGetString(GL_VERSION);
  446.  
  447. // odczyt wersji OpenGL
  448. int major = 0, minor = 0;
  449. if (sscanf_s(version, "%d.%d", &major, &minor) != 2)
  450. {
  451. #ifdef WIN32
  452. printf("Błędny format wersji OpenGL\n");
  453. #else
  454.  
  455. printf("Bledny format wersji OpenGL\n");
  456. #endif
  457.  
  458. exit(0);
  459. }
  460.  
  461. // sprawdzenie czy jest co najmniej wersja 1.2
  462. if (major > 1 || minor >= 2)
  463. {
  464. // pobranie wskaźników wybranych funkcji OpenGL 1.2
  465. glDrawRangeElementsEXT =
  466. (PFNGLDRAWRANGEELEMENTSEXTPROC)wglGetProcAddress("glDrawRangeElements");
  467. }
  468. else
  469.  
  470. // sprawdzenie czy jest obsługiwane rozszerzenie EXT_draw_range_elements
  471. if (glutExtensionSupported("GL_EXT_draw_range_elements"))
  472. {
  473. // pobranie wskaźników wybranych funkcji rozszerzenia EXT_draw_range_elements
  474. glDrawRangeElementsEXT =
  475. (PFNGLDRAWRANGEELEMENTSEXTPROC)wglGetProcAddress("glDrawRangeElementsEXT");
  476. }
  477. else
  478. {
  479. printf("Brak rozszerzenia EXT_draw_range_elements!\n");
  480. glDrawRangeElementsEXT = NULL;
  481. }
  482. }
  483.  
  484. int main(int argc, char * argv[])
  485. {
  486. // inicjalizacja biblioteki GLUT
  487. glutInit(&argc, argv);
  488.  
  489. // inicjalizacja bufora ramki
  490. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  491.  
  492. // rozmiary głównego okna programu
  493. glutInitWindowSize(500, 500);
  494.  
  495. // utworzenie głównego okna programu
  496. #ifdef WIN32
  497.  
  498. glutCreateWindow("Rakieta");
  499. #else
  500.  
  501. glutCreateWindow("Rakieta");
  502. #endif
  503.  
  504. // dołączenie funkcji generującej scenę 3D
  505. glutDisplayFunc(Display);
  506.  
  507. // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
  508. glutReshapeFunc(Reshape);
  509.  
  510. // dołączenie funkcji obsługi klawiatury
  511. glutKeyboardFunc(Keyboard);
  512.  
  513. // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
  514. glutSpecialFunc(SpecialKeys);
  515.  
  516. // obsługa przycisków myszki
  517. glutMouseFunc(MouseButton);
  518.  
  519. // obsługa ruchu kursora myszki
  520. glutMotionFunc(MouseMotion);
  521.  
  522.  
  523. // utworzenie menu podręcznego
  524. glutCreateMenu(Menu);
  525.  
  526. // utworzenie podmenu - aspekt obrazu
  527. int MenuAspect = glutCreateMenu(Menu);
  528. #ifdef WIN32
  529.  
  530. glutAddMenuEntry("Aspekt obrazu - całe okno", FULL_WINDOW);
  531. #else
  532.  
  533. glutAddMenuEntry("Aspekt obrazu - cale okno", FULL_WINDOW);
  534. #endif
  535.  
  536. glutAddMenuEntry("Aspekt obrazu 1:1", ASPECT_1_1);
  537.  
  538. // menu główne
  539. glutCreateMenu(Menu);
  540. glutAddSubMenu("Aspekt obrazu", MenuAspect);
  541. #ifdef WIN32
  542.  
  543. glutAddMenuEntry("Wyjście", EXIT);
  544. #else
  545.  
  546. glutAddMenuEntry("Wyjscie", EXIT);
  547. #endif
  548.  
  549. // określenie przycisku myszki obsługującej menu podręczne
  550. glutAttachMenu(GLUT_RIGHT_BUTTON);
  551.  
  552. // sprawdzenie i przygotowanie obsługi wybranych rozszerzeń
  553.  
  554. ExtensionSetup();
  555.  
  556.  
  557.  
  558. // wprowadzenie programu do obsługi pętli komunikatów
  559. glutMainLoop();
  560.  
  561. return 0;
  562. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement