Advertisement
Guest User

Untitled

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