Advertisement
Guest User

vvv

a guest
Oct 20th, 2014
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.35 KB | None | 0 0
  1. //---------------------------------------------------------------------
  2. // Priklad cislo 18
  3. // Autor: Pavel Tisnovsky
  4. //
  5. // Vykresleni trojrozmernych objektu vytvorenych v knihovne GLUT.
  6. //---------------------------------------------------------------------
  7.  
  8. #include <math.h>
  9. #include <GL/glut.h>
  10.  
  11. float materialAmbient[]={0.3, 0.2, 0.2, 1.0}; // ambientni slozka materialu
  12. float materialDiffuse[]={0.9, 0.1, 0.1, 1.0}; // difuzni slozka materialu
  13. float materialSpecular[]={0.0, 1.0, 1.0, 0.5}; // barva odlesku
  14. float lightAmbient[]= {0.5, 0.5, 0.5, 1.0}; // ambientni slozka svetla
  15. float lightDiffuse[]= {0.9, 0.9, 0.9, 1.0}; // difuzni slozka svetla
  16. float lightSpecular[]={0.0, 0.0, 0.0, 1.0}; // barva odlesku
  17. float lightPosition[]={1.0, 1.0, 1.0, 0.0}; // definice pozice svetla
  18.  
  19. int   newX=0, newY=0, newZ=0;               // soucasna pozice, ze ktere se pocitaji rotace a posuny
  20. int   oldZ=0;                               // minula pozice, ze ktere se pocitaji posuny
  21. int   mouseX=0, mouseY=0, mouseZ=0;         // body, ve kterych se nachazi kurzor mysi
  22. int   mouseStatus=0;                        // stav tlacitek mysi
  23.  
  24. float fieldOfView=45.0;                     // zorny uhel - field of view
  25. float nearClippingPlane=0.1;                // blizsi orezavaci rovina
  26. float farClippingPlane=200.0;               // vzdalenejsi orezavaci rovina
  27. int   objectType=9;                         // typ vykreslovaneho objektu
  28.  
  29.  
  30.  
  31. //---------------------------------------------------------------------
  32. // Tato funkce provede zakladni nastaveni vykreslovani teles
  33. //---------------------------------------------------------------------
  34. void init(void)
  35. {
  36.     glClearColor(0.0, 0.0, 0.0, 0.0);       // barva pro mazani color-bufferu
  37.     glShadeModel(GL_SMOOTH);                // nastaveni Gouraudova stinovani
  38.     glClearDepth(1.0f);                     // barva pro mazani Z-bufferu
  39.     glEnable(GL_DEPTH_TEST);                // nastaveni funkce pro testovani hodnot v Z-bufferu
  40.     glDepthFunc(GL_LESS);                   // nastaveni porovnavaci funkce pro Z-buffer
  41.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// vylepseni zobrazovani pri vypoctu perspektivy
  42.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // stav vykresleni vyplnenych polygonu
  43.     glPointSize(5.0);                       // velikost vykreslovanych bodu
  44.     glLineWidth(3.0);                       // sirka vykreslovanych car
  45.     glEnable(GL_POINT_SMOOTH);              // povoleni antialiasingu bodu
  46.     glEnable(GL_LINE_SMOOTH);               // povoleni antialiasingu car
  47.     glLightfv(GL_LIGHT0,GL_AMBIENT,lightAmbient); // nastaveni parametru svetla
  48.     glLightfv(GL_LIGHT0,GL_DIFFUSE,lightDiffuse);
  49.     glLightfv(GL_LIGHT0,GL_POSITION,lightPosition);
  50.     glEnable(GL_LIGHTING);                  // povoleni osvetleni
  51.     glEnable(GL_LIGHT0);                    // zapnuti prvniho svetla
  52.     glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,materialAmbient);// nastaveni vlastnosti materialu
  53.     glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,materialDiffuse);
  54.     glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,materialSpecular);
  55.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0);
  56. }
  57.  
  58.  
  59.  
  60. //---------------------------------------------------------------------
  61. // Nastaveni souradneho systemu v zavislosti na velikosti okna
  62. //---------------------------------------------------------------------
  63. void onResize(int w, int h)
  64. {
  65.     glViewport(0, 0, w, h);                 // viditelna oblast
  66.     glMatrixMode(GL_PROJECTION);            // zmena projekcni matice
  67.     glLoadIdentity();                       // nastaveni perspektivni projekce
  68.     gluPerspective(fieldOfView, (double)w/(double)h, nearClippingPlane, farClippingPlane);
  69.     glMatrixMode(GL_MODELVIEW);             // zmena modelove matice
  70. }
  71.  
  72.  
  73.  
  74. //---------------------------------------------------------------------
  75. // Tato funkce je volana pri kazdem prekresleni okna
  76. //---------------------------------------------------------------------
  77. void onDisplay(void)
  78. {
  79.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // vymazani barvoveho bufferu
  80.     glMatrixMode(GL_MODELVIEW);             // bude se menit modelova matice
  81.     glLoadIdentity();                       // nahrat jednotkovou matici
  82.  
  83.     glTranslatef(0.5f, 0.0f, -10.0f);       // posun modelu dale od kamery
  84.     glTranslatef(0.0f, 0.0f, newZ);
  85.     glRotatef(newY, 1.0, 0.0, 0.0);         // rotace objektu podle pohybu kurzoru mysi
  86.     glRotatef(newX, 0.0, 1.0, 0.0);
  87.  
  88.     switch (objectType) {                   // vykresleni vybraneho objektu
  89.         case  0: glutWireCube(5);                          break;
  90.         case  1: glutWireSphere(5, 16, 16);                break;
  91.         case  2: glutWireCone(5, 5, 16, 16);               break;
  92.         case  3: glutWireTorus(2, 5, 16, 16);              break;
  93.         case  4: glScalef(3,3,3); glutWireDodecahedron();  break;
  94.         case  5: glScalef(3,3,3); glutWireOctahedron();    break;
  95.         case  6: glScalef(3,3,3); glutWireTetrahedron();   break;
  96.         case  7: glScalef(3,3,3); glutWireIcosahedron();   break;
  97.         case  8: glutWireTeapot(5);                        break;
  98.         case  9: glutSolidCube(5);                         break;
  99.         case 10: glutSolidSphere(5,16,16);                 break;
  100.         case 11: glutSolidCone(5,5,16,16);                 break;
  101.         case 12: glutSolidTorus(2,5,16,16);                break;
  102.         case 13: glScalef(3,3,3); glutSolidDodecahedron(); break;
  103.         case 14: glScalef(3,3,3); glutSolidOctahedron();   break;
  104.         case 15: glScalef(3,3,3); glutSolidTetrahedron();  break;
  105.         case 16: glScalef(3,3,3); glutSolidIcosahedron();  break;
  106.         case 17: glutSolidTeapot(5);                       break;
  107.     }
  108.  
  109.     glFlush();                              // provedeni vsech prikazu
  110.     glutSwapBuffers();                      // a prohozeni bufferu
  111. }
  112.  
  113.  
  114.  
  115. //---------------------------------------------------------------------
  116. // Tato funkce je volana pri stlaceni ASCII klavesy
  117. //---------------------------------------------------------------------
  118. void onKeyboard(unsigned char key, int x, int y)
  119. {
  120.     key=(key>'A' && key<='Z') ? key+'a'-'A':key; // prevod na mala pismena
  121.  
  122.     switch (key) {                          // rozeskok podle stlacene klavesy
  123.         case 27:                            // klaapvesa Esce
  124.             exit(0);                        // ukonceni programu
  125.             break;
  126.         case 'f':
  127.             glutFullScreen();               // prepnuti na celou obrazovku
  128.             break;
  129.         case 'w':
  130.             glutReshapeWindow(500, 500);    // prepnuti zpet do okna
  131.             glutPositionWindow(50, 50);
  132.             break;
  133.         default:
  134.             break;
  135.     }
  136. }
  137.  
  138.  
  139.  
  140. //---------------------------------------------------------------------
  141. // Tato funkce je volana pri zmene stavu tlacitek mysi
  142. //---------------------------------------------------------------------
  143. void onMouseClick(int button, int state, int x, int y)
  144. {
  145.     if (button==GLUT_RIGHT_BUTTON) {        // prave tlacitko aktivuje posun od pozorovatele
  146.         if (state==GLUT_DOWN) {             // pri stlaceni
  147.             mouseStatus=1;                  // nastaveni pro funkci motion
  148.             mouseZ=y;                       // zapamatovat pozici kurzoru mysi
  149.         }
  150.         else {
  151.             mouseStatus=0;
  152.             oldZ=newZ;                      // zapamatovat novy pocatek
  153.         }
  154.     }
  155.     glutPostRedisplay();                    // prekresleni sceny
  156. }
  157.  
  158.  
  159.  
  160. //---------------------------------------------------------------------
  161. // Tato funkce je volana pri posunu mysi se stlacenym tlacitkem
  162. //---------------------------------------------------------------------
  163. void onMouseDrag(int x, int y)
  164. {
  165.     if (mouseStatus==1) {                   // provadi se presun
  166.         newZ=oldZ+y-mouseZ;                 // vypocitat novou pozici
  167.         glutPostRedisplay();                // a prekreslit scenu
  168.     }
  169. }
  170.  
  171.  
  172.  
  173. //---------------------------------------------------------------------
  174. // Tato funkce je volana pri posunu mysi bez stlaceneho tlacitka
  175. //---------------------------------------------------------------------
  176. void onMouseMove(int x, int y)
  177. {
  178.     newX=x;                                 // zapamatovat si pozici kurzoru
  179.     newY=y;                                 // pro otaceni
  180.     glutPostRedisplay();                    // prekreslit scenu
  181. }
  182.  
  183.  
  184.  
  185. //---------------------------------------------------------------------
  186. // Tato funkce je zavolana pri vyberu polozky z menu
  187. //---------------------------------------------------------------------
  188. void onCommand(int command)
  189. {
  190.     if (command<18)                         // byla vybrana polozka s nazvem objektu
  191.         objectType=command;
  192.  
  193.     switch (command) {
  194.         case 18:                            // zobrazovat se budou pouze vrcholy polygonu
  195.             glPolygonMode(GL_FRONT,GL_POINT);
  196.             glPolygonMode(GL_BACK,GL_POINT);
  197.             break;
  198.         case 19:                            // zobrazovat se budou pouze hrany polygonu
  199.             glPolygonMode(GL_FRONT,GL_LINE);
  200.             glPolygonMode(GL_BACK,GL_LINE);
  201.             break;
  202.         case 20:                            // zobrazovat se budou vyplnene polygony
  203.             glPolygonMode(GL_FRONT,GL_FILL);
  204.             glPolygonMode(GL_BACK,GL_FILL);
  205.             break;
  206.         case 21:                            // ukonceni aplikace
  207.             exit(0);
  208.         default:
  209.             break;
  210.     }
  211.  
  212.     glutPostRedisplay();                    // prekreslit scenu
  213. }
  214.  
  215.  
  216.  
  217. //---------------------------------------------------------------------
  218. // Tato funkce vytvori menu a navaze ho na leve tlacitko mysi
  219. //---------------------------------------------------------------------
  220. void createMenu(void)
  221. {
  222.     int i, j, k, l;
  223.     i=glutCreateMenu(onCommand);            // vytvoreni submenu a registrace callback funkce
  224.     glutAddMenuEntry("Wireframe cube",         0);
  225.     glutAddMenuEntry("Wireframe sphere",       1);
  226.     glutAddMenuEntry("Wireframe cone",         2);
  227.     glutAddMenuEntry("Wireframe torus",        3);
  228.     glutAddMenuEntry("Wireframe dodecahedron", 4);
  229.     glutAddMenuEntry("Wireframe octahedron",   5);
  230.     glutAddMenuEntry("Wireframe tetrahedron",  6);
  231.     glutAddMenuEntry("Wireframe icosahedron",  7);
  232.     glutAddMenuEntry("Wireframe teapot",       8);
  233.     j=glutCreateMenu(onCommand);            // vytvoreni submenu a registrace callback funkce
  234.     glutAddMenuEntry("Solid cube",             9);
  235.     glutAddMenuEntry("Solid sphere",          10);
  236.     glutAddMenuEntry("Solid cone",            11);
  237.     glutAddMenuEntry("Solid torus",           12);
  238.     glutAddMenuEntry("Solid dodecahedron",    13);
  239.     glutAddMenuEntry("Solid octahedron",      14);
  240.     glutAddMenuEntry("Solid tetrahedron",     15);
  241.     glutAddMenuEntry("Solid icosahedron",     16);
  242.     glutAddMenuEntry("Solid teapot",          17);
  243.     k=glutCreateMenu(onCommand);            // vytvoreni submenu a registrace callback funkce
  244.     glutAddMenuEntry("Points",                18);
  245.     glutAddMenuEntry("Lines",                 19);
  246.     glutAddMenuEntry("Fill",                  20);
  247.     l=glutCreateMenu(onCommand);            // vytvoreni submenu a registrace callback funkce
  248.     glutAddMenuEntry("Yes",                   21);
  249.     glutAddMenuEntry("No",                    22);
  250.     glutCreateMenu(onCommand);              // vytvoreni menu
  251.     glutAddSubMenu("Wireframe objects", i);
  252.     glutAddSubMenu("Solid objects", j);
  253.     glutAddSubMenu("Polygon mode", k);
  254.     glutAttachMenu(GLUT_LEFT_BUTTON);
  255. }
  256.  
  257.  
  258.  
  259. //---------------------------------------------------------------------
  260. // Hlavni funkce konzolove aplikace
  261. //---------------------------------------------------------------------
  262. int main(int argc, char *argv[])
  263. {
  264.     glutInit(&argc, argv);                  // inicializace knihovny GLUT
  265.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH); // graficky mod okna
  266.     glutInitWindowSize(500, 500);           // pocatecni velikost okna
  267.     glutInitWindowPosition(10, 10);         // pocatecni pozice okna
  268.     glutCreateWindow("Priklad cislo 18");   // vytvoreni okna pro kresleni
  269.     glutReshapeWindow(500, 500);            // nastaveni velikosti okna
  270.     glutDisplayFunc(onDisplay);             // registrace funkce volane pri prekreslovani okna
  271.     glutReshapeFunc(onResize);              // registrace funkce volane pri zmene velikosti okna
  272.     glutKeyboardFunc(onKeyboard);           // registrace funkce volane pri stlaceni ASCII klavesy
  273.     glutMouseFunc(onMouseClick);            // registrace funkce volane pri stlaceni nebo pusteni tlacitka mysi
  274.     glutMotionFunc(onMouseDrag);            // registrace funkce volane pri posunu mysi se stlacenym tlacitkem
  275.     glutPassiveMotionFunc(onMouseMove);     // registrace funkce volane pri posunu mysi bez stlaceneho tlacitka
  276.     init();                                 // inicializace vykreslovani
  277.     createMenu();                           // vytvoreni menu s vyberem telesa
  278.     glutMainLoop();                         // nekonecna smycka, kde se volaji zaregistrovane funkce
  279.     return 0;                               // navratova hodnota vracena operacnimu systemu
  280. }
  281.  
  282.  
  283.  
  284. //---------------------------------------------------------------------
  285. // Konec zdrojoveho souboru
  286. //---------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement