Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* System */
- #include<windows.h>
- #include<stdio.h>
- /* Główna bibloteka OpenGL */
- #include<GL/gl.h>
- /* Biblioteka GLUT */
- #include<GL/freeglut.h>
- /* Deklaracje funkcji narzędziowych */
- /* Funkcja do rysowania */
- void DrawScene(void);
- /* Prototyp fukcji rysującej osie ukłądu */
- void DrawSceneAxes(void);
- /* Funkcja do inicjacji OpenGLa */
- void InitOpenGL(void);
- /* Funkcja wywoływana w momentach zmiany rozmiarów okna */
- void ReshapeWindow(int width, int height);
- /* Deklaracja globalnych zmiennych */
- /* Globalny identyfikator głównego okna programu */
- int mainWindow;
- void KeyboardFunc(unsigned char, int, int);
- GLfloat v_angle = 5.0;
- /* Funkcja main */
- int main(int argc, char **argv)
- {
- // Inicjujemy bibliotekę GLUT
- glutInit(&argc, argv);
- // Inicjujemy: format koloru, dwa bufoy ramki
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
- // Ustawiamy początkowe wymiary okna
- glutInitWindowSize(800, 600);
- // Ustawiamy pozycję okna - lewy górny narożnik
- glutInitWindowPosition(150,150);
- // Tworzymy główne okno programu
- mainWindow = glutCreateWindow("Transformacje czajnikowe");
- // Sprawdzamy powodzenie operacji
- if(mainWindow == 0){
- puts("Nie mozna stworzyc okna!!!\nWyjscie z programu.\n");
- exit(-1);
- }
- // Czynimy aktywnym okno główne programu
- glutSetWindow(mainWindow);
- glutKeyboardFunc(KeyboardFunc);
- // Tutaj rejestrujemy funkcje narzędziowe - tzw. callbacks
- glutDisplayFunc(DrawScene);
- glutReshapeFunc(ReshapeWindow);
- // Ustawienia początkowe
- InitOpenGL();
- // Włączamy mechanizm usuwania niewidocznych powierzchni
- glEnable(GL_DEPTH_TEST);
- // Wejście do pętli programu
- glutMainLoop();
- return(0);
- }
- /* W tej funkcji określamy to co ma byc narysowane na ekranie.
- * Jest wywoływana zawsze wtedy, gdy trzeba przerysować ekran - bufor ramki.
- */
- void DrawScene(void)
- {
- // Czyścimy okno aktualnym (domyślnym) kolorem oraz resetujemy bufor głębi
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Rysujemy osie układu
- glRotatef(4*v_angle, 1.0f, 0.0f, 0.0);
- DrawSceneAxes();
- // Komenda wykonania poleceń rysujących - nie jest już potrzebna przy ustaweniu GLUT_DOUBLE
- //glFlush();
- // Zamieniamy bufory ramki
- glutSwapBuffers();
- glutPostRedisplay();
- }
- void KeyboardFunc(unsigned char key, int x, int y)
- {
- switch(key)
- {
- case 27: // Wciśnięcie klawisza ESC spowoduje wyjście z programu
- exit(0);
- case 'w': // Wciśnięcie klawisza w spowoduje inkrementację zmiennej
- if(v_angle <0)
- {
- v_angle=0;
- v_angle+=0.05f;
- }
- else
- {
- v_angle -= 0.05f;
- }
- break;
- case 'r': // Wciśnięcie klawisza r spowoduje dekrementację zmiennej
- {
- if(v_angle >0)
- {
- v_angle=0;
- v_angle-=0.05f;
- }
- else
- {
- v_angle -= 0.05f;
- }
- break;
- }
- glutPostRedisplay();
- }
- }
- /* Ta funkcja jest wywoływana przez funkcję DrawScene.
- * Jej zadaniem jest rysowanie konkretnych obiektów osi układu
- * współrzędnych.
- */
- void DrawSceneAxes(void)
- {
- // Definiujemy nowy typ jako tablicę 3-elementową
- typedef float pt3d[3];
- // Początek i koniec osi X
- pt3d x_beg = { -10.0f, 0.0f, 0.0f };
- pt3d x_end = { 10.0f, 0.0f, 0.0f };
- // Poczatek i koniec osi Y
- pt3d y_beg = { 0.0f, -10.0f, 0.0f };
- pt3d y_end = { 0.0f, 10.0f, 0.0f };
- // Początek i koniec osi Z
- pt3d z_beg = { 0.0f, 0.0f, -10.0f };
- pt3d z_end = { 0.0f, 0.0f, 10.0f };
- // Rysujemy osie
- glBegin(GL_LINES);
- // Czerwony kolor dla osi X
- glColor3f(1.0f, 0.0f, 0.0f);
- glVertex3fv(x_beg);
- glVertex3fv(x_end);
- // Zielony kolor dla osi Y
- glColor3f(0.0f, 1.0f, 0.0f);
- glVertex3fv(y_beg);
- glVertex3fv(y_end);
- // Niebieski kolor dla osi Z
- glColor3f(0.0f, 0.0f, 1.0f);
- glVertex3fv(z_beg);
- glVertex3fv(z_end);
- glEnd();
- glColor3f(0.5f, 0.5f, 0.5f);
- glutWireTeapot(4.0);
- }
- /* Ta funkcja służy do wstępnej konfiguracji OpenGLa.
- * Zanim coś narysujemy musimy wywołać tę funkcję.
- */
- void InitOpenGL(void)
- {
- // Ustawiamy domyślny, czarny kolor tła okna - bufor ramki malujemy na czarno
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- }
- /* Tę funkcję wywołuje system w momencie gdy użytkownik zmieni myszą
- * rozmiar głównego okna. jej zadaniem jest zachowanie proporcji wymiarów
- * rysowanych obiektów niezależnie od wymiarów okna.
- */
- void ReshapeWindow(int width, int height)
- {
- //printf("w: %d\n", width);
- //printf("h: %d\n", height);
- GLdouble nRange = 15.0f;
- // Na wypadek dzielenia przez 0
- if(height == 0)
- {
- height = 1;
- }
- if(width == 0)
- {
- width = 1;
- }
- // Ustawiamy wielkości okna urządzenia w zakresie
- // od 0,0 do wysokość, szerokość
- glViewport(0, 0, width, height);
- // Ustawiamy układ współrzędnych obserwatora
- glMatrixMode(GL_PROJECTION);
- // Resetujemy macierz projekcji
- glLoadIdentity();
- // Korekta
- if(width <= height)
- glOrtho(-nRange, nRange, -nRange*((GLdouble)height / width), nRange*((GLdouble)height / width), -10.0f, 10.0f);
- else
- glOrtho(-nRange*((GLdouble)width / height), nRange*((GLdouble)width / height), -nRange, nRange, -10.0f, 10.0f);
- // Ustawiamy macierz modelu
- glMatrixMode(GL_MODELVIEW);
- // Resetujemy macierz modelu
- glLoadIdentity();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement