Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <gl\gl.h>
  5. #include <gl\glut.h>
  6.  
  7. //Wymiary okna
  8. int screen_width=1024;
  9. int screen_height=768;
  10.  
  11. //Mysz
  12. int pozycjaMyszyX;
  13. int pozycjaMyszyY;
  14.  
  15. //Kamera
  16. double kameraX;
  17. double kameraZ;
  18. double kameraPredkosc;
  19.  
  20. double kameraKat;
  21. double kameraPredkoscObrotu;
  22.  
  23. GLfloat y[4], xx[4], zz[4];     //Tablice z punktami oczek siatki prostokatnej
  24. GLfloat x,z;                    //Zmienne x,z
  25. GLfloat k = 0.1;                //Zmienna symulujaca ruch obiektu
  26. GLfloat rotatex = 0.0, rotatey = 0.0, rotatez = 0.0;      //Zmienne rotacji OX OY OZ
  27. GLfloat scx = 0.1, scz = 0.1;    //Zmienne skalowania oczek siatki prostokatnej
  28. GLfloat vnorm[3], points[3][3];  //Tablice tworzace wektor normalny
  29. int fill = 1, animation = 0, light = 1, normalize = 1;   //Zmienne wlaczajace odpowiednie opcje: Wypelnij, Animacje, Światlo, Obliczanie Wekt. Norm.
  30.  
  31. enum{EXIT,FILL_OFF,FILL_ON,ANIM_OFF,ANIM_ON,LIGHT_OFF,LIGHT_ON,VNORM_OFF ,VNORM_ON}; //Stale obslugi menu
  32.  
  33. /**********************************************************/
  34. void Menu( int value)
  35. {
  36.  
  37. switch (value)
  38.  {
  39.   case FILL_OFF:            //Wypelnianie
  40.       fill = 0;break;    
  41.   case FILL_ON:
  42.       fill = 1;break;
  43.   case ANIM_OFF:            //Animacja
  44.        animation = 0;
  45.        break;
  46.   case ANIM_ON:
  47.        animation = 1;
  48.        break;    
  49.   case LIGHT_OFF:           //Światlo
  50.        light = 0;
  51.        break;
  52.   case LIGHT_ON:
  53.        light = 1;
  54.        break;
  55.   case VNORM_OFF:           //Wektor Normalny
  56.        normalize = 0;
  57.        break;
  58.   case VNORM_ON:
  59.        normalize = 1;
  60.        break;                
  61.   case EXIT:                 //EXIT
  62.      exit(0);      
  63.   }    
  64. }
  65. /**********************************************************/
  66. void resetKamery(){
  67.  
  68.     kameraX = 0;
  69.     kameraZ = 0;
  70.     kameraPredkosc = 0;
  71.     kameraKat = 0;
  72.     kameraPredkoscObrotu = 0;
  73.  
  74. }
  75. /**********************************************************/
  76. void mysz (int button, int state, int x, int y)
  77. {
  78. switch (state)
  79.     {
  80.         case GLUT_UP:
  81.             kameraPredkosc = 0;
  82.             kameraPredkoscObrotu = 0;
  83.         break;
  84.         case GLUT_DOWN:
  85.             pozycjaMyszyX = x;
  86.             pozycjaMyszyY = y;
  87.         break;
  88.  
  89.     }
  90. }
  91. /**********************************************************/
  92. void mysz_ruch (int x, int y)
  93. {
  94.     kameraPredkoscObrotu = -(pozycjaMyszyX - x) * 0.00001;
  95.     kameraPredkosc = (pozycjaMyszyY - y) * 0.001;
  96. }
  97. /**********************************************************/
  98. void klawisz (GLubyte key, int x, int y)
  99. {
  100.    switch (key) {
  101.  
  102.    case 27:    /* Esc - koniec */
  103.       exit(1);
  104.       break;
  105.    case ' ':    
  106.       glutFullScreen();        //FullScreen
  107.       break;
  108.    case 'q':                   //Rotacja OX
  109.       rotatex++;
  110.       break;
  111.    case 'w':    
  112.       rotatex--;
  113.       break;
  114.    case 'a':                   //Rotacja OY
  115.       rotatey++;
  116.       break;
  117.    case 's':    
  118.       rotatey--;
  119.       break;
  120.    case 'z':                   //Rotacja OZ
  121.       rotatez++;
  122.       break;
  123.    case 'x':    
  124.       rotatez--;
  125.       break;
  126.    case '-':                   //Skalowanie oczek siatki
  127.         if( scx < 4.9 || scz < 3.7 )        //Oczko siatki nie może być za duże
  128.         {
  129.             scx += 0.08;
  130.             scz += 0.06;
  131.         }
  132.         else
  133.         {
  134.             scx = 4.97;
  135.             scz = 3.75;
  136.         }
  137.       break;
  138.    case '+':
  139.         if( scx > 0.17 || scz > 0.15 )      //Oczko siatki nie może być za małe
  140.         {    
  141.             scx -= 0.08;
  142.             scz -= 0.06;
  143.         }
  144.         else
  145.         {
  146.             scx = 0.1;
  147.             scz = 0.1;
  148.         }
  149.       break;
  150.    }    
  151. }
  152. /**********************************************************/
  153. void rozmiar (int width, int height)
  154. {
  155.     screen_width=width;
  156.     screen_height=height;
  157.  
  158.     glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  159.     glViewport(0,0,screen_width,screen_height);
  160.     glMatrixMode(GL_PROJECTION);
  161.     glLoadIdentity();
  162.     gluPerspective(45.0f,(GLfloat)screen_width/(GLfloat)screen_height,1.0f,1000.0f);
  163.     glutPostRedisplay (); // Przerysowanie sceny
  164. }
  165. /**********************************************************/
  166. // Funkcja normalizująca wektor podany jako zbiór trzech współrzędnych
  167. void ReduceToUnit(float vector[3])
  168. {
  169.      float length;
  170.      // Oblicz długość wektora
  171.      length= (float)sqrt( (vector[0]*vector[0]) + (vector[1]*vector[1]) + (vector[2]*vector[2]));
  172.      if(length== 0.0f)
  173.          length= 1.0f;   // Zabezpieczenie przed podziałem przez 0
  174.  
  175.      // Podziel każdą ze współrzędnych przez długość wektora
  176.      vector[0] /= length;
  177.      vector[1] /= length;
  178.      vector[2] /= length;
  179. }
  180. /**********************************************************/
  181. // Punkty p1, p2 i p3 zdefiniowane w odwrotnym do wskazówek zegara porządku
  182. void calcNormal(float v[3][3], float out[3])
  183. {
  184.      float v1[3],v2[3]; static const int x = 0; static const int y = 1; static const int z = 2;
  185.      // Oblicz 2 wektory na podstawie trzech punktów
  186.      v1[x] = v[0][x] -v[1][x];
  187.      v1[y] = v[0][y] -v[1][y];
  188.      v1[z] = v[0][z] -v[1][z];
  189.      v2[x] = v[1][x] -v[2][x];
  190.      v2[y] = v[1][y] -v[2][y];
  191.      v2[z] = v[1][z] -v[2][z];
  192.      // Oblicz współrzędne wektora normalnego na podstawie iloczynu wektorowego
  193.      out[x] = v1[y]*v2[z] -v1[z]*v2[y];
  194.      out[y] = v1[z]*v2[x] -v1[x]*v2[z];
  195.      out[z] = v1[x]*v2[y] -v1[y]*v2[x];
  196.      // Normalizuj wektor
  197.      ReduceToUnit(out);
  198. }
  199. /**********************************************************/
  200. void createTab( float a[], float b[], float c[], float wyj[3][3] )
  201. {  
  202.                   wyj[0][0] = a[0];
  203.                   wyj[0][1] = b[0];
  204.                   wyj[0][2] = c[0];
  205.                   wyj[1][0] = a[1];
  206.                   wyj[1][1] = b[1];
  207.                   wyj[1][2] = c[1];
  208.                   wyj[2][0] = a[2];
  209.                   wyj[2][1] = b[2];
  210.                   wyj[2][2] = c[2];  
  211. }
  212. /**********************************************************
  213.         Glowna metoda rysujaca
  214.  *********************************************************/
  215. void rysuj(void)
  216. {      
  217.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Kasowanie ekranu
  218.     glMatrixMode(GL_MODELVIEW);
  219.     glLoadIdentity();
  220.  
  221.     kameraKat+=kameraPredkoscObrotu;       
  222.     kameraX+=kameraPredkosc*sin(kameraKat);
  223.     kameraZ-=kameraPredkosc*cos(kameraKat);
  224.     gluLookAt (kameraX,0,kameraZ,kameraX + 100*sin(kameraKat),0,kameraZ - 100*cos(kameraKat),0,1,0); // kamera
  225.  
  226.     glEnable(GL_COLOR_MATERIAL);
  227.     glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  228.     glEnable(GL_LIGHTING);
  229.  
  230.     //Ustawienie Swiatla
  231.     GLfloat  ambientLight[4] = {1.0,0.0,0.0,1};;
  232.     GLfloat  diffuseLight[4] = {1,1,1,1};;
  233.     GLfloat  specular[4] = {0.1,0.1,0.1,1};;
  234.     GLfloat  lightPos[4] = {4,20,0,1};;
  235.  
  236.     glLightfv(GL_LIGHT1,GL_AMBIENT,ambientLight);
  237.     glLightfv(GL_LIGHT1,GL_DIFFUSE,diffuseLight);
  238.     glLightfv(GL_LIGHT1,GL_SPECULAR,specular);
  239.     glLightfv(GL_LIGHT1,GL_POSITION,lightPos);
  240.  
  241.     //Wlacz - Wylacz Swiatlo
  242.     switch( light )
  243.     {
  244.     case 1:
  245.          glEnable(GL_LIGHT1);
  246.          break;
  247.     case 0:
  248.          glDisable(GL_LIGHT1);
  249.          break;
  250.     }
  251.  
  252.     //Ustawienie sceny
  253.     glTranslatef(0.0,0.0,-20); // przesuniecie obiektu przed kamerŕ
  254.     glRotatef(-60,1.0,0.0,0.0);
  255.  
  256.     //Rotacja sceny
  257.     glRotatef( rotatex, 1.0, 0, 0 );
  258.     glRotatef( rotatey, 0.0, 1.0, 0 );
  259.     glRotatef( rotatez, 0.0, 0, 1.0 );
  260.  
  261.     /*****************************************************/
  262.  
  263.     //Wlacz: Siatke - Wypelnienie
  264.     switch( fill )
  265.     {
  266.      case 0:
  267.             glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  268.             break;
  269.      case 1:
  270.             glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  271.             break;
  272.     }
  273.  
  274.     //Wyrysowanie obiektu
  275.     glColor3f(1,1,1);
  276.     glBegin(GL_QUADS);
  277.     for( x = -5; x <= 5; x += scx )
  278.     {
  279.          for(z = -5; z <= 5; z += scz )
  280.          {
  281.                //Pkt. X    
  282.                xx[0] = x;
  283.                xx[1] = x+scx;
  284.                xx[2] = x+scx;
  285.                xx[3] = x;
  286.  
  287.                //Pkt. Z
  288.                zz[0] = z;
  289.                zz[1] = z;
  290.                zz[2] = z+scz;
  291.                zz[3] = z+scz;
  292.  
  293.                //Pkt. Y                
  294.                y[0] = sin( ( (xx[0]*zz[0]) / 5 ) + k );
  295.                y[1] = sin( ( (xx[1]*zz[1]) / 5 ) + k );
  296.                y[2] = sin( ( (xx[2]*zz[2]) / 5 ) + k );
  297.                y[3] = sin( ( (xx[3]*zz[3]) / 5 ) + k );
  298.  
  299.                //Wlacz - Wylacz obliczanie wektorow normalnych
  300.                switch( normalize )
  301.                {
  302.                        case 1:
  303.                             createTab( xx, y, zz, points );
  304.                             calcNormal(points,vnorm);
  305.                             glNormal3f(vnorm[0], vnorm[1], vnorm[2]);
  306.                             break;
  307.                        case 0:
  308.                             glNormal3f(1, 1, 1);
  309.                             break;
  310.                }
  311.  
  312.                glVertex3f(xx[0],y[0],zz[0]);
  313.                glVertex3f(xx[1],y[1],zz[1]);
  314.                glVertex3f(xx[2],y[2],zz[2]);
  315.                glVertex3f(xx[3],y[3],zz[3]);                    
  316.          }    
  317.     }
  318.     glEnd();
  319.     glDisable(GL_COLOR_MATERIAL);
  320.     /*****************************************************/
  321.  
  322.     glFlush(); // rysowanie w buforze
  323.     glutSwapBuffers(); // Wyslanie na ekran
  324. }
  325.  
  326. void timer(int value){
  327.   //Wlacz - Wylacz Animacje
  328.   switch( animation )
  329.   {
  330.   case 1:
  331.        k += 0.1;
  332.        break;
  333.   case 0:
  334.        k = 0.0;
  335.        break;
  336.   }
  337.   glutTimerFunc(10, timer, 0);
  338. }
  339. /*****************************************************/
  340. int main(int argc, char **argv)
  341. {
  342.     // INIT - wszystkie funkcje obs-ugi okna i przetwzrzania zdarze˝ realizuje GLUT
  343.     glutInit(&argc, argv);    
  344.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  345.     glutInitWindowSize(screen_width,screen_height);
  346.     glutInitWindowPosition(0,0);
  347.     glutCreateWindow("Scena Glowna");    
  348.  
  349.     glutTimerFunc(10, timer, 0); ///def. funkcji nakazującej odczekiwać msecs (tutaj 20) milisekund przed każdym wywołaniem funkcji timer.
  350.     glutDisplayFunc(rysuj);         // def. funkcji rysujacej
  351.     glutIdleFunc(rysuj);            // def. funkcji rysujacej w czasie wolnym procesoora (w efekcie: ciagle wykonywanej)
  352.     glutReshapeFunc (rozmiar);      // def. obslugi zdarzenia resize (GLUT)
  353.  
  354.     glutKeyboardFunc (klawisz);
  355.     glutMouseFunc(mysz);        // def. obsługi zdarzenia przycisku myszy (GLUT)
  356.     glutMotionFunc(mysz_ruch); // def. obsługi zdarzenia ruchu myszy (GLUT)
  357.     resetKamery();
  358.  
  359.     //Tworzymy podmenu - MODEL
  360.     int Wypelniaj = glutCreateMenu (Menu);
  361.     glutAddMenuEntry("Wypełnianie",FILL_ON);
  362.     glutAddMenuEntry("Siatka",FILL_OFF);
  363.  
  364.     //Tworzymy podmenu - ANIMACJA
  365.     int Animacja = glutCreateMenu (Menu);
  366.     glutAddMenuEntry("Start",ANIM_ON);
  367.     glutAddMenuEntry("Stop",ANIM_OFF);
  368.  
  369.     //Tworzymy podmenu - SWIATLA
  370.     int Swiatla = glutCreateMenu (Menu);
  371.     glutAddMenuEntry("Włącz",LIGHT_ON);
  372.     glutAddMenuEntry("Wyłacz",LIGHT_OFF);
  373.  
  374.     //Tworzymy podmenu - OBLICZANIE WEKT. NORMALNYCH
  375.     int Vornm = glutCreateMenu (Menu);
  376.     glutAddMenuEntry("Włącz",VNORM_ON);
  377.     glutAddMenuEntry("Wyłacz",VNORM_OFF);
  378.  
  379.     // menu główne
  380.     glutCreateMenu (Menu);
  381.     glutAddSubMenu ("Model",Wypelniaj);
  382.     glutAddSubMenu ("Światła",Swiatla);
  383.     glutAddSubMenu ("Animacja",Animacja);
  384.     glutAddSubMenu ("Oblicz Wekt. Normalne",Vornm);
  385.     glutAddMenuEntry("Wyjście",EXIT); //dodanie pozycji do menu
  386.     glutAttachMenu(GLUT_RIGHT_BUTTON); //określenie przycisku myszki do obsługo menu
  387.  
  388.     // ustawienie renderowania
  389.     glEnable(GL_DEPTH_TEST);
  390.  
  391.     glutMainLoop();                 // start obslugi komunikatow
  392.     return(0);    
  393. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement