Advertisement
Haifisch7734

Planetos

Dec 7th, 2014
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.40 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. float x1 = 1.499e5;
  30. float z1 = 500;
  31. float x2 = 1.5e5;
  32.  
  33. /* Funkcja ustawia parametry renderowania i oświetlenie... */
  34. /* wywoływana na początku programu */
  35. void setupScene(void) {
  36.     /* Bufor głębokości */
  37.     glEnable(GL_DEPTH_TEST);
  38.     /* Włączenie oświetlenia */
  39.     glEnable(GL_LIGHTING);
  40.  
  41.     /* Natężenie światła otoczenia (AMBIENT) */
  42.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
  43.     /* Natężenie światła rozpraszającego (DIFFUSE) */
  44.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif);
  45.     /* Światło nr 0 umieszczone nad sceną z prawej strony */
  46.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  47.     /* Natężenie odbłysków */
  48.     glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
  49.     /* Włączenie światła nr 0 */
  50.     glEnable(GL_LIGHT0);
  51.  
  52.     /* Ustawienie odbłysku materiałów */
  53.     glMaterialfv(GL_FRONT, GL_SPECULAR, lightSpec);
  54.     /* Skupienie i jasność plamy światła */
  55.     glMateriali(GL_FRONT, GL_SHININESS, 64);
  56.  
  57.     /* Śledzenie kolorów */
  58.     /* Współczynniki odbicia światła są takie same jak kolor */
  59.     glEnable(GL_COLOR_MATERIAL);
  60.     glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
  61. }
  62.  
  63. /* Zmiana rozmiarów okna */
  64. void ChangeSize(int w, int h) {
  65.     /* Zabezpieczenie przed dzieleniem przez zero */
  66.     if(h==0)    h=1;
  67.     /* Ustawienie widoku */
  68.     glViewport(0, 0, w, h);
  69.  
  70.     /* Ustawienie obszaru obcinania z uwzględnieniem proporcji okna */
  71.     glMatrixMode(GL_PROJECTION);
  72.     glLoadIdentity();
  73.     /* Rzutowanie perspektywiczne */
  74.     gluPerspective(60, (float)w/h, 0.1f, 1.50e23 );
  75.  
  76.     /* Wyzerowanie macierzy widoku modelu dla funkcji rysującej */
  77.     glMatrixMode(GL_MODELVIEW);
  78.     glLoadIdentity();
  79. }
  80.  
  81. /* Funkcja rysująca */
  82. void RenderScene(void) {
  83.     /* Wyczyszczenie tła czarnym kolorem */
  84.     glClearColor(0.0, 0.0, 0.0, 1.0);
  85.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  86.  
  87.     /* Wstępne ustawienie sceny */
  88.     glLoadIdentity();
  89.     //glTranslatef(0, 0, dist);
  90.  
  91.     /* Odsunięcie środka sceny) od obserwatora */
  92.  
  93.     /* Ustawienie kąta obserwacji */
  94.     glRotatef(lookA, 1, 0, 0);
  95. gluLookAt(z1,0,x1, 0, 0, x2, 0, 1, 0);
  96.     /* Pozycjonowanie światła */
  97.     /* Światło jest nieruchome względem obiektów - one przesuwają się pod światłem */
  98.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  99.     /* Animacja */
  100.     //glRotatef(angle, 0, 1, 0);
  101.  
  102.     /* Narysowanie trzech obiektów krążących wokół środka sceny */
  103.     glPushMatrix();
  104.         glColor3f(1, 1, 0);
  105.         glutSolidSphere(1.40e3, 100, 100);
  106.     glPopMatrix();
  107.     glPushMatrix();
  108.         glTranslatef(0, 0, 5.79e4);
  109.         glColor3f(0, 1, 0);
  110.         glutSolidSphere(4.89, 100, 100);
  111.     glPopMatrix();
  112.     glPushMatrix();
  113.         glTranslatef(0, 0, 1.08e5);
  114.         glColor3f(1, 0.5, 0);
  115.         glutSolidSphere(1.21e1, 100, 100);
  116.     glPopMatrix();
  117.     glPushMatrix();
  118.         glTranslatef(0, 0, 1.50e5);
  119.  
  120.         glPushMatrix();
  121.             glRotatef(angle, 0, 1, 0);
  122.             glTranslatef(3.84e2, 0, 0);
  123.             glColor3f(0.5, 0.5, 0.5);
  124.             glutSolidSphere(3.47e0, 100, 100);
  125.         glPopMatrix();
  126.         glRotatef(23,0,1,0);
  127.         glRotatef(angle,0,1,0);
  128.         glColor3f(0, 0, 1);
  129.         glutSolidSphere(1.27e1, 100, 100);
  130.     glPopMatrix();
  131.     glPushMatrix();
  132.         glTranslatef(0, 0, 2.28e5);
  133.  
  134.         glPushMatrix();
  135.             glRotatef(angle*1.6, 0, 1, 0);
  136.             glTranslatef(9.38e0, 0, 0);
  137.             glColor3f(0.5, 0.5, 0.5);
  138.             glutSolidSphere(2.10e-2, 100, 100);
  139.         glPopMatrix();
  140.         glPushMatrix();
  141.             glRotatef(angle*1.2, 0, 1, 0);
  142.             glTranslatef(-2.36e1, 0, 0);
  143.             glColor3f(0.5, 0.5, 0.5);
  144.             glutSolidSphere(1.20e-2, 100, 100);
  145.         glPopMatrix();
  146.  
  147.         glColor3f(1, 0, 0);
  148.         glutSolidSphere(6.80e0, 100, 100);
  149.     glPopMatrix();
  150.  
  151.     glPushMatrix();
  152.         glTranslatef(0, 0, 7.78e5);
  153.         glColor3f(1, 0, 1);
  154.         glutSolidSphere(1.43e2, 100, 100);
  155.         glPushMatrix();
  156.             glRotatef(angle*1.6, 0, 1, 0);
  157.             glTranslatef(4.22e2, 0, 0);
  158.             glColor3f(0.9, 0.9, 0);
  159.             glutSolidSphere(3.64e0, 100, 100);
  160.         glPopMatrix();
  161.         glPushMatrix();
  162.             glRotatef(angle*1.2, 0, 1, 0);
  163.             glTranslatef(-6.71e2, 0, 0);
  164.             glColor3f(0, 0.5, 0.8);
  165.             glutSolidSphere(3.12e0, 100, 100);
  166.         glPopMatrix();
  167.         glPushMatrix();
  168.             glRotatef(angle, 0, 1, 0);
  169.             glTranslatef(0, 0, 1.07e3);
  170.             glColor3f(0.6, 0.6, 0.6);
  171.             glutSolidSphere(5.26e0, 100, 100);
  172.         glPopMatrix();
  173.         glPushMatrix();
  174.             glRotatef(angle*0.75, 0, 1, 0);
  175.             glTranslatef(0, 0, -1.88e3);
  176.             glColor3f(0.3, 0.4, 0.4);
  177.             glutSolidSphere(4.82e0, 100, 100);
  178.         glPopMatrix();
  179.     glPopMatrix();
  180.  
  181.  
  182.     glPushMatrix();
  183.         glTranslatef(0, 0, 1.43e6);
  184.         glColor3f(1, 1, 0);
  185.         glutSolidSphere(1.21e2, 100, 100);
  186.     glPopMatrix();
  187.     glPushMatrix();
  188.         glTranslatef(0, 0, 2.87e6);
  189.         glColor3f(0.675, 0.827, 0.675);
  190.         glutSolidSphere(5.11e1, 100, 100);
  191.     glPopMatrix();
  192.     glPushMatrix();
  193.         glTranslatef(0, 0, 4.46e6);
  194.         glColor3f(0, 0, 1);
  195.         glutSolidSphere(4.95e1, 100, 100);
  196.     glPopMatrix();
  197.  
  198.     /* Zmiana bufora i opróżnienie kolejki renderowania */
  199.     glutSwapBuffers();
  200. }
  201.  
  202. /* Funkcja zegarowa: */
  203. void ZegarFun(int val) {
  204.     /* Rotacja obiektów wokół środka sceny */
  205.     angle += deltaT;
  206.     if(angle >= 360)    angle -= 360;
  207.     /* Odrysowanie sceny: */
  208.     glutPostRedisplay();
  209.     /* Ponowne wystartowanie zegara: */
  210.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  211. }
  212.  
  213. /* Funkcja obsługująca klawiaturę */
  214. void KeyFunc(unsigned char key, int x, int y) {
  215.     if(key=='z' || key=='Z')    lookA += 1;
  216.     if(key=='x' || key=='X')    lookA -= 1;
  217.     if(key=='+') dist += 2000.0;
  218.     if(key=='-') dist -= 2000.0;
  219.     if(key=='w') deltaT += 0.05;
  220.     if(key=='s') deltaT -= 0.05;
  221.     if(key=='1') {
  222.         x1 = 1.499e5;
  223.         z1 = 500;
  224.         x2 = 1.5e5;
  225.     }
  226.     if(key=='2') {
  227.         x1 = 2.279e5;
  228.         z1 = 30;
  229.         x2 = 2.28e5;
  230.     }
  231.     if(key=='3') {
  232.         x1 = 7.779e5;
  233.         z1 = 750;
  234.         x2 = 7.78e5;
  235.     }
  236.     if(key == 0x1B)     exit(0);
  237. }
  238.  
  239. /* Funkcja główna */
  240. int main(int argc, char *argv[]) {
  241.     glutInit(&argc, argv);
  242.     /* Przygotowanie okna */
  243.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  244.     glutInitWindowSize(960, 600);
  245.     glutCreateWindow("glut_ex2");
  246.  
  247.     /* Ustawienie funkcji rysującej zawartość okna */
  248.     glutDisplayFunc(RenderScene);
  249.     /* Funkcja ustawiająca parametry po zmianie rozmiaru okna */
  250.     glutReshapeFunc(ChangeSize);
  251.     /* Funkcja obsługująca klawiaturę */
  252.     glutKeyboardFunc(KeyFunc);
  253.  
  254.     /* Ustawienia OpenGL */
  255.     setupScene();
  256.     /* Start zegara po raz pierwszy */
  257.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  258.     /* Wejście do głównej pętli programu */
  259.     glutMainLoop();
  260.     return(0);
  261. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement