Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.49 KB | None | 0 0
  1. #include <GL/glut.h>
  2. #include <stdlib.h>
  3.  
  4. enum
  5. {
  6.     CALE_OKNO,
  7.     SKALA_1_1,
  8.     ORTO,
  9.     FRUST,
  10.     PERSP,
  11.     EXIT
  12. };
  13.  
  14. static int submenu_id1;
  15. static int submenu_id2;
  16. static int menu_id;
  17.  
  18. int skala = CALE_OKNO;
  19. int rzut = ORTO;
  20. int fovy = 100;
  21. int xx, xy, yy, yx, zx, zy;
  22. int obrot_x = 0;
  23. int obrot_y = 0;
  24.  
  25. GLdouble vecx = 0.0;
  26. GLdouble vecy = 0.0;
  27. GLdouble vecz = 0.0;
  28. GLdouble eyex = 0.0;
  29. GLdouble eyey = 0.0;
  30. GLdouble eyez = 3.0;
  31.  
  32.  
  33. void Display()
  34. {
  35.     glClearColor(0.0, 0.0, 0.0, 0.0);
  36.     glClear(GL_COLOR_BUFFER_BIT);
  37.     glMatrixMode(GL_MODELVIEW);
  38.     glLoadIdentity();
  39.  
  40.     gluLookAt(eyex, eyey, eyez, 0, 0, -100, 0, 1, 0);
  41.     glRotatef(obrot_x, 0.0f, 1.0f, 0.0f);
  42.     glRotatef(obrot_y, xy, yy, zy);
  43.     glTranslatef(vecx, vecy, vecz);
  44.     glColor3f(1.0, 0.0, 0.0);
  45.     glBegin(GL_LINES);
  46.  
  47.     glVertex3f(1.0, 1.0, 1.0);
  48.     glVertex3f(1.0, -1.0, 1.0);
  49.  
  50.     glVertex3f(1.0, -1.0, 1.0);
  51.     glVertex3f(1.0, -1.0, -1.0);
  52.  
  53.     glVertex3f(1.0, -1.0, -1.0);
  54.     glVertex3f(1.0, 1.0, -1.0);
  55.  
  56.     glVertex3f(1.0, 1.0, -1.0);
  57.     glVertex3f(1.0, 1.0, 1.0);
  58.  
  59.     glVertex3f(-1.0, 1.0, 1.0);
  60.     glVertex3f(-1.0, -1.0, 1.0);
  61.  
  62.     glVertex3f(-1.0, -1.0, 1.0);
  63.     glVertex3f(-1.0, -1.0, -1.0);
  64.  
  65.     glVertex3f(-1.0, -1.0, -1.0);
  66.     glVertex3f(-1.0, 1.0, -1.0);
  67.  
  68.     glVertex3f(-1.0, 1.0, -1.0);
  69.     glVertex3f(-1.0, 1.0, 1.0);
  70.  
  71.     glVertex3f(1.0, 1.0, 1.0);
  72.     glVertex3f(-1.0, 1.0, 1.0);
  73.  
  74.     glVertex3f(1.0, -1.0, 1.0);
  75.     glVertex3f(-1.0, -1.0, 1.0);
  76.  
  77.     glVertex3f(1.0, -1.0, -1.0);
  78.     glVertex3f(-1.0, -1.0, -1.0);
  79.  
  80.     glVertex3f(1.0, 1.0, -1.0);
  81.     glVertex3f(-1.0, 1.0, -1.0);
  82.     glEnd();
  83.     glFlush();
  84.     glutSwapBuffers();
  85. }
  86.  
  87. void Przeksztalc(int width, int height)
  88. {
  89.    
  90.     glViewport(0, 0, width, height); //obszar renderingu - całe okno
  91.     glMatrixMode(GL_PROJECTION); //wybór macierzy rzutowania
  92.     glLoadIdentity(); //macierz rzutowania = macierz jednostkowa
  93.     //ustawienie parametrów zakresu rzutni
  94.     GLdouble aspect = 1;
  95.     GLfloat zakres = 2.0f;
  96.     GLfloat blisko = 1.0f;
  97.     GLfloat daleko = 10.0f;
  98.     if (rzut == ORTO)
  99.     {
  100.         if (skala == SKALA_1_1)
  101.         {
  102.             if (width < height && width > 0)
  103.                 glOrtho(-zakres, zakres, -zakres * height / width, zakres * height / width, -zakres, zakres);
  104.             else
  105.                 if (width >= height && height > 0)
  106.                     glOrtho(-zakres * width / height, zakres * width / height, -zakres, zakres, -zakres, zakres);
  107.         }
  108.         else
  109.             glOrtho(-zakres, zakres, -zakres, zakres, -zakres, zakres);
  110.     }
  111.     if (rzut == FRUST)
  112.     {
  113.         if (skala == SKALA_1_1)
  114.         {
  115.             if (width < height && width > 0)
  116.                 glFrustum(-zakres, zakres, -zakres * height / width, zakres * height / width, blisko, daleko);
  117.             else
  118.                 if (width >= height && height > 0)
  119.                     glFrustum(-zakres * width / height, zakres * width / height, -zakres, zakres, blisko, daleko);
  120.         }
  121.         else
  122.             glFrustum(-zakres, zakres, -zakres, zakres, blisko, daleko);
  123.     }
  124.     if (rzut == PERSP)
  125.     {
  126.         if (height > 0)
  127.             aspect = width / (GLdouble)height;
  128.         gluPerspective(fovy, aspect, blisko, daleko);
  129.     }
  130.     Display();
  131. }
  132.  
  133.  
  134. void Funkcja_klawiatury(unsigned char key, int x, int y) {
  135.     if (key == 'l') {
  136.         xx = 0;
  137.         yx = 1;
  138.         zx = 0;
  139.         obrot_x = obrot_x + 5;
  140.     }
  141.     if (key == 'j') {
  142.         xx = 0;
  143.         yx = 1;
  144.         zx = 0;
  145.         obrot_x = obrot_x - 5;
  146.     }
  147.     if (key == 'i') {
  148.         xy = 1;
  149.         yy = 0;
  150.         zy = 0;
  151.         obrot_y = obrot_y + 5;
  152.     }
  153.     if (key == 'k') {
  154.         xy = 1;
  155.         yy = 0;
  156.         zy = 0;
  157.         obrot_y = obrot_y - 5;
  158.     }
  159.     if (key == '+') {
  160.         if (fovy < 180) {
  161.             fovy++;
  162.         }
  163.     }
  164.     if (key == '-') {
  165.         if (fovy > 0) {
  166.             fovy--;
  167.         }
  168.     }
  169.     if (key == 'o') {
  170.         eyez += 0.1;
  171.     }
  172.     if (key == 'p') {
  173.         eyez -= 0.1;
  174.     }
  175.     if (key =='w'){
  176.         vecy += 0.1;
  177.     }
  178.     if (key == 's') {
  179.         vecy -= 0.1;
  180.     }
  181.     if (key == 'd'){
  182.         vecx += 0.1;
  183.     }
  184.     if (key == 'a') {
  185.         vecx -= 0.1;
  186.     }
  187.     if (key == 'e'){
  188.         vecz += 0.1;
  189.     }
  190.     if (key == 'q') {
  191.         vecz -= 0.1;
  192.     }
  193.     Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  194. }
  195.  
  196. void SpecialKeys(int key, int x, int y)
  197. {
  198.     if (key == GLUT_KEY_UP) {
  199.         eyey -= 0.1;
  200.     }
  201.     if (key == GLUT_KEY_DOWN) {
  202.         eyey += 0.1;
  203.     }
  204.     if (key == GLUT_KEY_LEFT) {
  205.         eyex += 0.1;
  206.     }
  207.     if (key == GLUT_KEY_RIGHT) {
  208.         eyex -= 0.1;
  209.     }
  210.     Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  211. }
  212. void Menu(int value) {
  213.     switch (value)
  214.     {
  215.     case CALE_OKNO:
  216.         skala = CALE_OKNO;
  217.         Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  218.         break;
  219.     case SKALA_1_1:
  220.         skala = SKALA_1_1;
  221.         Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  222.         break;
  223.     case ORTO:
  224.         rzut = ORTO;
  225.         Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  226.         break;
  227.     case FRUST:
  228.         rzut = FRUST;
  229.         Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  230.         break;
  231.     case PERSP:
  232.         rzut = PERSP;
  233.         Przeksztalc(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
  234.         break;
  235.     case EXIT:
  236.         exit(0);
  237.         break;
  238.     }
  239. }
  240.  
  241. void stworzMenu(void) {
  242.     submenu_id1 = glutCreateMenu(Menu);
  243.     glutAddMenuEntry("Rodzaj skalowania - cale okno", CALE_OKNO);
  244.     glutAddMenuEntry("Rodzaj skalowania - skala 1:1", SKALA_1_1);
  245.     submenu_id2 = glutCreateMenu(Menu);
  246.     glutAddMenuEntry("Rzutowanie ortogonalne", ORTO);
  247.     glutAddMenuEntry("Rzutowanie frustum", FRUST);
  248.     glutAddMenuEntry("Rzutowanie perspective", PERSP);
  249.     menu_id = glutCreateMenu(Menu);
  250.     glutAddSubMenu("Skalowanie", submenu_id1);
  251.     glutAddSubMenu("Rzutowanie", submenu_id2);
  252.     glutAddMenuEntry("Wyjscie", EXIT);
  253.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  254.  
  255. }
  256.  
  257. int main(int argc, char* argv[])
  258. {
  259.     // Klawisz '+' zwięszanie kąta perspektwy w widoku perspective
  260.     // Klawisz '-' zmniejszanie kąta perspektwy w widoku perspective
  261.  
  262.     // Klawisz 'p' przybliżenie obiektu do kamery
  263.     // Klawisz 'o' oddalenie obiektu do kamery
  264.  
  265.     // Klawisz 'i' obracanie obiektu w góre;
  266.     // Klawisz 'k' obracanie obiektu w dół;
  267.     // Klawisz 'j' obracanie obiektu w lewo;
  268.     // Klawisz 'l' obracanie obiektu w prawo;
  269.  
  270.     // Klawisze strzałek odpowiednio przesuwają obiekt od kamery
  271.  
  272.     // Klawisz 'w' zwiekszenie wartosci wektora przesunięcia X;
  273.     // Klawisz 's' zmniejszenie wartosci wektora przesunięcia X;
  274.     // Klawisz 'd' zwiekszenie wartosci wektora przesunięcia Y;
  275.     // Klawisz 'a' zmniejszenie wartosci wektora przesunięcia Y;
  276.     // Klawisz 'e' zwiekszenie wartosci wektora przesunięcia Z;
  277.     // Klawisz 'q' zmniejszenie wartosci wektora przesunięcia Z;
  278.  
  279.     glutInit(&argc, argv);
  280.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  281.     glutInitWindowSize(800, 450);
  282.     glutCreateWindow("Zadanie nr 2 - Rzutowanie");
  283.     glutDisplayFunc(Display);
  284.     glutReshapeFunc(Przeksztalc);
  285.     glutKeyboardFunc(Funkcja_klawiatury);
  286.     glutSpecialFunc(SpecialKeys);
  287.     stworzMenu();
  288.     glutMainLoop();
  289.     return 0;
  290. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement