Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //////////////////////////////////////////////////////////////////////////////////////////
- //
- // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
- // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
- //
- //////////////////////////////////////////////////////////////////////////////////////////
- #include <GL/glut.h>
- #include <math.h>
- GLfloat M_PI = 3.14159265359;
- // Definicja stalych
- #define DLUGOSC_BOKU 3.0
- #define OBSERWATOR_FOV_Y 30.0
- #define MAX 64.0
- #define MIN 4.0
- #define MIN_ODL -5.0
- #define MAX_ODL -180.0
- GLfloat rotObsY = 20.0;
- GLfloat rotObsX = 20.0;
- GLfloat rotObsZ = 0.0;
- GLfloat obsOdl = -30.0;
- GLfloat slacks = 15.0;
- GLfloat stacks = 15.0;
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- GLfloat R = 5.0;
- GLfloat r = 25.0;
- GLfloat h = 25.0;
- GLfloat xd1 = 20.0, xd2 = 20.0;
- float deg_rad(int x)
- {
- return x * M_PI / 180.0;
- }
- // Prototypy funkcji
- void RysujSzescian(double a);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
- // Srodek szescianu znajduje się w punkcie (0,0,0).
- void RysujSzescian(double a)
- {
- // Sciany boczne
- glBegin(GL_QUAD_STRIP);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glEnd();
- // Gorna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, a/2.0, a/2.0);
- glVertex3f(a/2.0, a/2.0, a/2.0);
- glVertex3f(-a/2.0, a/2.0, -a/2.0);
- glVertex3f(a/2.0, a/2.0, -a/2.0);
- glEnd();
- // Dolna sciana
- glBegin(GL_QUAD_STRIP);
- glVertex3f(-a/2.0, -a/2.0, a/2.0);
- glVertex3f(a/2.0, -a/2.0, a/2.0);
- glVertex3f(-a/2.0, -a/2.0, -a/2.0);
- glVertex3f(a/2.0, -a/2.0, -a/2.0);
- glEnd();
- }
- void rysujStozek(GLfloat radiusTop, GLfloat radiusBottom, GLfloat h)
- {
- double dAlfa = 360.0 / slacks;
- double tangens = (radiusTop - radiusBottom) / h;
- double jump = h / stacks;
- // PODSTAWA DOLNA
- glColor3f(1, 1, 1);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, 0, 0);
- for (int i = 0; i * dAlfa <= 360.0; i++)
- {
- glVertex3f(radiusBottom * cos(deg_rad(i * dAlfa)), 0, radiusBottom * sin(deg_rad(i * dAlfa)));
- }
- glEnd();
- // PODSTAWA GORNA
- glColor3f(1.0, 0.0, 1.0);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, h, 0);
- for (int i = 0; i * dAlfa <= 360.0; i++)
- {
- glVertex3f(radiusTop * cos(deg_rad(i * dAlfa)), h, radiusTop * sin(deg_rad(i * dAlfa)));
- }
- glEnd();
- // SCIANY BOCZNE
- glColor3f(1.0, 1.0, 0.0);
- glBegin(GL_QUADS);
- for (int i = 0; i * dAlfa <= 360.0; i++)
- {
- for (int x = 0; x < stacks; x++)
- {
- float hPom = (x + 1) * jump;
- float rBottom = radiusBottom + tangens * x * jump;
- float rTop = radiusBottom + tangens * hPom;
- glVertex3f(rBottom * cos(deg_rad(i * dAlfa)), x * jump, rBottom * sin(deg_rad(i * dAlfa)));
- glVertex3f(rTop * cos(deg_rad(i * dAlfa)), hPom, rTop * sin(deg_rad(i * dAlfa)));
- glVertex3f(rTop * cos(deg_rad((i + 1) * dAlfa)), hPom, rTop * sin(deg_rad((i + 1) * dAlfa)));
- glVertex3f(rBottom * cos(deg_rad((i + 1) * dAlfa)), x * jump, rBottom * sin(deg_rad((i + 1) * dAlfa)));
- }
- }
- glEnd();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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);
- }
- GLfloat OX(GLfloat r, GLfloat fi, GLfloat teta)
- {
- return r * cos(M_PI / 2 - fi) * cos(teta);
- }
- GLfloat OY(GLfloat r, GLfloat fi, GLfloat teta)
- {
- return r * cos(M_PI / 2 - fi) * sin(teta);
- }
- GLfloat OZ(GLfloat r, GLfloat fi)
- {
- return r * sin(M_PI / 2 - fi);
- }
- void sfera(GLfloat radius, GLfloat slices, GLfloat stacks) {
- GLfloat slcInc = 2 * M_PI / slices;
- GLfloat stkInc = M_PI / stacks;
- glPushMatrix();
- glRotatef(-90, 1, 0, 0);
- glColor3f(1, 1, 1);
- glBegin(GL_TRIANGLE_STRIP);
- int z = 0;
- for (int i = 0; i < stacks; i++, z++) {
- for (int j = 0; j < slices; j++) {
- glVertex3f(OX(radius, i * stkInc, j * slcInc), OY(radius, i * stkInc, j * slcInc), OZ(radius, i * stkInc));
- glVertex3f(OX(radius, (i + 1) * stkInc, j * slcInc), OY(radius, (i + 1) * stkInc, j * slcInc), OZ(radius, (i + 1) * stkInc));
- glVertex3f(OX(radius, i * stkInc, (j + 1) * slcInc), OY(radius, i * stkInc, (j + 1) * slcInc), OZ(radius, i * stkInc));
- glVertex3f(OX(radius, (i + 1) * stkInc, (j + 1) * slcInc), OY(radius, (i + 1) * stkInc, (j + 1) * slcInc), OZ(radius, (i + 1) * stkInc));
- }
- }
- glEnd();
- glPopMatrix();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wyswietlajaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- // Wyczyszczenie bufora koloru i bufora glebokosci
- glClear(0);
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-50.0, 0.0, 0.0);
- glVertex3f(50.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, -50.0, 0.0);
- glVertex3f(0.0, 50.0, 0.0);
- // Os Z
- glColor3f(0.0, 0.0, 1.0);
- glVertex3f(0.0, 0.0, -50.0);
- glVertex3f(0.0, 0.0, 50.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- glColor3f(1.0, 1.0, 1.0);
- // Przejscie w tryb modyfikacji macierzy przeksztalcen geometrycznych
- glMatrixMode(GL_MODELVIEW);
- // Zastapienie aktywnej macierzy macierza jednostkowa
- glLoadIdentity();
- // Ustalenie polozenia obserwatora
- glTranslatef(0, 0, obsOdl);
- glRotatef(rotObsX, 1, 0, 0);
- glRotatef(rotObsY, 0, 1, 0);
- glRotatef(rotObsZ, 0, 0, 1);
- // Narysowanie szescianu
- //RysujSzescian(bok);
- //rysujStozek(r, R, h);
- sfera(3, slacks, stacks);
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case '+':
- obsOdl = obsOdl < MIN_ODL ? obsOdl + 1.0 : MIN_ODL;
- break;
- case '-':
- obsOdl = obsOdl > MAX_ODL ? obsOdl - 1.0 : MAX_ODL;
- break;
- case 27:
- exit(0);
- }
- }
- void ObslugaKlawiszySpecjalnych(int klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case GLUT_KEY_UP:
- rotObsX++;
- break;
- case GLUT_KEY_DOWN:
- rotObsX--;
- break;
- case GLUT_KEY_LEFT:
- rotObsY++;
- break;
- case GLUT_KEY_RIGHT:
- rotObsY--;
- break;
- case GLUT_KEY_F1:
- rotObsZ--;
- break;
- case GLUT_KEY_F2:
- rotObsZ++;
- break;
- case GLUT_KEY_F3:
- slacks = slacks > MIN ? slacks - 1.0 : MIN;
- break;
- case GLUT_KEY_F4:
- slacks = slacks < MAX ? slacks + 1.0 : MAX;
- break;
- case GLUT_KEY_F5:
- stacks = stacks > MIN ? stacks - 1.0 : MIN;
- break;
- case GLUT_KEY_F6:
- stacks = stacks < MAX ? stacks + 1.0 : MAX;
- break;
- case GLUT_KEY_F7:
- xd1 = xd1 > MIN ? xd1 - 1.0 : MIN;
- break;
- case GLUT_KEY_F8:
- xd1 = xd1 < MAX ? xd1 + 1.0 : MAX;
- break;
- case GLUT_KEY_F9:
- xd2 = xd2 > MIN ? xd2 - 1.0 : MIN;
- break;
- case GLUT_KEY_F10:
- xd2 = xd2 < MAX ? xd2 + 1.0 : MAX;
- break;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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.0f, 0.0f, 0.3f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- // Zarejestrowanie funkcji (callback) odpowiedzialnej za
- glutDisplayFunc(WyswietlObraz);
- // Zarejestrowanie funkcji (callback) wywolywanej za kazdym razem kiedy
- // zmieniane sa rozmiary okna
- glutReshapeFunc(UstawParametryWidoku);
- // Zarejestrowanie funkcji obslugi klawiatury
- glutKeyboardFunc(ObslugaKlawiatury);
- glutSpecialFunc(ObslugaKlawiszySpecjalnych);
- // Zarejestrowanie funkcji wykonywanej gdy okno nie obsluguje
- // zadnych zadan
- glutIdleFunc(WyswietlObraz);
- // 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