Advertisement
Guest User

Untitled

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