Advertisement
Guest User

Untitled

a guest
May 24th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. // zajecia10manipulowanie.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <stdlib.h>
  6. #include "glut.h"
  7. #include <cmath>
  8. #include <iostream>
  9.  
  10. #define PI 3.1415
  11.  
  12.  
  13. enum
  14. {
  15. FULL_WINDOW,
  16. WIDOK_1_1,
  17. WIRE_CONE, // stożek
  18. EXIT // wyjście
  19. };
  20.  
  21. int aspect = FULL_WINDOW;
  22.  
  23. int object = WIRE_CONE;
  24.  
  25. const GLdouble left = -3.0;
  26. const GLdouble right = 3.0;
  27. const GLdouble bottom = -3.0;
  28. const GLdouble top = 3.0;
  29. const GLdouble near = 50.0;
  30. const GLdouble far = 80.0;
  31.  
  32. GLfloat scale = 1.0;
  33.  
  34. GLfloat rotatex = 0.0;
  35. GLfloat rotatey = 0.0;
  36.  
  37. GLfloat translatex = 0.0;
  38. GLfloat translatey = 0.0;
  39.  
  40. // funkcja generująca scenę 3D
  41. void Display()
  42. {
  43. glClearColor(1.0, 1.0, 1.0, 1.0);
  44.  
  45. glClear(GL_COLOR_BUFFER_BIT);
  46.  
  47. glMatrixMode(GL_MODELVIEW);
  48.  
  49. glLoadIdentity();
  50.  
  51. glTranslatef(0, 0, -(near + far) / 2);
  52.  
  53. // skalowanie obiektu - klawisze "+" i "-"
  54. glScalef(scale, scale, scale);
  55.  
  56. // obroty obiektu - klawisze kursora
  57. glRotatef(rotatex, 1.0, 0, 0);
  58. glRotatef(rotatey, 0, 1.0, 0);
  59.  
  60. // kolor krawędzi obiektu
  61. glColor3f(0.0, 0.0, 0.0);
  62.  
  63. // rysowanie obiektu
  64. switch (object)
  65. {
  66. // stożek
  67. case WIRE_CONE:
  68. glutWireCone(1.0, 2.0, 20, 10);
  69. break;
  70. }
  71.  
  72. // skierowanie poleceń do wykonania
  73. glFlush();
  74.  
  75. // zamiana buforów koloru
  76. glutSwapBuffers();
  77. }
  78.  
  79. // zmiana wielkości okna
  80. void Reshape(int width, int height)
  81. {
  82. // obszar renderingu - całe okno
  83. glViewport(0, 0, width, height);
  84.  
  85. // wybór macierzy rzutowania
  86. glMatrixMode(GL_PROJECTION);
  87.  
  88. // macierz rzutowania = macierz jednostkowa
  89. glLoadIdentity();
  90.  
  91. if (aspect == WIDOK_1_1)
  92. {
  93. if (width < height && width > 0)
  94. glFrustum(left, right, bottom * height / width, top * height / width, near, far);
  95. else
  96.  
  97. if (width >= height && height > 0)
  98. glFrustum(left * width / height, right * width / height, bottom, top, near, far);
  99.  
  100. }
  101. else
  102. glFrustum(left, right, bottom, top, near, far);
  103.  
  104. // generowanie sceny 3D
  105. Display();
  106. }
  107.  
  108. // obsługa klawiatury
  109. void Keyboard(unsigned char key, int x, int y)
  110. {
  111. // klawisz +
  112. if (key == '+')
  113. scale += 0.1;
  114. else
  115.  
  116. // klawisz -
  117. if (key == '-' && scale > 0.1)
  118. scale -= 0.1;
  119.  
  120. // odrysowanie okna
  121. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  122. }
  123.  
  124. // obsługa klawiszy funkcyjnych i klawiszy kursora
  125. void SpecialKeys(int key, int x, int y)
  126. {
  127. switch (key)
  128. {
  129. case GLUT_KEY_LEFT:
  130. rotatey -= 1;
  131. break;
  132.  
  133. case GLUT_KEY_UP:
  134. rotatex -= 1;
  135. break;
  136.  
  137. case GLUT_KEY_RIGHT:
  138. rotatey += 1;
  139. break;
  140.  
  141. case GLUT_KEY_DOWN:
  142. rotatex += 1;
  143. break;
  144. }
  145.  
  146. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  147. }
  148.  
  149.  
  150.  
  151.  
  152.  
  153. // obsługa menu podręcznego
  154. void Menu(int value)
  155. {
  156. switch (value)
  157. {
  158. case FULL_WINDOW:
  159. aspect = FULL_WINDOW;
  160. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  161. break;
  162.  
  163. case WIDOK_1_1:
  164. aspect = WIDOK_1_1;
  165. Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  166. break;
  167.  
  168. case WIRE_CONE:
  169. object = WIRE_CONE;
  170. Display();
  171. break;
  172.  
  173. case EXIT:
  174. exit(0);
  175. }
  176. }
  177.  
  178. int main(int argc, char * argv[])
  179. {
  180. // inicjalizacja biblioteki GLUT
  181. glutInit(&argc, argv);
  182.  
  183. // inicjalizacja bufora ramki
  184. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  185.  
  186. // rozmiary głównego okna programu
  187. glutInitWindowSize(600, 600);
  188.  
  189. // utworzenie głównego okna programu
  190. #ifdef WIN32
  191.  
  192. glutCreateWindow("Manipulacja");
  193. #else
  194.  
  195. glutCreateWindow("Manipulacja");
  196. #endif
  197.  
  198. // dołączenie funkcji generującej scenę 3D
  199. glutDisplayFunc(Display);
  200.  
  201. // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
  202. glutReshapeFunc(Reshape);
  203.  
  204. // dołączenie funkcji obsługi klawiatury
  205. glutKeyboardFunc(Keyboard);
  206.  
  207. // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
  208. glutSpecialFunc(SpecialKeys);
  209.  
  210. // utworzenie podmenu - aspekt obrazu
  211. int MenuAspect = glutCreateMenu(Menu);
  212. #ifdef WIN32
  213.  
  214. glutAddMenuEntry("Całe okno", FULL_WINDOW);
  215. #else
  216.  
  217. glutAddMenuEntry("Cale okno", FULL_WINDOW);
  218. #endif
  219.  
  220. glutAddMenuEntry("1:1", WIDOK_1_1);
  221.  
  222. // utworzenie podmenu - obiekt
  223. int MenuObject = glutCreateMenu(Menu);
  224. #ifdef WIN32
  225.  
  226. glutAddMenuEntry("Stożek", WIRE_CONE);;
  227. #else
  228.  
  229. glutAddMenuEntry("Stozek", WIRE_CONE);
  230. #endif
  231.  
  232. // menu główne
  233. glutCreateMenu(Menu);
  234. glutAddSubMenu("Widok", MenuAspect);
  235. glutAddSubMenu("Obiekt", MenuObject);
  236. #ifdef WIN32
  237.  
  238. glutAddMenuEntry("Wyjście", EXIT);
  239. #else
  240.  
  241. glutAddMenuEntry("Wyjscie", EXIT);
  242. #endif
  243.  
  244. // określenie przycisku myszki obsługującego menu podręczne
  245. glutAttachMenu(GLUT_RIGHT_BUTTON);
  246.  
  247. // wprowadzenie programu do obsługi pętli komunikatów
  248. glutMainLoop();
  249. return 0;
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement