Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* OpenGL - przykładowy program korzystający z biblioteki GLUT
- * Przekształcenia, oświetlenie, materiały.
- * Obsługa (zmiana kąta patrzenia) z pomocą klawiszy 'Z' oraz 'X'.
- *
- * (C) 2009 dr inż. Grzegorz Łukawski, Politechnika Świętokrzyska
- */
- #define GLUT_DISABLE_ATEXIT_HACK
- #include <stdlib.h>
- #include <gl/gl.h>
- #include <gl/glu.h>
- #include <gl/glut.h>
- #define ANIM_FPS 40 /* Docelowa liczba ramek animacji na sekundę */
- /* Zmienne pomocnicze */
- GLfloat lookA; /* Kąt patrzenia w kierunku pionowym */
- GLfloat angle; /* Kąt obrotu obiektów wokół środka sceny (animacja) */
- GLfloat dist = -7.78300e5;
- /* Parametry światła i materiałów */
- GLfloat lightAmb[] = {0.1, 0.1, 0.1, 1.0};
- GLfloat lightDif[] = {0.7, 0.7, 0.7, 1.0};
- GLfloat lightPos[] = {0.0, 0.0, 0.0, 1.0};
- GLfloat lightSpec[] = {1, 1, 1, 1};
- float deltaT = 0.05;
- float x1 = 1.499e5;
- float z1 = 500;
- float x2 = 1.5e5;
- /* Funkcja ustawia parametry renderowania i oświetlenie... */
- /* wywoływana na początku programu */
- void setupScene(void) {
- /* Bufor głębokości */
- glEnable(GL_DEPTH_TEST);
- /* Włączenie oświetlenia */
- glEnable(GL_LIGHTING);
- /* Natężenie światła otoczenia (AMBIENT) */
- glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmb);
- /* Natężenie światła rozpraszającego (DIFFUSE) */
- glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDif);
- /* Światło nr 0 umieszczone nad sceną z prawej strony */
- glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
- /* Natężenie odbłysków */
- glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpec);
- /* Włączenie światła nr 0 */
- glEnable(GL_LIGHT0);
- /* Ustawienie odbłysku materiałów */
- glMaterialfv(GL_FRONT, GL_SPECULAR, lightSpec);
- /* Skupienie i jasność plamy światła */
- glMateriali(GL_FRONT, GL_SHININESS, 64);
- /* Śledzenie kolorów */
- /* Współczynniki odbicia światła są takie same jak kolor */
- glEnable(GL_COLOR_MATERIAL);
- glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
- }
- /* Zmiana rozmiarów okna */
- void ChangeSize(int w, int h) {
- /* Zabezpieczenie przed dzieleniem przez zero */
- if(h==0) h=1;
- /* Ustawienie widoku */
- glViewport(0, 0, w, h);
- /* Ustawienie obszaru obcinania z uwzględnieniem proporcji okna */
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- /* Rzutowanie perspektywiczne */
- gluPerspective(60, (float)w/h, 0.1f, 1.50e23 );
- /* Wyzerowanie macierzy widoku modelu dla funkcji rysującej */
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- /* Funkcja rysująca */
- void RenderScene(void) {
- /* Wyczyszczenie tła czarnym kolorem */
- glClearColor(0.0, 0.0, 0.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- /* Wstępne ustawienie sceny */
- glLoadIdentity();
- //glTranslatef(0, 0, dist);
- /* Odsunięcie środka sceny) od obserwatora */
- /* Ustawienie kąta obserwacji */
- glRotatef(lookA, 1, 0, 0);
- gluLookAt(z1,0,x1, 0, 0, x2, 0, 1, 0);
- /* Pozycjonowanie światła */
- /* Światło jest nieruchome względem obiektów - one przesuwają się pod światłem */
- glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
- /* Animacja */
- //glRotatef(angle, 0, 1, 0);
- /* Narysowanie trzech obiektów krążących wokół środka sceny */
- glPushMatrix();
- glColor3f(1, 1, 0);
- glutSolidSphere(1.40e3, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 5.79e4);
- glColor3f(0, 1, 0);
- glutSolidSphere(4.89, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 1.08e5);
- glColor3f(1, 0.5, 0);
- glutSolidSphere(1.21e1, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 1.50e5);
- glPushMatrix();
- glRotatef(angle, 0, 1, 0);
- glTranslatef(3.84e2, 0, 0);
- glColor3f(0.5, 0.5, 0.5);
- glutSolidSphere(3.47e0, 100, 100);
- glPopMatrix();
- glRotatef(23,0,1,0);
- glRotatef(angle,0,1,0);
- glColor3f(0, 0, 1);
- glutSolidSphere(1.27e1, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 2.28e5);
- glPushMatrix();
- glRotatef(angle*1.6, 0, 1, 0);
- glTranslatef(9.38e0, 0, 0);
- glColor3f(0.5, 0.5, 0.5);
- glutSolidSphere(2.10e-2, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glRotatef(angle*1.2, 0, 1, 0);
- glTranslatef(-2.36e1, 0, 0);
- glColor3f(0.5, 0.5, 0.5);
- glutSolidSphere(1.20e-2, 100, 100);
- glPopMatrix();
- glColor3f(1, 0, 0);
- glutSolidSphere(6.80e0, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 7.78e5);
- glColor3f(1, 0, 1);
- glutSolidSphere(1.43e2, 100, 100);
- glPushMatrix();
- glRotatef(angle*1.6, 0, 1, 0);
- glTranslatef(4.22e2, 0, 0);
- glColor3f(0.9, 0.9, 0);
- glutSolidSphere(3.64e0, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glRotatef(angle*1.2, 0, 1, 0);
- glTranslatef(-6.71e2, 0, 0);
- glColor3f(0, 0.5, 0.8);
- glutSolidSphere(3.12e0, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glRotatef(angle, 0, 1, 0);
- glTranslatef(0, 0, 1.07e3);
- glColor3f(0.6, 0.6, 0.6);
- glutSolidSphere(5.26e0, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glRotatef(angle*0.75, 0, 1, 0);
- glTranslatef(0, 0, -1.88e3);
- glColor3f(0.3, 0.4, 0.4);
- glutSolidSphere(4.82e0, 100, 100);
- glPopMatrix();
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 1.43e6);
- glColor3f(1, 1, 0);
- glutSolidSphere(1.21e2, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 2.87e6);
- glColor3f(0.675, 0.827, 0.675);
- glutSolidSphere(5.11e1, 100, 100);
- glPopMatrix();
- glPushMatrix();
- glTranslatef(0, 0, 4.46e6);
- glColor3f(0, 0, 1);
- glutSolidSphere(4.95e1, 100, 100);
- glPopMatrix();
- /* Zmiana bufora i opróżnienie kolejki renderowania */
- glutSwapBuffers();
- }
- /* Funkcja zegarowa: */
- void ZegarFun(int val) {
- /* Rotacja obiektów wokół środka sceny */
- angle += deltaT;
- if(angle >= 360) angle -= 360;
- /* Odrysowanie sceny: */
- glutPostRedisplay();
- /* Ponowne wystartowanie zegara: */
- glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
- }
- /* Funkcja obsługująca klawiaturę */
- void KeyFunc(unsigned char key, int x, int y) {
- if(key=='z' || key=='Z') lookA += 1;
- if(key=='x' || key=='X') lookA -= 1;
- if(key=='+') dist += 2000.0;
- if(key=='-') dist -= 2000.0;
- if(key=='w') deltaT += 0.05;
- if(key=='s') deltaT -= 0.05;
- if(key=='1') {
- x1 = 1.499e5;
- z1 = 500;
- x2 = 1.5e5;
- }
- if(key=='2') {
- x1 = 2.279e5;
- z1 = 30;
- x2 = 2.28e5;
- }
- if(key=='3') {
- x1 = 7.779e5;
- z1 = 750;
- x2 = 7.78e5;
- }
- if(key == 0x1B) exit(0);
- }
- /* Funkcja główna */
- int main(int argc, char *argv[]) {
- glutInit(&argc, argv);
- /* Przygotowanie okna */
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize(960, 600);
- glutCreateWindow("glut_ex2");
- /* Ustawienie funkcji rysującej zawartość okna */
- glutDisplayFunc(RenderScene);
- /* Funkcja ustawiająca parametry po zmianie rozmiaru okna */
- glutReshapeFunc(ChangeSize);
- /* Funkcja obsługująca klawiaturę */
- glutKeyboardFunc(KeyFunc);
- /* Ustawienia OpenGL */
- setupScene();
- /* Start zegara po raz pierwszy */
- glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
- /* Wejście do głównej pętli programu */
- glutMainLoop();
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement