Facebook
From Bulky Bushbaby, 9 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 578
  1. /*
  2.         gcc -o robot.exe -Wall robot.c glut32.lib -lopengl32 -lglu32
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <GL/gl.h>
  7. #include <GL/glut.h>
  8. #include <time.h>
  9. #include <windows.h>
  10.  
  11. #define UP 0
  12. #define DOWN 1
  13. /* Wskazniki do wykorzystywanych kwadryk */
  14. GLUquadricObj *podstawaSciany;
  15. GLUquadricObj *podstawaDyskG;
  16.  
  17. GLfloat zoom                    = -7.0;
  18. GLfloat rotObsY                 =  25.0;
  19. GLfloat rotObsX                 =  20.0;
  20.  
  21. int i,j,k;
  22. float czas=0.0;
  23. int przycisk = 0.0;
  24. float katGlownejOsi = 0.0;
  25. float katPobocznychOsi = 0.0;
  26. float odlegloscOdSrodka = 1.0;
  27. float distance = 0;
  28. int direction = 0;
  29. int pomocnicze = -1;
  30. float color1R = 0.0;
  31. float color1G = 0.0;
  32. float color1B = 0.0;
  33. float color2R = 0.0;
  34. float color2G = 0.0;
  35. float color2B = 0.0;
  36. float color3R = 0.0;
  37. float color3G = 0.0;
  38. float color3B = 0.0;
  39. int changedColor = 0;
  40.  
  41. /* Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki */
  42. void InicjujRamieRobota(void)
  43. {
  44.         /* Zainicjowanie scian bocznych walca bedacego podstawa ramienia */
  45.         podstawaSciany = gluNewQuadric();
  46.         gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
  47.        
  48.         // Zainicjowanie gornej podstawy walca
  49.         podstawaDyskG = gluNewQuadric();
  50.         gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
  51. }
  52.  
  53.  
  54. /*      Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
  55.         Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1 */
  56. void RysujRamieRobota()
  57. {
  58. glEnable(GL_DEPTH_TEST);
  59. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  60. glMatrixMode(GL_MODELVIEW);
  61. czas = 0.5;
  62.  
  63. if(pomocnicze == 1)
  64. {
  65.         glBegin(GL_LINES);
  66.        
  67.         glColor3f(1.0, 0.0, 0.0);               // Os X
  68.         glVertex3f(-30.0, 0.0, 0.0);
  69.         glVertex3f(30.0, 0.0, 0.0);
  70.        
  71.         glColor3f(0.0,1.0,0.0);                 // Os Y
  72.         glVertex3f(0.0, -5.0, 0.0);
  73.         glVertex3f(0.0, 30.0, 0.0);
  74.        
  75.         glColor3f(0.0,0.0,1.0);                 // Os Z
  76.         glVertex3f(0.0, 0.0, -30.0);
  77.         glVertex3f(0.0, 0.0, 30.0);
  78.        
  79.         glEnd();
  80. }
  81.  
  82.         glColor3f(0.3,0.3,1.0);
  83.         glTranslatef(0.0,0.0,0.0);
  84.         switch(przycisk)
  85.         {
  86.                 case 0:
  87.                         glRotatef(katGlownejOsi,0,1,0);
  88.                         for(i=-1;i<2;i++)
  89.                         {
  90.                                 for(j=-1;j<2;j++)
  91.                                 {
  92.                                         for(k=-1;k<2;k++)
  93.                                         {
  94.                                                 glPushMatrix();
  95.                                                 glTranslatef(i,j,k);
  96.                                                 switch(i)
  97.                                                 {
  98.                                                         case -1: glTranslatef(distance, 0, 0); break;
  99.                                                         case 0: glTranslatef(0, 0, 0); break;
  100.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  101.                                                 }
  102.                                                 switch(j)
  103.                                                 {
  104.                                                         case -1: glTranslatef(0, distance, 0); break;
  105.                                                         case 0: glTranslatef(0, 0, 0); break;
  106.                                                         case 1: glTranslatef(0, -distance, 0); break;
  107.                                                 }
  108.                                                 switch(k)
  109.                                                 {
  110.                                                         case -1: glTranslatef(0, 0, distance); break;
  111.                                                         case 0: glTranslatef(0, 0, 0); break;
  112.                                                         case 1: glTranslatef(0, 0, -distance); break;
  113.                                                 }
  114.                                                 if(changedColor==1)
  115.                                                 {
  116.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  117.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  118.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  119.                                                 }
  120.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  121.                                                 glutSolidCube(0.55);
  122.                                                 glPopMatrix();
  123.                                                 glColor3f(0.3,0.3,1.0);
  124.                                         }
  125.                                 }
  126.                         }
  127.                         break;
  128.                 /* Obracanie wzgledem osi srodkowej */
  129.                 case 1:
  130.                         katGlownejOsi += -0.05;
  131.                        
  132.                         glRotatef(katGlownejOsi,0,1,0);
  133.                         for(i=-1;i<2;i++)
  134.                         {
  135.                                 for(j=-1;j<2;j++)
  136.                                 {
  137.                                         for(k=-1;k<2;k++)
  138.                                         {
  139.                                                 glPushMatrix();
  140.                                                 glTranslatef(i,j,k);
  141.                                                 switch(i)
  142.                                                 {
  143.                                                         case -1: glTranslatef(distance, 0, 0); break;
  144.                                                         case 0: glTranslatef(0, 0, 0); break;
  145.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  146.                                                 }
  147.                                                 switch(j)
  148.                                                 {
  149.                                                         case -1: glTranslatef(0, distance, 0); break;
  150.                                                         case 0: glTranslatef(0, 0, 0); break;
  151.                                                         case 1: glTranslatef(0, -distance, 0); break;
  152.                                                 }
  153.                                                 switch(k)
  154.                                                 {
  155.                                                         case -1: glTranslatef(0, 0, distance); break;
  156.                                                         case 0: glTranslatef(0, 0, 0); break;
  157.                                                         case 1: glTranslatef(0, 0, -distance); break;
  158.                                                 }
  159.                                                 if(changedColor==1)
  160.                                                 {
  161.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  162.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  163.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  164.                                                 }
  165.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  166.                                                 glutSolidCube(0.55);
  167.                                                 glPopMatrix();
  168.                                                 glColor3f(0.3,0.3,1.0);
  169.                                         }
  170.                                 }
  171.                         }
  172.                         break;
  173.                 /* Obracanie wzgledem osi Z dla 3*3 elementow */
  174.                 case 2:
  175.                         katPobocznychOsi += 0.05;
  176.                        
  177.                         glPushMatrix();
  178.                         glRotatef(katGlownejOsi,0,1,0);
  179.                         for(i=-1;i<2;i++)
  180.                         {
  181.                                 for(j=-1;j<2;j++)
  182.                                 {
  183.                                         for(k=-1;k<2;k++)
  184.                                         {
  185.                                                 glPushMatrix();
  186.                                                 glTranslatef(i,k,j);
  187.                                                 if(changedColor==1)
  188.                                                 {
  189.                                                         if(i==-1 && k==1 && j==-1) glColor3f(color1R, color1G, color1B);
  190.                                                         if(i==0 && k==1 && j==0) glColor3f(color2R, color2G, color2B);
  191.                                                         if(i==1 && k==1 && j==1) glColor3f(color3R, color3G, color3B);
  192.                                                 }
  193.                                                 switch(i)
  194.                                                 {
  195.                                                         case -1: glTranslatef(distance, 0, 0); break;
  196.                                                         case 0: glTranslatef(0, 0, 0); break;
  197.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  198.                                                 }
  199.                                                 switch(j)
  200.                                                 {
  201.                                                         case -1: glTranslatef(0, 0, distance); break;
  202.                                                         case 0: glTranslatef(0, 0, 0); break;
  203.                                                         case 1: glTranslatef(0, 0, -distance); break;
  204.                                                 }
  205.                                                 switch(k)
  206.                                                 {
  207.                                                         case -1: glTranslatef(0, distance, 0); break;
  208.                                                         case 0: glTranslatef(0, 0, 0); break;
  209.                                                         case 1: glTranslatef(0, -distance, 0); break;
  210.                                                 }
  211.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  212.                                                 glutSolidCube(0.55);
  213.                                                 glPopMatrix();
  214.                                                 glColor3f(0.3,0.3,1.0);
  215.                                         }
  216.                                 }
  217.                         }
  218.                         glPopMatrix();
  219.                         break;
  220.                 /* Rozciaganie od srodka */
  221.                 case 3:
  222.                         if(distance >= 0.2f) direction = UP;
  223.                         if(distance <= -0.2f) direction = DOWN;
  224.                         if(direction == UP) { distance -= 0.0004f; }
  225.                         else { distance += 0.0004f; }
  226.                        
  227.                         glRotatef(katGlownejOsi,0,1,0);
  228.                         for(i=-1;i<2;i++)
  229.                         {
  230.                                 for(j=-1;j<2;j++)
  231.                                 {
  232.                                         for(k=-1;k<2;k++)
  233.                                         {
  234.                                                 glPushMatrix();
  235.                                                 glTranslatef(i,j,k);
  236.                                                 switch(i)
  237.                                                 {
  238.                                                         case -1: glTranslatef(distance, 0, 0); break;
  239.                                                         case 0: glTranslatef(0, 0, 0); break;
  240.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  241.                                                 }
  242.                                                 switch(j)
  243.                                                 {
  244.                                                         case -1: glTranslatef(0, distance, 0); break;
  245.                                                         case 0: glTranslatef(0, 0, 0); break;
  246.                                                         case 1: glTranslatef(0, -distance, 0); break;
  247.                                                 }
  248.                                                 switch(k)
  249.                                                 {
  250.                                                         case -1: glTranslatef(0, 0, distance); break;
  251.                                                         case 0: glTranslatef(0, 0, 0); break;
  252.                                                         case 1: glTranslatef(0, 0, -distance); break;
  253.                                                 }
  254.                                                 if(changedColor==1)
  255.                                                 {
  256.                                                         if(i==-1 && j==1 && k==-1) glColor3f(color1R, color1G, color1B);
  257.                                                         if(i==0 && j==1 && k==0) glColor3f(color2R, color2G, color2B);
  258.                                                         if(i==1 && j==1 && k==1) glColor3f(color3R, color3G, color3B);
  259.                                                 }
  260.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  261.                                                 glutSolidCube(0.55);
  262.                                                 glPopMatrix();
  263.                                                 glColor3f(0.3,0.3,1.0);
  264.                                         }
  265.                                 }
  266.                         }
  267.                         break;
  268.                 /* Zmiany kolorow */
  269.                 case 4:
  270.                 changedColor = 1;
  271.                         glRotatef(katGlownejOsi,0,1,0);
  272.                         for(i=-1;i<2;i++)
  273.                         {
  274.                                 for(j=-1;j<2;j++)
  275.                                 {
  276.                                         for(k=-1;k<2;k++)
  277.                                         {
  278.                                                 glPushMatrix();
  279.                                                 glTranslatef(i,j,k);
  280.                                                 switch(i)
  281.                                                 {
  282.                                                         case -1: glTranslatef(distance, 0, 0); break;
  283.                                                         case 0: glTranslatef(0, 0, 0); break;
  284.                                                         case 1: glTranslatef(-distance, 0, 0); break;
  285.                                                 }
  286.                                                 switch(j)
  287.                                                 {
  288.                                                         case -1: glTranslatef(0, distance, 0); break;
  289.                                                         case 0: glTranslatef(0, 0, 0); break;
  290.                                                         case 1: glTranslatef(0, -distance, 0); break;
  291.                                                 }
  292.                                                 switch(k)
  293.                                                 {
  294.                                                         case -1: glTranslatef(0, 0, distance); break;
  295.                                                         case 0: glTranslatef(0, 0, 0); break;
  296.                                                         case 1: glTranslatef(0, 0, -distance); break;
  297.                                                 }
  298.                                                 if(i==-1 && j==1 && k==-1) glColor3f(color1R+=0.0001f, color1G+=0.0003f, color1B+=0.0006f);
  299.                                                 if(i==0 && j==1 && k==0) glColor3f(color2R+=0.0006f, color2G+=0.0001f, color2B+=0.0003f);
  300.                                                 if(i==1 && j==1 && k==1) glColor3f(color3R+=0.0003f, color3G+=0.0006f, color3B+=0.0001f);
  301.                                                 glRotatef(-katPobocznychOsi,0,1,0);
  302.                                                 glutSolidCube(0.55);
  303.                                                 glPopMatrix();
  304.                                                 glColor3f(0.3,0.3,1.0);
  305.                                         }
  306.                                 }
  307.                         }
  308.                         break;
  309.         }
  310.  
  311. /* Sprzatamy */
  312.         glPopMatrix();
  313. }
  314.  
  315. /* Funkcja generujaca pojedyncza klatke animacji */
  316. void WyswietlObraz(void)
  317. {
  318.         /* Wyczyszczenie bufora ramki i bufora glebokosci */
  319.         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  320.        
  321.         /* Powielenie macierzy na wierzcholku stosu */
  322.         glPushMatrix();
  323.        
  324.         /* Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych, sceny do ukladu wspolrzednych obserwatora). */
  325.         glTranslatef(0, 0, zoom);
  326.         glRotatef(rotObsX, 1, 0, 0);
  327.         glRotatef(rotObsY,0,1,0);
  328.        
  329.         /* Generacja obrazu sceny w niewidocznym buforze ramki */
  330.         RysujRamieRobota();
  331.  
  332.         /* Usuniecie macierzy lezacej na  wierzcholku stosu (powrot do stanu sprzed wywolania funkcji) */
  333.         glPopMatrix();
  334.  
  335.         /* Przelaczenie buforow ramki */
  336.         glutSwapBuffers();
  337. }
  338.  
  339. /* Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu */
  340. void UstawParametryWidoku(int szerokosc, int wysokosc)
  341. {
  342.         /* Ustawienie parametrow viewportu */
  343.         glViewport(0, 0, szerokosc, wysokosc);
  344.  
  345.         /* Przejscie w tryb modyfikacji macierzy rzutowania */
  346.         glShadeModel(GL_SMOOTH);
  347.         glClearColor(0, 0, 0, 0);
  348.        
  349.         glMatrixMode(GL_PROJECTION);
  350.         glLoadIdentity();
  351.         gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
  352.  
  353.         /* Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych */
  354.         glMatrixMode(GL_MODELVIEW);
  355.  
  356.         /* Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa */
  357.         glLoadIdentity();
  358. }
  359.  
  360. /* Funkcja klawiszy specjalnych */
  361. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  362. {
  363.         switch(klawisz)
  364.                 {
  365.                 case GLUT_KEY_UP:
  366.                         //rotObsX = (rotObsX < 90.0) ? rotObsX + 1.0 : rotObsX;
  367.                         rotObsX = rotObsX + 2.0;
  368.                         break;
  369.  
  370.                 case GLUT_KEY_DOWN:
  371.                         //rotObsX = (rotObsX > 0.0) ? rotObsX - 1.0 : rotObsX;
  372.                         rotObsX = rotObsX - 2.0;
  373.                         break;
  374.  
  375.                 case GLUT_KEY_LEFT:
  376.                         //rotObsY = (rotObsY > -180.0) ? rotObsY - 1.0 : rotObsY;
  377.                         rotObsY = rotObsY - 2.0;
  378.                         break;
  379.  
  380.                 case GLUT_KEY_RIGHT:
  381.                         //rotObsY = (rotObsY < 180.0) ? rotObsY + 1.0 : rotObsY;
  382.                         rotObsY = rotObsY + 2.0;
  383.                         break;
  384.                        
  385.                 case GLUT_KEY_PAGE_UP:
  386.                         zoom = (zoom <= -10.0) ? zoom + 5.0 : zoom;
  387.                         break;
  388.  
  389.                 case GLUT_KEY_PAGE_DOWN:
  390.                         zoom = (zoom >= -200.0) ? zoom - 5.0 : zoom;
  391.                         break;
  392.                 }
  393. }
  394.  
  395. /* Funkcja obslugi klawiatury */
  396. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  397. {
  398.        
  399.         switch(klawisz)
  400.                 {
  401.                         case '1': przycisk = 1; break;
  402.                         case '2': przycisk = 2; break;
  403.                         case '3': przycisk = 3; break;
  404.                         case '4': przycisk = 4; break;
  405.                         case '0': przycisk = 0; break;
  406.                         case 'p': pomocnicze = -pomocnicze; break;
  407.  
  408.                 }
  409.  
  410.         if(klawisz == 27)
  411.                         exit(0);
  412. }
  413.  
  414. /* Glowna funkcja programu */
  415. int  main(int argc, char **argv)
  416. {
  417.         /* Info o aplikacji */
  418.         MessageBox(0,"Tryby: 1,2,3,4\nPauza: 0\nLinie pomocnicze: p\nEsc: wyjscie\nStrzalki: obracanie obrazu\nPgUp/PgDwn: Przyblizenie/oddalenie","Info",0);
  419.        
  420.         /* Zainicjowanie biblioteki GLUT */
  421.         glutInit(&argc, argv);
  422.  
  423.         /* Ustawienie trybu wyswietlania */
  424.         glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  425.  
  426.         /* Ustawienie polozenia dolenego lewego rogu okna */
  427.         glutInitWindowPosition(100, 100);
  428.  
  429.         /* Ustawienie rozmiarow okna */
  430.         glutInitWindowSize(600, 400);
  431.  
  432.         /* Utworzenie okna */
  433.         glutCreateWindow("Cubes");
  434.  
  435.         /* Odblokowanie bufora glebokosci */
  436.         glEnable(GL_DEPTH_TEST);
  437.         glEnable(GL_LIGHTING);
  438.         glEnable(GL_LIGHT0);
  439.         glEnable(GL_COLOR_MATERIAL);
  440.  
  441.         /* Ustawienie wartosci czyszczacej zawartosc bufora glebokosci */
  442.         glClearDepth(1000.0);
  443.  
  444.         /* Ustawienie koloru czyszczenia bufora ramki */
  445.         glClearColor (0.0, 0.0, 0.0, 0.0);
  446.  
  447.         /* Zarejestrowanie funkcji (callback) wyswietlajacej */
  448.         glutDisplayFunc(WyswietlObraz);
  449.  
  450.         /* Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy zmieniane sa rozmiary okna */
  451.         glutReshapeFunc(UstawParametryWidoku);
  452.  
  453.         /* Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje zadnych zadan */
  454.         glutIdleFunc(WyswietlObraz);
  455.  
  456.         /* Zarejestrowanie funkcji obslugi klawiatury */
  457.         glutKeyboardFunc(ObslugaKlawiatury);
  458.  
  459.         /* Zarejestrowanie funkcji obslugi klawiszy specjalnych */
  460.         glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  461.  
  462.         /* Zainicjowanie kwadryk tworzacych ramie robota */
  463.         InicjujRamieRobota();
  464.  
  465.         /* Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci) */
  466.         glutMainLoop();
  467.  
  468.         return 0;
  469. }