Haifisch7734

Untitled

Dec 7th, 2014
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.13 KB | None | 0 0
  1. /* OpenGL - przykładowy program korzystający z biblioteki GLUT
  2.  * Przekształcenia, oświetlenie, materiały.
  3.  * Obsługa (zmiana kąta patrzenia) z pomocą klawiszy 'Z' oraz 'X'.
  4.  *
  5.  * (C) 2009 dr inż. Grzegorz Łukawski, Politechnika Świętokrzyska
  6.  */
  7.  
  8. #define GLUT_DISABLE_ATEXIT_HACK
  9.  
  10. #include <stdlib.h>
  11. #include <gl/gl.h>
  12. #include <gl/glu.h>
  13. #include <gl/glut.h>
  14.  
  15. #define ANIM_FPS    40  /* Docelowa liczba ramek animacji na sekundę */
  16.  
  17. /* Zmienne pomocnicze */
  18. GLfloat lookA;  /* Kąt patrzenia w kierunku pionowym */
  19. GLfloat angle;  /* Kąt obrotu obiektów wokół środka sceny (animacja) */
  20. GLfloat dist = -7.78300e5;
  21.  
  22. /* Parametry światła i materiałów */
  23. GLfloat lightAmb[] = {0.1, 0.1, 0.1, 1.0};
  24. GLfloat lightDif[] = {0.7, 0.7, 0.7, 1.0};
  25. GLfloat lightPos[] = {0.0, 0.0, 0.0, 1.0};
  26. GLfloat lightSpec[] = {1, 1, 1, 1};
  27. float deltaT = 0.05;
  28.  
  29. /* Funkcja ustawia parametry renderowania i oświetlenie... */
  30. /* wywoływana na początku programu */
  31. void setupScene(void) {
  32.     /* Bufor głębokości */
  33.     glEnable(GL_DEPTH_TEST);
  34.     /* Włączenie oświetlenia */
  35.     glEnable(GL_LIGHTING);
  36.  
  37.     /* Natężenie światła otoczenia (AMBIENT) */
  38.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
  39.     /* Natężenie światła rozpraszającego (DIFFUSE) */
  40.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif);
  41.     /* Światło nr 0 umieszczone nad sceną z prawej strony */
  42.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  43.     /* Natężenie odbłysków */
  44.     glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
  45.     /* Włączenie światła nr 0 */
  46.     glEnable(GL_LIGHT0);
  47.  
  48.     /* Ustawienie odbłysku materiałów */
  49.     glMaterialfv(GL_FRONT, GL_SPECULAR, lightSpec);
  50.     /* Skupienie i jasność plamy światła */
  51.     glMateriali(GL_FRONT, GL_SHININESS, 64);
  52.  
  53.     /* Śledzenie kolorów */
  54.     /* Współczynniki odbicia światła są takie same jak kolor */
  55.     glEnable(GL_COLOR_MATERIAL);
  56.     glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  57. }
  58.  
  59. /* Zmiana rozmiarów okna */
  60. void ChangeSize(int w, int h) {
  61.     /* Zabezpieczenie przed dzieleniem przez zero */
  62.     if(h==0)    h=1;
  63.     /* Ustawienie widoku */
  64.     glViewport(0, 0, w, h);
  65.  
  66.     /* Ustawienie obszaru obcinania z uwzględnieniem proporcji okna */
  67.     glMatrixMode(GL_PROJECTION);
  68.     glLoadIdentity();
  69.     /* Rzutowanie perspektywiczne */
  70.     gluPerspective(60, (float)w/h, 0.1f, 1.50e23 );
  71.  
  72.     /* Wyzerowanie macierzy widoku modelu dla funkcji rysującej */
  73.     glMatrixMode(GL_MODELVIEW);
  74.     glLoadIdentity();
  75. }
  76.  
  77. /* Funkcja rysująca */
  78. void RenderScene(void) {
  79.     /* Wyczyszczenie tła czarnym kolorem */
  80.     glClearColor(0.0, 0.0, 0.0, 1.0);
  81.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  82.  
  83.     /* Wstępne ustawienie sceny */
  84.     glLoadIdentity();
  85.     //glTranslatef(0, 0, dist);
  86.     gluLookAt(500,0,1.5e5, 0, 0, 1.50e5, 0, 1, 0);
  87.     /* Odsunięcie środka sceny) od obserwatora */
  88.  
  89.     /* Ustawienie kąta obserwacji */
  90.     glRotatef(lookA, 1, 0, 0);
  91.  
  92.     /* Pozycjonowanie światła */
  93.     /* Światło jest nieruchome względem obiektów - one przesuwają się pod światłem */
  94.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  95.     /* Animacja */
  96.     //glRotatef(angle, 0, 1, 0);
  97.  
  98.     /* Narysowanie trzech obiektów krążących wokół środka sceny */
  99.     glPushMatrix();
  100.         glColor3f(1, 1, 0);
  101.         glutSolidSphere(1.40e3, 100, 100);
  102.     glPopMatrix();
  103.     glPushMatrix();
  104.         glTranslatef(0, 0, 5.79e4);
  105.         glColor3f(0, 1, 0);
  106.         glutSolidSphere(4.89, 100, 100);
  107.     glPopMatrix();
  108.     glPushMatrix();
  109.         glTranslatef(0, 0, 1.08e5);
  110.         glColor3f(1, 0.5, 0);
  111.         glutSolidSphere(1.21e1, 100, 100);
  112.     glPopMatrix();
  113.     glPushMatrix();
  114.         glTranslatef(0, 0, 1.50e5);
  115.         glColor3f(0, 0, 1);
  116.         glutSolidSphere(1.27e1, 100, 100);
  117.         glPushMatrix();
  118.             glRotatef(angle, 0, 1, 0);
  119.             glTranslatef(3.84e2, 0, 0);
  120.             glColor3f(0.5, 0.5, 0.5);
  121.             glutSolidSphere(3.47e0, 100, 100);
  122.         glPopMatrix();
  123.     glPopMatrix();
  124.     glPushMatrix();
  125.         glTranslatef(0, 0, 2.28e5);
  126.         glColor3f(1, 0, 0);
  127.         glutSolidSphere(6.80e1, 100, 100);
  128.         glPushMatrix();
  129.             glTranslatef(9.38e0, 0, 0);
  130.             glColor3f(0.5, 0.5, 0.5);
  131.             glutSolidSphere(2.10e-2, 100, 100);
  132.         glPopMatrix();
  133.         glPushMatrix();
  134.             glTranslatef(-2.36e1, 0, 0);
  135.             glColor3f(0.5, 0.5, 0.5);
  136.             glutSolidSphere(1.20e-2, 100, 100);
  137.         glPopMatrix();
  138.     glPopMatrix();
  139.     glPushMatrix();
  140.         glTranslatef(0, 0, -7.78e5);
  141.         glColor3f(1, 0, 1);
  142.         glutSolidSphere(1.43e2, 100, 100);
  143.     glPopMatrix();
  144.     glPushMatrix();
  145.         glTranslatef(0, 0, 1.43e6);
  146.         glColor3f(1, 1, 0);
  147.         glutSolidSphere(1.21e2, 100, 100);
  148.     glPopMatrix();
  149.     glPushMatrix();
  150.         glTranslatef(0, 0, 2.87e6);
  151.         glColor3f(0.675, 0.827, 0.675);
  152.         glutSolidSphere(5.11e1, 100, 100);
  153.     glPopMatrix();
  154.     glPushMatrix();
  155.         glTranslatef(0, 0, 4.46e6);
  156.         glColor3f(0, 0, 1);
  157.         glutSolidSphere(4.95e1, 100, 100);
  158.     glPopMatrix();
  159.  
  160.     /* Zmiana bufora i opróżnienie kolejki renderowania */
  161.     glutSwapBuffers();
  162. }
  163.  
  164. /* Funkcja zegarowa: */
  165. void ZegarFun(int val) {
  166.     /* Rotacja obiektów wokół środka sceny */
  167.     angle += deltaT;
  168.     if(angle >= 360)    angle -= 360;
  169.     /* Odrysowanie sceny: */
  170.     glutPostRedisplay();
  171.     /* Ponowne wystartowanie zegara: */
  172.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  173. }
  174.  
  175. /* Funkcja obsługująca klawiaturę */
  176. void KeyFunc(unsigned char key, int x, int y) {
  177.     if(key=='z' || key=='Z')    lookA += 1;
  178.     if(key=='x' || key=='X')    lookA -= 1;
  179.     if(key=='+') dist += 2000.0;
  180.     if(key=='-') dist -= 2000.0;
  181.     if(key=='w') deltaT += 0.05;
  182.     if(key=='s') deltaT -= 0.05;
  183.     if(key == 0x1B)     exit(0);
  184. }
  185.  
  186. /* Funkcja główna */
  187. int main(int argc, char *argv[]) {
  188.     glutInit(&argc, argv);
  189.     /* Przygotowanie okna */
  190.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  191.     glutInitWindowSize(960, 600);
  192.     glutCreateWindow("glut_ex2");
  193.  
  194.     /* Ustawienie funkcji rysującej zawartość okna */
  195.     glutDisplayFunc(RenderScene);
  196.     /* Funkcja ustawiająca parametry po zmianie rozmiaru okna */
  197.     glutReshapeFunc(ChangeSize);
  198.     /* Funkcja obsługująca klawiaturę */
  199.     glutKeyboardFunc(KeyFunc);
  200.  
  201.     /* Ustawienia OpenGL */
  202.     setupScene();
  203.     /* Start zegara po raz pierwszy */
  204.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  205.     /* Wejście do głównej pętli programu */
  206.     glutMainLoop();
  207.     return(0);
  208. }
Advertisement
Add Comment
Please, Sign In to add comment