Advertisement
Guest User

Untitled

a guest
Nov 16th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.54 KB | None | 0 0
  1. // lab_3.cpp : Ten plik zawiera funkcję „main”. W nim rozpoczyna się i kończy wykonywanie programu.
  2. //
  3.  
  4. #include "pch.h"
  5. #include <iostream>
  6. #include <windows.h>
  7. #include <gl/gl.h>
  8. #include <gl/glut.h>
  9.  
  10.  
  11. typedef float point3[3];
  12.  
  13. static GLfloat viewer[] = { 1.0, 1.0, 10.0 }; // inicjalizacja położenia obserwatora, viewer[2] przybliżanie
  14.  
  15. static GLfloat theta = 0.0;   // kąt obrotu obiektu
  16. static GLfloat pix2angle;     // przelicznik pikseli na stopnie
  17. static GLfloat thetaY = 0.0;   // kąt obrotu obiektu
  18.  
  19. static GLint status = 0;       // stan klawiszy myszy 0 - nie naciśnięto żadnego klawisza, 1 - naciśnięty zostać lewy klawisz, 2 - naciśnięto prawy klawisz myszy
  20.  
  21. static int x_pos_old = 0;       // poprzednia pozycja kursora myszy
  22. static int delta_x = 0;        // różnica pomiędzy pozycją bieżącą i poprzednią kursora myszy
  23. static int y_pos_old = 0;
  24. static int delta_y = 0;
  25.  
  26. /*************************************************************************************/
  27. // Funkcja rysująca osie układu wspó?rz?dnych
  28.  
  29.  
  30. void Axes(void)
  31. {
  32.  
  33.     point3  x_min = { -5.0, 0.0, 0.0 };
  34.     point3  x_max = { 5.0, 0.0, 0.0 };
  35.     // pocz?tek i koniec obrazu osi x
  36.  
  37.     point3  y_min = { 0.0, -5.0, 0.0 };
  38.     point3  y_max = { 0.0,  5.0, 0.0 };
  39.     // pocz?tek i koniec obrazu osi y
  40.  
  41.     point3  z_min = { 0.0, 0.0, -5.0 };
  42.     point3  z_max = { 0.0, 0.0,  5.0 };
  43.     //  pocz?tek i koniec obrazu osi y
  44.  
  45.     glColor3f(1.0f, 0.0f, 0.0f);  // kolor rysowania osi - czerwony
  46.     glBegin(GL_LINES); // rysowanie osi x
  47.  
  48.     glVertex3fv(x_min);
  49.     glVertex3fv(x_max);
  50.  
  51.     glEnd();
  52.  
  53.     glColor3f(0.0f, 1.0f, 0.0f);  // kolor rysowania - zielony
  54.     glBegin(GL_LINES);  // rysowanie osi y
  55.  
  56.     glVertex3fv(y_min);
  57.     glVertex3fv(y_max);
  58.  
  59.     glEnd();
  60.  
  61.     glColor3f(0.0f, 0.0f, 1.0f);  // kolor rysowania - niebieski
  62.     glBegin(GL_LINES); // rysowanie osi z
  63.  
  64.     glVertex3fv(z_min);
  65.     glVertex3fv(z_max);
  66.  
  67.     glEnd();
  68.  
  69. }
  70.  
  71. /*************************************************************************************/
  72. // Funkcja określająca co ma być rysowane (zawsze wywoływana, gdy trzeba
  73. // przerysować scenę)
  74. void RenderScene(void)
  75. {
  76.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  77.     // Czyszczenie okna aktualnym kolorem czyszczącym
  78.  
  79.     glLoadIdentity();
  80.     // Czyszczenie macierzy bie??cej
  81.  
  82.     gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //pierwsze 3 argumenty określają współrzędne obserwatora
  83.                                                                               //kolejne 3 to punkt na który obserwator patrzy
  84.                                                                               //ostatnie 3 to wektor skracania trzymanej kamery
  85.     // Zdefiniowanie położenia obserwatora
  86.  
  87.     Axes();
  88.     // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  89.  
  90.     if (status == 1)                     // jeśli lewy klawisz myszy wcięnięty
  91.     {
  92.         theta += delta_x * pix2angle;    // modyfikacja kąta obrotu o kat proporcjonalny do różnicy położeń kursora myszy
  93.         thetaY += delta_y * pix2angle;
  94.     }
  95.     if (status == 2)                     // jeśli lewy klawisz myszy wcięnięty
  96.     {
  97.         viewer[2] += delta_x * pix2angle;
  98.  
  99.         if (viewer[2] > 30)
  100.             viewer[2] = 30;
  101.         else if (viewer[2] < 5)
  102.             viewer[2] = 5;
  103.     }
  104.  
  105.  
  106.     glRotatef(theta, 0.0, 1.0, 0.0);
  107.     glRotatef(thetaY, 1.0, 0.0, 0.0);
  108.  
  109.  
  110.  
  111.     //glRotatef(theta, 1.0, 0.0, 0.0);  //obrót obiektu o nowy kąt
  112.  
  113.     glColor3f(1.0f, 1.0f, 1.0f);
  114.     // Ustawienie koloru rysowania na biały
  115.  
  116.     glutWireTeapot(3.0);
  117.     // Narysowanie czajnika
  118.  
  119.     glFlush();
  120.     // Przekazanie poleceń rysujących do wykonania
  121.  
  122.     glutSwapBuffers();
  123.  
  124.  
  125.  
  126. }
  127. /*************************************************************************************/
  128. // Funkcja ustalająca stan renderowania
  129.  
  130. /*************************************************************************************/
  131. // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
  132.  
  133. void Mouse(int btn, int state, int x, int y)
  134. {
  135.     if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  136.     {
  137.         x_pos_old = x;        // przypisanie aktualnie odczytanej pozycji kursora
  138.                          // jako pozycji poprzedniej
  139.         status = 1;          // wcięnięty został lewy klawisz myszy
  140.  
  141.         y_pos_old = y;
  142.     }
  143.     else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  144.     {
  145.         std::cout << "status 3\n";
  146.         //coś do oddalania
  147.         x_pos_old = x;
  148.         y_pos_old = y;
  149.         status = 2;
  150.     }
  151.     else
  152.         status = 0;          // nie został wcięnięty żaden klawisz
  153. }
  154.  
  155. /*************************************************************************************/
  156. // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
  157. // zmiennych globalnych
  158.  
  159. void Motion(GLsizei x, GLsizei y)
  160. {
  161.  
  162.     delta_x = x - x_pos_old;     // obliczenie różnicy położenia kursora myszy
  163.     x_pos_old = x;            // podstawienie bieżącego położenia jako poprzednie
  164.  
  165.     delta_y = y - y_pos_old;
  166.     y_pos_old = y;
  167.  
  168.     glutPostRedisplay();     // przerysowanie obrazu sceny
  169. }
  170.  
  171. /*************************************************************************************/
  172.  
  173.  
  174. void MyInit(void)
  175. {
  176.  
  177.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  178.     // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
  179.  
  180. }
  181.  
  182. /*************************************************************************************/
  183.  
  184. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  185. // w przypadku zmiany rozmiarów okna.
  186. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  187. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  188.  
  189.  
  190.  
  191. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  192. {
  193.  
  194.     pix2angle = 360.0 / (float)horizontal;  // przeliczenie pikseli na stopnie
  195.  
  196.     glMatrixMode(GL_PROJECTION);
  197.     // Przełączenie macierzy bieżącej na macierz projekcji
  198.  
  199.     glLoadIdentity();
  200.     // Czyszcznie macierzy bieżącej
  201.  
  202.     gluPerspective(70, 1.0, 1.0, 30.0);
  203.     // Ustawienie parametrów dla rzutu perspektywicznego
  204.  
  205.  
  206.     if (horizontal <= vertical)
  207.         glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  208.  
  209.     else
  210.         glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  211.     // Ustawienie wielkości okna okna widoku (viewport) w zależności
  212.     // relacji pomiędzy wysokością i szerokością okna
  213.  
  214.     glMatrixMode(GL_MODELVIEW);
  215.     // Przełączenie macierzy bieżącej na macierz widoku modelu  
  216.  
  217.     glLoadIdentity();
  218.     // Czyszczenie macierzy bieżącej
  219.  
  220. }
  221.  
  222. /*************************************************************************************/
  223. // Główny punkt wejścia programu. Program działa w trybie konsoli
  224. void main(int argc, char* argv[])
  225. {
  226.  
  227.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  228.  
  229.     glutInitWindowSize(300, 300);
  230.  
  231.     glutInit(&argc, argv);
  232.     glutCreateWindow("Rzutowanie perspektywiczne");
  233.  
  234.     glutMouseFunc(Mouse);
  235.     // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  236.  
  237.     glutMotionFunc(Motion);
  238.     // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  239.  
  240.  
  241.     glutDisplayFunc(RenderScene);
  242.     // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  243.     // (callback function).  Będzie ona wywoływana za każdym razem
  244.     // gdy zajdzie potrzeba przerysowania okna
  245.  
  246.     glutReshapeFunc(ChangeSize);
  247.     // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  248.     // za zmiany rozmiaru okna                      
  249.  
  250.     MyInit();
  251.     // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  252.     // inicjalizacje konieczne  przed przystąpieniem do renderowania
  253.  
  254.     glEnable(GL_DEPTH_TEST);
  255.     // Włączenie mechanizmu usuwania niewidocznych elementów sceny
  256.  
  257.     glutMainLoop();
  258.     // Funkcja uruchamia szkielet biblioteki GLUT
  259.  
  260. }
  261.  
  262. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement