Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <GL/glut.h>
- #include <math.h>
- #include <stdio.h>
- #include <string.h>
- // Definicja stalych
- #define DLUGOSC_BOKU 5.0
- #define OBSERWATOR_ODLEGLOSC 20.0
- #define OBSERWATOR_OBROT_X 20.0
- #define OBSERWATOR_OBROT_Y 20.0
- #define OBSERWATOR_OBROT_Z 20.0
- #define OBSERWATOR_FOV_Y 30.0
- #define X 4
- #define PI 3.1415926535
- #define DEG2RAD(x) ((float)(x)*PI/180.0)
- #define Beta (360.0/e)
- #define X_SW 10
- #define Y_SW 120
- #define X_MAT 10
- #define Y_MAT 220
- #define X_OB 10
- #define Y_OB 300
- #define ID_SW 0
- #define ID_MAT 1
- double e = X;
- double mode = 1;
- double HW = 3;
- double RW = 2;
- double OsX = 20;
- double OsY = 20;
- double OsZ = 0;
- float odmin = 1;
- float odmax = 200;
- float od = 60;
- double kat_x = 0.0;
- double kat_y = 0.0;
- double kat_z = 0.0;
- double predkosc = 0;
- double R_L1 = 10.0;
- double S = 0;
- int M = 0;
- double i;
- int t=0;
- double j=0;
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- // Prototypy funkcji
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void WlaczSwiatlo1() {
- GLfloat swiatlo1[5][4] = {
- {0.5, 0.1, 0.5, 1.0}, //[0] otoczenie
- {0.5, 0.1, 0.5, 1.0}, //[1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, //[2] lustrzane
- {0.0, 0.0, 0.0, 0.9}, //[3] polozenie
- {-1.0, 0.0, 0.0, 0.0} //[4] kierunek swiecenia
- };
- glPushMatrix();
- glRotatef(kat_x, 1, 0, 0);
- glRotatef(kat_y, 0, 1, 0);
- glRotatef(kat_z, 0, 0, 1);
- glTranslatef(R_L1, 0, 0);
- glutSolidCube(1);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo1[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo1[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo1[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo1[3]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo1[4]);
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 45.0);
- glPopMatrix();
- }
- void WlaczSwiatlo2() {
- GLfloat swiatlo2[5][4] = {
- {1.0, 1.0, 1.0, 1.0}, //[0] otoczenie
- {1.0, 1.0, 1.0, 1.0}, //[1] rozproszenie
- {0.5, 0.1, 0.5, 1.0}, //[2] lustrzane
- {-10.0, 5.0, 10.0, 0.9}, //[3] polozenie
- {0.0, 0.0, 0.0, 0.0} //[4] kierunek swiecenia
- };
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT2);
- glLightfv(GL_LIGHT2, GL_AMBIENT, swiatlo2[0]);
- glLightfv(GL_LIGHT2, GL_DIFFUSE, swiatlo2[1]);
- glLightfv(GL_LIGHT2, GL_SPECULAR, swiatlo2[2]);
- glLightfv(GL_LIGHT2, GL_POSITION, swiatlo2[3]);
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, swiatlo2[4]);
- glPopMatrix();
- }
- float material1[5][4] = {
- {0.5, 0.3, 0.0, 0.0},
- {1.0, 1.0, 1.0, 0.0},
- {0.5, 0.3, 0.0, 0.0},
- {0.0, 0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0, 0.0}
- };
- float material2[5][4] = {
- {1.0, 0.0, 0.0, 0.0},
- {1.0, 1.0, 1.0, 1.0},
- {0.0, 0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0, 0.0}
- };
- float material3[5][4] = {
- {1.0, 0.0, 1.0, 1.0},
- {1.0, 0.0, 1.0, 1.0},
- {1.0, 0.0, 1.0, 1.0},
- {3.0, 0.0, 0.0, 0.0},
- {0.0, 0.0, 0.0, 1.0}
- };
- void WlaczMaterial(int mat) {
- if (mat == 1) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material1[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material1[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material1[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material1[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material1[4]);
- } else if (mat == 2) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material2[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material2[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material2[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material2[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material2[4]);
- } else if (mat == 3) {
- glMaterialfv(GL_FRONT, GL_AMBIENT, material3[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material3[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material3[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material3[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material3[4]);
- }
- }
- void walec(){
- double Y;
- double Y0 = 0.0;
- glColor3f(1, 0, 0);
- if (mode == 1) {
- glBegin(GL_LINES);
- glVertex3f(0, 0, 0);
- glVertex3f(0, -4, 0);
- glEnd();
- }
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(0, -1, 0);
- glVertex3f(0, 0, 0);
- for (i = 0; i*Beta <= 360.0; i++)
- {
- glNormal3f(cos(DEG2RAD(3*i*Beta/4)), -0.5, sin(DEG2RAD(3*i*Beta/4)));
- glVertex3f(RW/2*cos(DEG2RAD(3*i*Beta/4)), 0, RW/2*sin(DEG2RAD(3*i*Beta/4)));
- }
- glEnd();
- if (mode == 1) {
- glBegin(GL_LINES);
- glVertex3f(0, HW, 0);
- glVertex3f(0, HW + 3, 0);
- glEnd();
- }
- glColor3f(0, 1, 0);
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(0, 1, 0);
- glVertex3f(0, HW, 0);
- for (i = 0; i*Beta <= 360.0; i++)
- {
- glNormal3f(cos(DEG2RAD(3*i*Beta/4)), 0.5, sin(DEG2RAD(3*i*Beta/4)));
- glVertex3f(RW/2*cos(DEG2RAD(3*i*Beta/4)), HW, RW/2*sin(DEG2RAD(3*i*Beta/4)));
- }
- glEnd();
- //sciana "okragla" kratka
- for (j = 3.0 / e; j <= 3.1; j += (3.0 / e)) {
- Y = j;
- if (j > 3) Y = 3.0;
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i*Beta <= 360.0; i++)
- {
- glColor3f(0, 0, 1);
- glNormal3f(cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)));
- glVertex3f(RW / 2 * cos(DEG2RAD(3*i*Beta / 4)), Y0, RW / 2 * sin(DEG2RAD(3*i*Beta / 4)));
- glNormal3f(cos(DEG2RAD(3*i*Beta / 4)), Y, sin(DEG2RAD(3*i*Beta / 4)));
- glVertex3f(RW / 2 * cos(DEG2RAD(3*i*Beta / 4)), Y, RW / 2 * sin(DEG2RAD(3*i*Beta / 4)));
- }
- glEnd();
- if (mode == 1) {
- glBegin(GL_LINES);
- for (i = 0; i*Beta <= 360.0; i++)
- {
- glColor3f(0, 1, 0);
- glVertex3f(cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)));
- glVertex3f(cos(DEG2RAD(3*i*Beta / 4)) + 3 * cos(DEG2RAD(3*i*Beta / 4)), Y0, sin(DEG2RAD(3*i*Beta / 4)) + 3 * sin(DEG2RAD(3*i*Beta / 4)));
- }
- glEnd();
- }
- Y0 = Y;
- }
- Y0 = 0.0;
- for (j = 1.0 / e; j <= 1.1; j += (1.0 / e)) {
- Y = j;
- if (j > 1) Y = 1.0;
- for (i = 0; i*Beta <= 360.0; i++)
- {
- glColor3f(0.5, 0.5, 1);
- glBegin(GL_QUAD_STRIP);
- glVertex3f(0, 0, -Y0);
- glVertex3f(0, HW, -Y0);
- glVertex3f(0, 0, -Y);
- glVertex3f(0, HW, -Y);
- glEnd();
- glBegin(GL_QUAD_STRIP);
- glVertex3f(Y0, 0, 0);
- glVertex3f(Y0, HW, 0);
- glVertex3f(Y, 0, 0);
- glVertex3f(Y, HW, 0);
- glEnd();
- }
- Y0 = Y;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja ustawiajaca parametry rzutu perspektywicznego i rozmiary viewportu. Powinna
- // być wywolywana kazdorazowo po zmianie rozmiarow okna programu.
- void UstawParametryWidoku(int szer, int wys)
- {
- // Zapamietanie wielkosci widoku
- szerokoscOkna = szer;
- wysokoscOkna = wys;
- // Ustawienie parametrow viewportu
- glViewport(0, 0, szerokoscOkna, wysokoscOkna);
- // Przejscie w tryb modyfikacji macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(OBSERWATOR_FOV_Y, (float)szerokoscOkna/(float)wysokoscOkna, 1.0, 1000.0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wyswietlajaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- // Wyczyszczenie bufora koloru i bufora glebokosci
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zastapienie aktywnej macierzy macierza jednostkowa
- glLoadIdentity();
- // Ustalenie polozenia obserwatora
- glTranslatef(0, 0, -od);
- glRotatef(OsX, 1, 0, 0);
- glRotatef(OsY, 0, 1, 0);
- glRotatef(OsZ, 0, 0, 1);
- glEnable(GL_LIGHTING);
- if (S == 1)
- WlaczSwiatlo1();
- WlaczMaterial(M);
- walec();
- //menu();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case ',':
- S = 1;
- break;
- case 'k':
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT1);
- S = 0;
- break;
- case '.':
- WlaczSwiatlo2();
- break;
- case 'l':
- glDisable(GL_LIGHTING);
- glDisable(GL_LIGHT2);
- break;
- case '4':
- M = 1;
- break;
- case '5':
- M = 2;
- break;
- case '6':
- M = 3;
- break;
- }
- if(klawisz == '+')
- bok *= 2.0;
- else if (klawisz == '-')
- bok /= 2.0;
- else if (klawisz == 'n')
- {
- if (od + 1 <= odmax)
- od++;
- }
- else if (klawisz == 'm')
- {
- if (od - 1 >= odmin)
- od--;
- }
- else if (klawisz == 'w')
- OsX++;
- else if (klawisz == 's')
- OsX--;
- else if (klawisz == 'a')
- OsY++;
- else if (klawisz == 'd')
- OsY--;
- else if (klawisz == 'q')
- OsZ++;
- else if (klawisz == 'e')
- OsZ--;
- else if (klawisz == '1')
- {
- if (e <= 63)
- e++;
- }
- else if (klawisz == '2')
- {
- if (e > 4)
- e--;
- }
- else if (klawisz == 'o')
- {
- mode = 1;
- }
- else if (klawisz == 'p')
- {
- mode = 0;
- }
- else if (klawisz == '[')
- {
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- }
- else if (klawisz == ']')
- {
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
- else if (klawisz == 'z')
- {
- glShadeModel(GL_FLAT);
- }
- else if (klawisz == 'x')
- {
- glShadeModel(GL_SMOOTH);
- }
- else if (klawisz == 27)
- exit(0);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Glowna funkcja programu
- int main(int argc, char **argv)
- {
- // Zainicjowanie biblioteki GLUT
- glutInit(&argc, argv);
- // Ustawienie trybu wyswietlania
- glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
- // Ustawienie polozenia dolenego lewego rogu okna
- glutInitWindowPosition(100, 100);
- // Ustawienie rozmiarow okna
- glutInitWindowSize(szerokoscOkna, wysokoscOkna);
- // Utworzenie okna
- glutCreateWindow("Szescian");
- // Odblokowanie bufora glebokosci
- glEnable(GL_DEPTH_TEST);
- // Ustawienie wartosci czyszczacej zawartosc bufora glebokosci
- glClearDepth(1000.0);
- // Ustawienie koloru czyszczenia bufora ramki
- glClearColor (0.3f, 0.3f, 0.3f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glShadeModel(GL_FLAT);
- // Zarejestrowanie funkcji (callback) odpowiedzialnej za
- glutDisplayFunc(WyswietlObraz);
- // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
- // zmieniane sa rozmiary okna
- glutReshapeFunc(UstawParametryWidoku);
- // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
- // zadnych zadan
- glutIdleFunc(WyswietlObraz);
- // Zarejestrowanie funkcji obslugi klawiatury
- glutKeyboardFunc(ObslugaKlawiatury);
- // Obsluga glownej petli programu (wywolywanie zarejestrowanych callbackow
- // w odpowiedzi na odbierane zdarzenia lub obsluga stanu bezczynnosci)
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement