Facebook
From Burly Hornbill, 9 Years ago, written in C.
Embed
Download Paste or View Raw
Hits: 592
  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.  
  10. /* Wskazniki do wykorzystywanych kwadryk */
  11. GLUquadricObj *podstawaSciany;
  12. GLUquadricObj *podstawaDyskG;
  13.  
  14. GLfloat zoom                    = -15.0;
  15. GLfloat rotObsY                 =  25.0;
  16. GLfloat rotObsX                 =  20.0;
  17.  
  18. /* Funkcja inicjujaca elementy skladowe ramienia robota zamodelowane jako kwadryki */
  19. void InicjujRamieRobota(void)
  20. {
  21.         /* Zainicjowanie scian bocznych walca bedacego podstawa ramienia */
  22.         podstawaSciany = gluNewQuadric();
  23.         gluQuadricDrawStyle(podstawaSciany, GLU_LINE);
  24.        
  25.         // Zainicjowanie gornej podstawy walca
  26.         podstawaDyskG = gluNewQuadric();
  27.         gluQuadricDrawStyle(podstawaDyskG, GLU_LINE);
  28. }
  29.  
  30.  
  31. /*      Funkcja rysujaca obraz sceny widzianej z biezacej pozycji obserwatora
  32.         Zalozenie: Funkcja glutWireSpehere moze ryswac tylko sfere o promieniu 1 */
  33. void RysujZegar()
  34. {
  35.         struct tm *now = NULL;
  36.         time_t time_value = 0;
  37.         time_value = time(NULL);
  38.         now = localtime(&time_value);
  39.         int hour = now->tm_hour;
  40.         if(hour>12) hour -= 12;
  41.        
  42.         int minAngle = 6 * now->tm_min;
  43.         int hourAngle = 30 * hour + (30 * ((float)minAngle / 360.0));
  44.         int secAngle = 6 * now->tm_sec;
  45.        
  46. /* Ustalamy kolor bialy */
  47.         glColor3f(1.0,1.0,1.0);
  48.  
  49. /* Rysowanie tarczy zegara */
  50.         /*glPushMatrix();
  51.         glColor4f(1.0,1.0,1.0,99.1);
  52.         gluCylinder(podstawaSciany, 2.85, 3.0, 0.4, 12.0, 1);
  53.         gluDisk(podstawaDyskG, 0.0, 2.85, 12, 1);
  54.         glPopMatrix();*/
  55.        
  56.         glPushMatrix();
  57.         glColor3f(0.95f, 0.64f, 0.37f);
  58.         glTranslatef(0,0,-3.5);
  59.         glutSolidCube(7);
  60.         glTranslatef(0,0,3.5);
  61.         glPopMatrix();
  62.        
  63.         glPushMatrix();
  64.         glColor3f(0.0f, 0.0f, 0.0f);
  65.         gluDisk(podstawaDyskG, 0.0, 2.85, 12, 1);
  66.         glPopMatrix();
  67.  
  68.         glPushMatrix();
  69.         glColor3f(1.05,0.0,0.0);
  70.         glRotatef(-hourAngle, 0, 0, 1);
  71.         glRotatef(90, 0, 0, 1);
  72.         glScalef(1.5, 0.05, 0.05);
  73.         glTranslatef(0.5, 0.0, 0.0);
  74.         glutSolidCube(1);
  75.         glPopMatrix();
  76.  
  77.         glPushMatrix();
  78.         glColor3f(0.1,1.2,0.1);
  79.         glRotatef(-minAngle, 0, 0, 1);
  80.         glRotatef(90, 0, 0, 1);
  81.         glScalef(1.9, 0.05, 0.05);
  82.         glTranslatef(0.5, 0.0, 0.0);
  83.         glutSolidCube(1);
  84.         glPopMatrix();
  85.  
  86.         glPushMatrix();
  87.         glColor3f(0.0,0.0,1.05);
  88.         glRotatef(-secAngle, 0, 0, 1);
  89.         glRotatef(90, 0, 0, 1);
  90.         glScalef(2.3, 0.05, 0.05);
  91.         glTranslatef(0.4, 0.0, 0.0);
  92.         glutSolidCube(1);
  93.         glPopMatrix();
  94.  
  95. /* Sprzatamy */
  96.         glPopMatrix();
  97. }
  98.  
  99. /* Funkcja generujaca pojedyncza klatke animacji */
  100. void WyswietlObraz(void)
  101. {
  102.         /* Wyczyszczenie bufora ramki i bufora glebokosci */
  103.         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  104.        
  105.         /* Powielenie macierzy na wierzcholku stosu */
  106.         glPushMatrix();
  107.        
  108.         /* Wyznaczenie polozenia obserwatora (przeksztalcenie uladu wspolrzednych, sceny do ukladu wspolrzednych obserwatora). */
  109.         glTranslatef(0, 0, zoom);
  110.         glRotatef(rotObsX, 1, 0, 0);
  111.         glRotatef(rotObsY,0,1,0);
  112.        
  113.         /* Generacja obrazu sceny w niewidocznym buforze ramki */
  114.         RysujZegar();
  115.  
  116.         /* Usuniecie macierzy lezacej na  wierzcholku stosu (powrot do stanu sprzed wywolania funkcji) */
  117.         glPopMatrix();
  118.  
  119.         /* Przelaczenie buforow ramki */
  120.         glutSwapBuffers();
  121. }
  122.  
  123. /* Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu */
  124. void UstawParametryWidoku(int szerokosc, int wysokosc)
  125. {
  126.         /* Ustawienie parametrow viewportu */
  127.         glViewport(0, 0, szerokosc, wysokosc);
  128.  
  129.         /* Przejscie w tryb modyfikacji macierzy rzutowania */
  130.         glMatrixMode(GL_PROJECTION);
  131.         glLoadIdentity();
  132.         gluPerspective(40.0, (float)szerokosc/(float)wysokosc, 1.0, 1000.0);
  133.  
  134.         /* Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych */
  135.         glMatrixMode(GL_MODELVIEW);
  136.  
  137.         /* Zmiana macierzy znajdujacej sie na wierzcholku stosu na macierz jednostkowa */
  138.         glLoadIdentity();
  139. }
  140.  
  141. /* Funkcja klawiszy specjalnych */
  142. void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
  143. {
  144.         switch(klawisz)
  145.                 {
  146.                 case GLUT_KEY_UP:
  147.                         //rotObsX = (rotObsX < 90.0) ? rotObsX + 1.0 : rotObsX;
  148.                         rotObsX = rotObsX + 2.0;
  149.                         break;
  150.  
  151.                 case GLUT_KEY_DOWN:
  152.                         //rotObsX = (rotObsX > 0.0) ? rotObsX - 1.0 : rotObsX;
  153.                         rotObsX = rotObsX - 2.0;
  154.                         break;
  155.  
  156.                 case GLUT_KEY_LEFT:
  157.                         //rotObsY = (rotObsY > -180.0) ? rotObsY - 1.0 : rotObsY;
  158.                         rotObsY = rotObsY - 2.0;
  159.                         break;
  160.  
  161.                 case GLUT_KEY_RIGHT:
  162.                         //rotObsY = (rotObsY < 180.0) ? rotObsY + 1.0 : rotObsY;
  163.                         rotObsY = rotObsY + 2.0;
  164.                         break;
  165.                        
  166.                 case GLUT_KEY_PAGE_UP:
  167.                         zoom = (zoom <= -10.0) ? zoom + 5.0 : zoom;
  168.                         break;
  169.  
  170.                 case GLUT_KEY_PAGE_DOWN:
  171.                         zoom = (zoom >= -200.0) ? zoom - 5.0 : zoom;
  172.                         break;
  173.                 }
  174. }
  175.  
  176. /* Funkcja obslugi klawiatury */
  177. void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
  178. {
  179.        
  180.         switch(klawisz)
  181.                 {
  182.                 }
  183.  
  184.         if(klawisz == 27)
  185.                         exit(0);
  186. }
  187.  
  188. /* Glowna funkcja programu */
  189. int  main(int argc, char **argv)
  190. {
  191.        
  192.         /* Zainicjowanie biblioteki GLUT */
  193.         glutInit(&argc, argv);
  194.  
  195.         /* Ustawienie trybu wyswietlania */
  196.         glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
  197.  
  198.         /* Ustawienie polozenia dolenego lewego rogu okna */
  199.         glutInitWindowPosition(100, 100);
  200.  
  201.         /* Ustawienie rozmiarow okna */
  202.         glutInitWindowSize(600, 400);
  203.  
  204.         /* Utworzenie okna */
  205.         glutCreateWindow("CLOCK");
  206.  
  207.         /* Oświetlenie */
  208.         glEnable(GL_DEPTH_TEST);
  209.         glEnable(GL_LIGHTING);
  210.         glEnable(GL_LIGHT0);
  211.         glEnable(GL_COLOR_MATERIAL);
  212.        
  213.         /* Odblokowanie bufora glebokosci */
  214.         glEnable(GL_DEPTH_TEST);
  215.  
  216.         /* Ustawienie funkcji wykonywanej na danych w buforze glebokosci */
  217.         glDepthFunc(GL_LEQUAL);
  218.  
  219.         /* Ustawienie wartosci czyszczacej zawartosc bufora glebokosci */
  220.         glClearDepth(1000.0);
  221.  
  222.         /* Ustawienie koloru czyszczenia bufora ramki */
  223.         glClearColor (0.0, 0.0, 0.0, 0.0);
  224.  
  225.         /* Zarejestrowanie funkcji (callback) wyswietlajacej */
  226.         glutDisplayFunc(WyswietlObraz);
  227.  
  228.         /* Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy zmieniane sa rozmiary okna */
  229.         glutReshapeFunc(UstawParametryWidoku);
  230.  
  231.         /* Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje zadnych zadan */
  232.         glutIdleFunc(WyswietlObraz);
  233.  
  234.         /* Zarejestrowanie funkcji obslugi klawiatury */
  235.         glutKeyboardFunc(ObslugaKlawiatury);
  236.  
  237.         /* Zarejestrowanie funkcji obslugi klawiszy specjalnych */
  238.         glutSpecialFunc(ObslugaKlawiszySpecjalnych);
  239.  
  240.         /* Zainicjowanie kwadryk tworzacych ramie robota */
  241.         InicjujRamieRobota();
  242.  
  243.         /* Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci) */
  244.         glutMainLoop();
  245.        
  246.        
  247.  
  248.         return 0;
  249. }