Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.57 KB | None | 0 0
  1. /* System */
  2. #include<windows.h>
  3. #include<stdio.h>
  4. /* Główna bibloteka OpenGL */
  5. #include<GL/gl.h>
  6. /* Biblioteka GLUT */
  7. #include<GL/freeglut.h>
  8.  
  9.  
  10. /* Deklaracje funkcji narzędziowych */
  11.  
  12. /* Funkcja do rysowania */
  13. void DrawScene(void);
  14. /* Prototyp fukcji rysującej osie ukłądu */
  15. void DrawSceneAxes(void);
  16.  
  17. /* Funkcja do inicjacji OpenGLa */
  18. void InitOpenGL(void);
  19.  
  20. /* Funkcja wywoływana w momentach zmiany rozmiarów okna */
  21. void ReshapeWindow(int width, int height);
  22.  
  23. /* Deklaracja globalnych zmiennych */
  24.  
  25. /* Globalny identyfikator głównego okna programu */
  26. int mainWindow;
  27.  
  28. void KeyboardFunc(unsigned char, int, int);
  29. GLfloat v_angle = 5.0;
  30. /* Funkcja main */
  31. int main(int argc, char **argv)
  32. {
  33. // Inicjujemy bibliotekę GLUT
  34. glutInit(&argc, argv);
  35.  
  36. // Inicjujemy: format koloru, dwa bufoy ramki
  37. glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
  38. // Ustawiamy początkowe wymiary okna
  39. glutInitWindowSize(800, 600);
  40. // Ustawiamy pozycję okna - lewy górny narożnik
  41. glutInitWindowPosition(150,150);
  42. // Tworzymy główne okno programu
  43. mainWindow = glutCreateWindow("Transformacje czajnikowe");
  44.  
  45. // Sprawdzamy powodzenie operacji
  46. if(mainWindow == 0){
  47. puts("Nie mozna stworzyc okna!!!\nWyjscie z programu.\n");
  48. exit(-1);
  49. }
  50. // Czynimy aktywnym okno główne programu
  51. glutSetWindow(mainWindow);
  52. glutKeyboardFunc(KeyboardFunc);
  53.  
  54. // Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks
  55. glutDisplayFunc(DrawScene);
  56. glutReshapeFunc(ReshapeWindow);
  57.  
  58. // Ustawienia początkowe
  59. InitOpenGL();
  60.  
  61. // Włączamy mechanizm usuwania niewidocznych powierzchni
  62. glEnable(GL_DEPTH_TEST);
  63.  
  64. // Wejście do pętli programu
  65. glutMainLoop();
  66.  
  67. return(0);
  68. }
  69.  
  70. /* W tej funkcji określamy to co ma byc narysowane na ekranie.
  71. * Jest wywoływana zawsze wtedy, gdy trzeba przerysować ekran - bufor ramki.
  72. */
  73. void DrawScene(void)
  74. {
  75. // Czyścimy okno aktualnym (domyślnym) kolorem oraz resetujemy bufor głębi
  76. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  77.  
  78. // Rysujemy osie układu
  79. glRotatef(4*v_angle, 1.0f, 0.0f, 0.0);
  80. DrawSceneAxes();
  81.  
  82. // Komenda wykonania poleceń rysujących - nie jest już potrzebna przy ustaweniu GLUT_DOUBLE
  83. //glFlush();
  84.  
  85. // Zamieniamy bufory ramki
  86. glutSwapBuffers();
  87. glutPostRedisplay();
  88. }
  89. void KeyboardFunc(unsigned char key, int x, int y)
  90. {
  91. switch(key)
  92. {
  93. case 27: // Wciśnięcie klawisza ESC spowoduje wyjście z programu
  94. exit(0);
  95. case 'w': // Wciśnięcie klawisza w spowoduje inkrementację zmiennej
  96. if(v_angle <0)
  97. {
  98. v_angle=0;
  99. v_angle+=0.05f;
  100. }
  101. else
  102. {
  103. v_angle -= 0.05f;
  104. }
  105. break;
  106. case 'r': // Wciśnięcie klawisza r spowoduje dekrementację zmiennej
  107. {
  108. if(v_angle >0)
  109. {
  110. v_angle=0;
  111. v_angle-=0.05f;
  112. }
  113. else
  114. {
  115. v_angle -= 0.05f;
  116. }
  117. break;
  118. }
  119. glutPostRedisplay();
  120. }
  121. }
  122. /* Ta funkcja jest wywoływana przez funkcję DrawScene.
  123. * Jej zadaniem jest rysowanie konkretnych obiektów osi układu
  124. * współrzędnych.
  125. */
  126. void DrawSceneAxes(void)
  127. {
  128. // Definiujemy nowy typ jako tablicę 3-elementową
  129. typedef float pt3d[3];
  130.  
  131. // Początek i koniec osi X
  132. pt3d x_beg = { -10.0f, 0.0f, 0.0f };
  133. pt3d x_end = { 10.0f, 0.0f, 0.0f };
  134.  
  135. // Poczatek i koniec osi Y
  136. pt3d y_beg = { 0.0f, -10.0f, 0.0f };
  137. pt3d y_end = { 0.0f, 10.0f, 0.0f };
  138.  
  139. // Początek i koniec osi Z
  140. pt3d z_beg = { 0.0f, 0.0f, -10.0f };
  141. pt3d z_end = { 0.0f, 0.0f, 10.0f };
  142.  
  143. // Rysujemy osie
  144. glBegin(GL_LINES);
  145. // Czerwony kolor dla osi X
  146. glColor3f(1.0f, 0.0f, 0.0f);
  147. glVertex3fv(x_beg);
  148. glVertex3fv(x_end);
  149.  
  150. // Zielony kolor dla osi Y
  151. glColor3f(0.0f, 1.0f, 0.0f);
  152. glVertex3fv(y_beg);
  153. glVertex3fv(y_end);
  154.  
  155. // Niebieski kolor dla osi Z
  156. glColor3f(0.0f, 0.0f, 1.0f);
  157. glVertex3fv(z_beg);
  158. glVertex3fv(z_end);
  159. glEnd();
  160. glColor3f(0.5f, 0.5f, 0.5f);
  161. glutWireTeapot(4.0);
  162. }
  163.  
  164. /* Ta funkcja służy do wstępnej konfiguracji OpenGLa.
  165. * Zanim coś narysujemy musimy wywołać tę funkcję.
  166. */
  167. void InitOpenGL(void)
  168. {
  169. // Ustawiamy domyślny, czarny kolor tła okna - bufor ramki malujemy na czarno
  170. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  171. }
  172.  
  173. /* Tę funkcję wywołuje system w momencie gdy użytkownik zmieni myszą
  174. * rozmiar głównego okna. jej zadaniem jest zachowanie proporcji wymiarów
  175. * rysowanych obiektów niezależnie od wymiarów okna.
  176. */
  177.  
  178. void ReshapeWindow(int width, int height)
  179. {
  180. //printf("w: %d\n", width);
  181. //printf("h: %d\n", height);
  182. GLdouble nRange = 15.0f;
  183. // Na wypadek dzielenia przez 0
  184. if(height == 0)
  185. {
  186. height = 1;
  187. }
  188.  
  189. if(width == 0)
  190. {
  191. width = 1;
  192. }
  193.  
  194. // Ustawiamy wielkości okna urządzenia w zakresie
  195. // od 0,0 do wysokość, szerokość
  196. glViewport(0, 0, width, height);
  197.  
  198. // Ustawiamy układ współrzędnych obserwatora
  199. glMatrixMode(GL_PROJECTION);
  200.  
  201. // Resetujemy macierz projekcji
  202. glLoadIdentity();
  203.  
  204. // Korekta
  205. if(width <= height)
  206. glOrtho(-nRange, nRange, -nRange*((GLdouble)height / width), nRange*((GLdouble)height / width), -10.0f, 10.0f);
  207. else
  208. glOrtho(-nRange*((GLdouble)width / height), nRange*((GLdouble)width / height), -nRange, nRange, -10.0f, 10.0f);
  209.  
  210. // Ustawiamy macierz modelu
  211. glMatrixMode(GL_MODELVIEW);
  212.  
  213. // Resetujemy macierz modelu
  214. glLoadIdentity();
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement