Haifisch7734

OGLSS

Dec 6th, 2014
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.97 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[] = {100, 200, 0.0, 1.0};
  26. GLfloat lightSpec[] = {1, 1, 1, 1};
  27.  
  28. /* Funkcja ustawia parametry renderowania i oświetlenie... */
  29. /* wywoływana na początku programu */
  30. void setupScene(void) {
  31.     /* Bufor głębokości */
  32.     glEnable(GL_DEPTH_TEST);
  33.     /* Włączenie oświetlenia */
  34.     glEnable(GL_LIGHTING);
  35.  
  36.     /* Natężenie światła otoczenia (AMBIENT) */
  37.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
  38.     /* Natężenie światła rozpraszającego (DIFFUSE) */
  39.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif);
  40.     /* Światło nr 0 umieszczone nad sceną z prawej strony */
  41.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  42.     /* Natężenie odbłysków */
  43.     glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
  44.     /* Włączenie światła nr 0 */
  45.     glEnable(GL_LIGHT0);
  46.  
  47.     /* Ustawienie odbłysku materiałów */
  48.     glMaterialfv(GL_FRONT, GL_SPECULAR, lightSpec);
  49.     /* Skupienie i jasność plamy światła */
  50.     glMateriali(GL_FRONT, GL_SHININESS, 64);
  51.  
  52.     /* Śledzenie kolorów */
  53.     /* Współczynniki odbicia światła są takie same jak kolor */
  54.     glEnable(GL_COLOR_MATERIAL);
  55.     glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  56. }
  57.  
  58. /* Zmiana rozmiarów okna */
  59. void ChangeSize(int w, int h) {
  60.     /* Zabezpieczenie przed dzieleniem przez zero */
  61.     if(h==0)    h=1;
  62.     /* Ustawienie widoku */
  63.     glViewport(0, 0, w, h);
  64.  
  65.     /* Ustawienie obszaru obcinania z uwzględnieniem proporcji okna */
  66.     glMatrixMode(GL_PROJECTION);
  67.     glLoadIdentity();
  68.     /* Rzutowanie perspektywiczne */
  69.     gluPerspective(50, (float)w/h, 0.1f, 1.50e23 );
  70.  
  71.     /* Wyzerowanie macierzy widoku modelu dla funkcji rysującej */
  72.     glMatrixMode(GL_MODELVIEW);
  73.     glLoadIdentity();
  74. }
  75.  
  76. /* Funkcja rysująca */
  77. void RenderScene(void) {
  78.     /* Wyczyszczenie tła czarnym kolorem */
  79.     glClearColor(0.0, 0.0, 0.0, 1.0);
  80.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  81.  
  82.     /* Wstępne ustawienie sceny */
  83.     glLoadIdentity();
  84.     /* Odsunięcie środka sceny) od obserwatora */
  85.     glTranslatef(0, 0, dist);
  86.     /* Ustawienie kąta obserwacji */
  87.     glRotatef(lookA, 1, 0, 0);
  88.  
  89.     /* Pozycjonowanie światła */
  90.     /* Światło jest nieruchome względem obiektów - one przesuwają się pod światłem */
  91.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  92.     /* Animacja */
  93.     glRotatef(angle, 0, 1, 0);
  94.  
  95.     /* Narysowanie trzech obiektów krążących wokół środka sceny */
  96.     glPushMatrix();
  97.         glColor3f(1, 1, 0);
  98.         glutSolidSphere(1.40e3, 100, 100);
  99.     glPopMatrix();
  100.     //glRotatef(120, 0, 1, 0);
  101.     glPushMatrix();
  102.         glTranslatef(5.79e4, 0, 0);
  103.         glColor3f(0, 1, 0);
  104.         glutSolidSphere(4.89, 100, 100);
  105.     glPopMatrix();
  106.     glPushMatrix();
  107.         glTranslatef(1.08e5, 0, 0);
  108.         glColor3f(1, 0.5, 0);
  109.         glutSolidSphere(1.21e1, 100, 100);
  110.     glPopMatrix();
  111.     glPushMatrix();
  112.         glTranslatef(1.50e5, 0, 0);
  113.         glColor3f(0, 0, 1);
  114.         glutSolidSphere(1.27e1, 100, 100);
  115.     glPopMatrix();
  116.     glPushMatrix();
  117.         glTranslatef(7.78e5, 0, 0);
  118.         glColor3f(1, 0, 1);
  119.         glutSolidSphere(1.43e2, 100, 100);
  120.     glPopMatrix();
  121.  
  122.     /* Zmiana bufora i opróżnienie kolejki renderowania */
  123.     glutSwapBuffers();
  124. }
  125.  
  126. /* Funkcja zegarowa: */
  127. void ZegarFun(int val) {
  128.     /* Rotacja obiektów wokół środka sceny */
  129.     angle += 0.05;
  130.     if(angle >= 360)    angle -= 360;
  131.     /* Odrysowanie sceny: */
  132.     glutPostRedisplay();
  133.     /* Ponowne wystartowanie zegara: */
  134.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  135. }
  136.  
  137. /* Funkcja obsługująca klawiaturę */
  138. void KeyFunc(unsigned char key, int x, int y) {
  139.     if(key=='z' || key=='Z')    lookA += 1;
  140.     if(key=='x' || key=='X')    lookA -= 1;
  141.     if(key=='+') dist += 200.0;
  142.     if(key=='-') dist -= 200.0;
  143.     if(key == 0x1B)     exit(0);
  144. }
  145.  
  146. /* Funkcja główna */
  147. int main(int argc, char *argv[]) {
  148.     glutInit(&argc, argv);
  149.     /* Przygotowanie okna */
  150.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  151.     glutInitWindowSize(960, 600);
  152.     glutCreateWindow("glut_ex2");
  153.  
  154.     /* Ustawienie funkcji rysującej zawartość okna */
  155.     glutDisplayFunc(RenderScene);
  156.     /* Funkcja ustawiająca parametry po zmianie rozmiaru okna */
  157.     glutReshapeFunc(ChangeSize);
  158.     /* Funkcja obsługująca klawiaturę */
  159.     glutKeyboardFunc(KeyFunc);
  160.  
  161.     /* Ustawienia OpenGL */
  162.     setupScene();
  163.     /* Start zegara po raz pierwszy */
  164.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  165.     /* Wejście do głównej pętli programu */
  166.     glutMainLoop();
  167.     return(0);
  168. }
Advertisement
Add Comment
Please, Sign In to add comment