Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.72 KB | None | 0 0
  1. /*************************************************************************************/
  2.  
  3. //  Szkielet programu do tworzenia modelu sceny 3-D z wizualizacją osi
  4. //  układu współrzędnych dla rzutowania perspektywicznego
  5.  
  6. /*************************************************************************************/
  7.  
  8. #include <windows.h>
  9. #include <gl/gl.h>
  10. #include <gl/glut.h>
  11. #include <iostream>
  12.  
  13.  
  14. typedef float point3[3];
  15.  
  16. static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
  17. static GLfloat theta_l = 0.0;   // kąt obrotu obiektu
  18. static GLfloat theta_r = 0.0;   // kąt obrotu obiektu
  19. static GLfloat pix2angle;     // przelicznik pikseli na stopnie
  20. static int x = 10;
  21.  
  22. static GLint status_l = 0;       // stan klawiszy myszy
  23.                                // 0 - nie naciśnięto żadnego klawisza
  24.                                // 1 - naciśnięty zostać lewy klawisz
  25. static GLint status_r = 0;
  26. static int x_pos_old = 0;       // poprzednia pozycja kursora myszy
  27.  
  28. static int delta_x = 0;        // różnica pomiędzy pozycją bieżącą
  29.                                       // i poprzednią kursora myszy
  30.  
  31.  
  32. void Mouse(int btn, int state, int x, int y)
  33. {
  34.  
  35.  
  36.     if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
  37.     {
  38.         x_pos_old = x;         // przypisanie aktualnie odczytanej pozycji kursora
  39.                              // jako pozycji poprzedniej
  40.         status_l = 1;          // wcięnięty został lewy klawisz myszy
  41.     }
  42.     else
  43.  
  44.         status_l = 0;          // nie został wcięnięty żaden klawisz
  45.  
  46.  
  47.     if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
  48.     {
  49.         x_pos_old = x;         // przypisanie aktualnie odczytanej pozycji kursora
  50.                              // jako pozycji poprzedniej
  51.         status_r = 1;          // wcięnięty został lewy klawisz myszy
  52.     }
  53.     else
  54.  
  55.         status_r = 0;          // nie został wcięnięty żaden klawisz
  56.  
  57.  
  58. }
  59.  
  60. /*************************************************************************************/
  61. // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
  62. // zmiennych globalnych
  63.  
  64. void Motion(GLsizei x, GLsizei y)
  65. {
  66.  
  67.     delta_x = x - x_pos_old;     // obliczenie różnicy położenia kursora myszy
  68.  
  69.     x_pos_old = x;            // podstawienie bieżącego położenia jako poprzednie
  70.  
  71.  
  72.  
  73.     glutPostRedisplay();     // przerysowanie obrazu sceny
  74. }
  75.  
  76. /*************************************************************************************/
  77.  
  78. // inicjalizacja położenia obserwatora
  79.  
  80. /*************************************************************************************/
  81.  
  82. // Funkcja rysująca osie układu wspó?rz?dnych
  83.  
  84.  
  85.  
  86. void Axes(void)
  87. {
  88.  
  89.     point3  x_min = { -5.0, 0.0, 0.0 };
  90.     point3  x_max = { 5.0, 0.0, 0.0 };
  91.     // pocz?tek i koniec obrazu osi x
  92.  
  93.     point3  y_min = { 0.0, -5.0, 0.0 };
  94.     point3  y_max = { 0.0,  5.0, 0.0 };
  95.     // pocz?tek i koniec obrazu osi y
  96.  
  97.     point3  z_min = { 0.0, 0.0, -5.0 };
  98.     point3  z_max = { 0.0, 0.0,  5.0 };
  99.     //  pocz?tek i koniec obrazu osi y
  100.     glColor3f(1.0f, 0.0f, 0.0f);  // kolor rysowania osi - czerwony
  101.     glBegin(GL_LINES); // rysowanie osi x
  102.     glVertex3fv(x_min);
  103.     glVertex3fv(x_max);
  104.     glEnd();
  105.  
  106.     glColor3f(0.0f, 1.0f, 0.0f);  // kolor rysowania - zielony
  107.     glBegin(GL_LINES);  // rysowanie osi y
  108.  
  109.     glVertex3fv(y_min);
  110.     glVertex3fv(y_max);
  111.     glEnd();
  112.  
  113.     glColor3f(0.0f, 0.0f, 1.0f);  // kolor rysowania - niebieski
  114.     glBegin(GL_LINES); // rysowanie osi z
  115.  
  116.     glVertex3fv(z_min);
  117.     glVertex3fv(z_max);
  118.     glEnd();
  119.  
  120. }
  121.  
  122. /*************************************************************************************/
  123.  
  124. // Funkcja określająca co ma być rysowane (zawsze wywoływana, gdy trzeba
  125. // przerysować scenę)
  126.  
  127. /*************************************************************************************/
  128. // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
  129.  
  130.  
  131.  
  132. void RenderScene(void)
  133. {
  134.  
  135.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  136.     // Czyszczenie okna aktualnym kolorem czyszczącym
  137.  
  138.     glLoadIdentity();
  139.     // Czyszczenie macierzy bie??cej
  140.    
  141.     gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, theta_r/100 , 0.0, 0.0, 1.0, 0.0);
  142.  
  143.  
  144.    
  145.     // Zdefiniowanie położenia obserwatora
  146.     Axes();
  147.     // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
  148.     if (status_l == 1)                     // jeśli lewy klawisz myszy wcięnięty
  149.     {
  150.         theta_l += delta_x * pix2angle;    // modyfikacja kąta obrotu o kat proporcjonalny
  151.         std::cout << theta_l << "\n";
  152.     }                                  // do różnicy położeń kursora myszy
  153.  
  154.     if (status_r == 1)                     // jeśli lewy klawisz myszy wcięnięty
  155.     {
  156.         theta_r += delta_x * pix2angle;    // modyfikacja kąta obrotu o kat proporcjonalny
  157.         std::cout << theta_r << "\n";
  158.     }
  159.  
  160.     GLfloat light_diffuse1[] = { theta_r, 1.0, 0, 1.0 };
  161.     glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
  162.     GLfloat light_position[] = { theta_l, 1 ,3.0, 1.0 };
  163.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  164.     GLfloat light_position1[] = { 0.0, 1.0, theta_r, 1.0};
  165.     glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
  166.    
  167.     //glRotatef(theta, 0.0, 1.0, 0.0);  //obrót obiektu o nowy kąt
  168.    
  169.     glColor3f(1.0f, 1.0f, 1.0f);
  170.     // Ustawienie koloru rysowania na biały
  171.  
  172.     glutSolidTeapot(3.0);
  173.     // Narysowanie czajnika
  174.     glFlush();
  175.     // Przekazanie poleceń rysujących do wykonania
  176.     glutSwapBuffers();
  177.  
  178.  
  179.  
  180. }
  181. /*************************************************************************************/
  182.  
  183. // Funkcja ustalająca stan renderowania
  184.  
  185.  
  186. void MyInit(void)
  187. {
  188.  
  189.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  190.     // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
  191.  
  192.     /*************************************************************************************/
  193.  
  194. //  Definicja materiału z jakiego zrobiony jest czajnik
  195. //  i definicja źródła światła
  196.  
  197. /*************************************************************************************/
  198.  
  199.  
  200. /*************************************************************************************/
  201. // Definicja materiału z jakiego zrobiony jest czajnik
  202.  
  203.     GLfloat mat_ambient[] = { 1, 1.0, 1.0, 1.0 };
  204.     // współczynniki ka =[kar,kag,kab] dla światła otoczenia
  205.  
  206.     GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
  207.     // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
  208.  
  209.     GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  210.     // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego              
  211.  
  212.     GLfloat mat_shininess = { 20.0 };
  213.     // współczynnik n opisujący połysk powierzchni
  214.  
  215.  
  216. /*************************************************************************************/
  217. // Definicja źródła światła
  218.  
  219.  
  220.     GLfloat light_position[] = { 0.0, 1, 1, 1.0 };
  221.     // położenie źródła
  222.    
  223.  
  224.     GLfloat light_ambient[] = { 0.1, 0.1, 0.1, 1.0 };
  225.     // składowe intensywności świecenia źródła światła otoczenia
  226.     // Ia = [Iar,Iag,Iab]
  227.  
  228.     GLfloat light_diffuse[] = { 0, 1.0, 0, 1.0 };
  229.     // składowe intensywności świecenia źródła światła powodującego
  230.     // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
  231.  
  232.     GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  233.     // składowe intensywności świecenia źródła światła powodującego
  234.     // odbicie kierunkowe Is = [Isr,Isg,Isb]
  235.  
  236.     GLfloat att_constant = { 1.0 };
  237.     // składowa stała ds dla modelu zmian oświetlenia w funkcji
  238.     // odległości od źródła
  239.  
  240.     GLfloat att_linear = { 0.05 };
  241.     // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
  242.     // odległości od źródła
  243.  
  244.     GLfloat att_quadratic = { 0.001 };
  245.     // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
  246.     // odległości od źródła
  247.  
  248. /*************************************************************************************/
  249. // Ustawienie parametrów materiału i źródła światła
  250.  
  251. /*************************************************************************************/
  252. // Ustawienie patrametrów materiału
  253.  
  254.  
  255.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  256.     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
  257.     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  258.     glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
  259.  
  260.  
  261.     /*************************************************************************************/
  262.     // Ustawienie parametrów źródła
  263.  
  264.     glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  265.     glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  266.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  267.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  268.  
  269.     glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
  270.     glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
  271.     glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
  272.  
  273.  
  274.  
  275.  
  276. /*************************************************************************************/
  277.     // Definicja źródła światła
  278.  
  279.  
  280.     GLfloat light_position1[] = { 0.0, 1, 1, 1.0 };
  281.     // położenie źródła
  282.  
  283.  
  284.     GLfloat light_ambient1[] = { 0.1, 0.1, 0.1, 1.0 };
  285.     // składowe intensywności świecenia źródła światła otoczenia
  286.     // Ia = [Iar,Iag,Iab]
  287.  
  288.     GLfloat light_diffuse1[] = { 1.0, 1.0, 1.0, 1.0 };
  289.     // składowe intensywności świecenia źródła światła powodującego
  290.     // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
  291.  
  292.     GLfloat light_specular1[] = { 1.0, 1.0, 1.0, 1.0 };
  293.     // składowe intensywności świecenia źródła światła powodującego
  294.     // odbicie kierunkowe Is = [Isr,Isg,Isb]
  295.  
  296.     GLfloat att_constant1 = { 1.0 };
  297.     // składowa stała ds dla modelu zmian oświetlenia w funkcji
  298.     // odległości od źródła
  299.  
  300.     GLfloat att_linear1 = { 0.05 };
  301.     // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
  302.     // odległości od źródła
  303.  
  304.     GLfloat att_quadratic1 = { 0.001 };
  305.     // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
  306.     // odległości od źródła
  307.  
  308.     glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient1);
  309.     glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
  310.     glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);
  311.     glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
  312.  
  313.     glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, att_constant1);
  314.     glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, att_linear1);
  315.     glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, att_quadratic1);
  316.  
  317.     /*************************************************************************************/
  318. // Ustawienie opcji systemu oświetlania sceny
  319.  
  320.     glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
  321.     glEnable(GL_LIGHTING);   // właczenie systemu oświetlenia sceny
  322.     glEnable(GL_LIGHT0);     // włączenie źródła o numerze 0
  323.     glEnable(GL_LIGHT1);
  324.     glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
  325. }
  326.  
  327. /*************************************************************************************/
  328.  
  329.  
  330. // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
  331. // w przypadku zmiany rozmiarów okna.
  332. // Parametry vertical i horizontal (wysokość i szerokość okna) są
  333. // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
  334.  
  335.  
  336.  
  337. void ChangeSize(GLsizei horizontal, GLsizei vertical)
  338. {
  339.     pix2angle = 360.0 / (float)horizontal;  // przeliczenie pikseli na stopnie
  340.    
  341.     glMatrixMode(GL_PROJECTION);
  342.     // Przełączenie macierzy bieżącej na macierz projekcji
  343.  
  344.     glLoadIdentity();
  345.     // Czyszcznie macierzy bieżącej
  346.     MyInit();
  347.     gluPerspective(70, 1.0, 1.0, 30.0);
  348.     // Ustawienie parametrów dla rzutu perspektywicznego
  349.  
  350.  
  351.     if (horizontal <= vertical)
  352.         glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
  353.  
  354.     else
  355.         glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
  356.     // Ustawienie wielkości okna okna widoku (viewport) w zależności
  357.     // relacji pomiędzy wysokością i szerokością okna
  358.  
  359.     glMatrixMode(GL_MODELVIEW);
  360.     // Przełączenie macierzy bieżącej na macierz widoku modelu  
  361.  
  362.    
  363.  
  364.     glLoadIdentity();
  365.     // Czyszczenie macierzy bieżącej
  366.  
  367.  
  368. }
  369.  
  370. /*************************************************************************************/
  371.  
  372. // Główny punkt wejścia programu. Program działa w trybie konsoli
  373.  
  374.  
  375.  
  376. void main(void)
  377. {
  378.  
  379.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  380.  
  381.     glutInitWindowSize(900, 900);
  382.  
  383.     glutCreateWindow("Rzutowanie perspektywiczne");
  384.  
  385.     glutMouseFunc(Mouse);
  386.     // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
  387.  
  388.     glutMotionFunc(Motion);
  389.     // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
  390.  
  391.  
  392.     glutDisplayFunc(RenderScene);
  393.     // Określenie, że funkcja RenderScene będzie funkcją zwrotną
  394.     // (callback function).  Będzie ona wywoływana za każdym razem
  395.     // gdy zajdzie potrzeba przerysowania okna
  396.  
  397.  
  398.     glutReshapeFunc(ChangeSize);
  399.     // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
  400.     // za zmiany rozmiaru okna                      
  401.  
  402.  
  403.     MyInit();
  404.     // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
  405.     // inicjalizacje konieczne  przed przystąpieniem do renderowania
  406.     glEnable(GL_DEPTH_TEST);
  407.     // Włączenie mechanizmu usuwania niewidocznych elementów sceny
  408.  
  409.     glutMainLoop();
  410.     // Funkcja uruchamia szkielet biblioteki GLUT
  411. }
  412.  
  413. /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement