Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Zadanie 17
- Materiały:
- 1. Właściwości materiału nr 1: fioletowy błyszczący (widziany w białym świetle),
- 2. Właściwości materiału nr 2: zielony matowy (widziany w białym świetle),
- 3. Właściwości materiału nr 3: jadeit
- Źródła światła:
- Źródło nr 1:
- - typ: reflektor (ang. spot),
- - kolor: biały,
- - natężenie: 1,
- - kąt odcięcia: 30o,
- - położenie: zmienne po orbicie kołowej o środku w punkcie S(0,0,0) z możliwością interaktywnej zmiany następujących parametrów:
- o promienia orbity,
- o prędkości kątowej (3 różne prędkości),
- o kąta nachylenia orbity do osi OX,
- - kierunek świecenia: na obiekt.
- Źródło nr 2:
- - typ: kierunkowe,
- - kolor: żółty,
- - natężenie: 0.7,
- - położenie: stałe w punkcie P(-10,1 0, 10) układu współrzędnych sceny.
- - kierunek świecenia: na obiekt.
- */
- //////////////////////////////////////////////////////////////////////////////////////////
- //
- // Program wyswietlajacy szescian w rzucie perspektywicznym. Dlugosc boku szescianu
- // moze byc interaktywnie zmieniana za pomoca klwiszy '+' i '-'.
- //
- //////////////////////////////////////////////////////////////////////////////////////////
- #include <GL/glut.h>
- #include <math.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_FOV_Y 30.0
- #define X_OFFSET_OBIEKT 10
- #define Y_OFFSET_OBIEKT 300
- #define ID_MENU_SWIATLA 0
- #define ID_MENU_MATERIALU 1
- #define LPOZ_MENU_SWIATLA 10
- #define LPOZ_MENU_MATERIALU 5
- #define PI 3.1415926535
- #define DEG2RAD(x) ((float)(x)*PI/180.0)
- #define dAlfa (360.0/N)
- // Zmienne globalne
- double N = 8;
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- int q = 0;
- int r = 0;
- int po = 0;
- int op = 0;
- int p;
- double promien_obrotu = 10;
- GLfloat predkosc_katowa = 1;
- GLfloat predkosc = 0.1;
- GLfloat kat_nachylenia = 0;
- GLfloat odleglosc = -100.0;
- GLfloat min = -10.0;
- GLfloat max = -300.0;
- GLfloat ob0x = 20.0;
- GLfloat ob0y = 20.0;
- GLfloat ob0z = 0.0;
- int menu; // Identyfikator wybranego menu (menu swiatla lub menu materialu)
- // Prototypy funkcji
- void RysujSzescian(double a);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void RysujTekstRastrowy(void *font, char *tekst)
- {
- int i;
- for (i = 0; i < (int)strlen(tekst); i++)
- glutBitmapCharacter(font, tekst[i]);
- }
- void RysujNakladke(void)
- {
- char buf[255];
- // Zmiana typu rzutu z perspektywicznego na ortogonalny
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glLoadIdentity();
- glOrtho(0.0, szerokoscOkna, 0.0, wysokoscOkna, -100.0, 100.0);
- // Modelowanie sceny 2D (zawartosci nakladki)
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- // Zablokowanie oswietlenia (mialoby ono wplyw na kolor tekstu)
- glDisable(GL_LIGHTING);
- // Okreslenie koloru tekstu
- glColor3f(1.0, 1.0, 1.0);
- // RYSOWANIE MENU PARAMETROW WALCA
- glColor3f(1.0, 1.0, 1.0);
- //sprintf(buf, "Walec:");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "MENU");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 30);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zwieksz promien orbity (>)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 40);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz promien orbity (<)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 50);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 1 (1)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 60);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 2 (2)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 70);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Material 3 (3)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 80);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "glShadeModel(GL_FLAT) (h)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 90);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "glShadeModel(GL_SMOOTH) (j)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 100);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz liczbe podzialow bryly (z)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 110);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz liczbe podzialow bryly (x)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 120);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Rysuj wektory normalne (k)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 130);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Ukryj wektory normalne (l)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 140);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmien tryb rysowania na GL_FILL (O)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 150);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmien tryb rysowania na GL_LINE (P)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 160);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wlacz swiatlo nr 1 (4)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 170);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wylacz swiatlo nr 1 (5)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 180);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wlacz swiatlo nr 2 (6)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 190);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Wylacz swiatlo nr 2 (7)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 200);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "1 predkosc swiatla (b)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 210);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "2 predkosc swiatla (n)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 220);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "3 predkosc swiatla (m)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 230);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zwiększ kąt nachylenia swiatla (N)");
- glRasterPos2i(X_OFFSET_OBIEKT, Y_OFFSET_OBIEKT - 240);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, "Zmniejsz kąt nachylenia swiatla (M)");
- // Przywrocenie macierzy sprzed wywolania funkcji
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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
- glColor3f(1, 1, 0);
- 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
- glColor3f(1, 0, 0);
- 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
- glColor3f(1, 0, 0);
- 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 wlaczswiatlo1()
- {
- GLfloat swiatlo[5][4] = { {0.0, 0.0, 0.0, 0.7}, //[0] światło otoczenia
- {1.0, 1.0, 0, 1.0}, //[1] światło rozproszone
- {1.0, 1.0, 0, 1.0}, //[2] światło zwierciadlane
- {-10, 10, 10, 0} }; //[3] położenie
- // {10, -10, -10, 1} }; //[4] kierunek świecenia
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo[3]);
- //glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo[4]);
- }
- void wlaczswiatlo2()
- {
- GLfloat x, y, z;
- predkosc_katowa += predkosc;
- x = promien_obrotu * cos(DEG2RAD(predkosc_katowa*dAlfa));
- z = promien_obrotu * sin(DEG2RAD(predkosc_katowa*dAlfa));
- y = promien_obrotu * sin(DEG2RAD(kat_nachylenia*dAlfa));
- GLfloat swiatlo[5][4] = { {0.0, 0.0, 0.0, 1.0}, //[0] światło otoczenia
- {1.0, 1.0, 1.0, 1.0}, //[1] światło rozproszone
- {0.540000, 0.540000, 0.540000, 0.540000}, //[2] światło zwierciadlane
- {x, y, z, 1}, //[3] położenie
- {-x, -y, -z, 1} }; //[4] kierunek świecenia
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo[3]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo[4]);
- }
- void ustawmaterial1() { //1. Właściwości materiału nr 1: fioletowy błyszczący (widziany w białym świetle),
- float material[5][4] = { {0, 0, 0, 1}, //[0] współczynnik odbicia światła otoczenia
- {0.8, 0.49, 0.96, 1}, //[1] współczynnik odbicia światła rozproszonego
- {0.75, 0.011, 1, 1}, //[2] współczynnik odbicia światła lustrzanego
- {100, 0, 0, 0}, //[3] połysk
- {0, 0, 0, 0} }; //[4] kolor światła emitowanego
- glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
- }
- void ustawmaterial2() { //2. Właściwości materiału nr 2: zielony matowy (widziany w białym świetle),
- float material[5][4] = { {0, 0, 0, 0}, //[0] współczynnik odbicia światła otoczenia
- {0.540000, 0.958, 0.540000, 0.540000}, //[1] współczynnik odbicia światła rozproszonego
- {0.0042, 0.005400, 0.0042, 0.0042}, //[2] współczynnik odbicia światła lustrzanego
- {0.0042, 0, 0, 0}, //[3] połysk
- {0, 0, 0, 0} }; //[4] kolor światła emitowanego
- glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
- }
- void ustawmaterial3() { //3. Właściwości materiału nr 3: jadeit
- float material[5][4] = { {0.135000, 0.222500, 0.157500, 0.950000}, //[0] współczynnik odbicia światła otoczenia
- {0.540000, 0.890000, 0.630000, 0.950000}, //[1] współczynnik odbicia światła rozproszonego
- {0.316228, 0.316228, 0.316228, 0.950000}, //[2] współczynnik odbicia światła lustrzanego
- {12.8, 0, 0, 0}, //[3] połysk
- {0, 0, 0, 0} }; //[4] kolor światła emitowanego
- glMaterialfv(GL_FRONT, GL_AMBIENT, material[0]);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, material[1]);
- glMaterialfv(GL_FRONT, GL_SPECULAR, material[2]);
- glMaterialfv(GL_FRONT, GL_SHININESS, material[3]);
- glMaterialfv(GL_FRONT, GL_EMISSION, material[4]);
- }
- void stozek() {
- float R = 10.0;
- float r = 15.0;
- float h = 15.0;
- int i;
- glBegin(GL_TRIANGLE_FAN);
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(0.0, 0.0, 0.0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glBegin(GL_TRIANGLE_FAN);
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(0.0, h, 0.0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glBegin(GL_TRIANGLE_STRIP);
- glColor3f(0.0, 1.0, 0.0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
- glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- }
- void swiatlo(int q) {
- if (q == 1) {
- wlaczswiatlo2();
- }
- if (q == 2) {
- wlaczswiatlo1();
- }
- if (q == 0) {
- glDisable(GL_LIGHTING);
- }
- }
- void material(int p) {
- if (p == 1) {
- ustawmaterial1();
- }
- if (p == 2) {
- ustawmaterial2();
- }
- if (p == 3) {
- ustawmaterial3();
- }
- }
- //7.(Y3) stożek ścięty w trybie GL_QUAD_STRIP o promieniu dolnej podstawy 3 i jej środku
- //w punkcie (0, 0, 0), oraz promieniu górnej podstawy 1, wysokości 2.
- void stozek3() {
- float R = 3.0;
- float r = 1.0;
- float h = 2.0;
- float i, j;
- float x, y, z, R1 = R;
- swiatlo(q);
- material(p);
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(0, -1, 0);
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, 0.0, 0.0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glNormal3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
- glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(0, 1, 0);
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, h, 0.0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glNormal3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
- glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glColor3f(1.0, 0.0, 0.0);
- for (y = 0; (y <= h) && (R1 >= r); y += h / N, R1 -= ((R - r) / N)) {
- for (i = 0.0; i*dAlfa < 360; i++) {
- glBegin(GL_QUAD_STRIP);
- x = R1 * cos(DEG2RAD(i*dAlfa));
- z = R1 * sin(DEG2RAD(i*dAlfa));
- glNormal3f(x, y, z);
- glVertex3f(x, y, z);
- if (y + h / N < h) {
- x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
- z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
- glNormal3f(x, (y + h / N), z);
- glVertex3f(x, (y + h / N), z);
- }
- else {
- x = r * cos(DEG2RAD(i*dAlfa));
- z = r * sin(DEG2RAD(i*dAlfa));
- glNormal3f(x, h, z);
- glVertex3f(x, h, z);
- }
- i++;
- x = R1 * cos(DEG2RAD(i*dAlfa));
- z = R1 * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, y, z);
- if (y + h / N < h) {
- x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
- z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, (y + h / N), z);
- }
- else {
- x = r * cos(DEG2RAD(i*dAlfa));
- z = r * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, h, z);
- }
- i--;
- glNormal3f(cos(DEG2RAD(i*dAlfa)), (y + h / N), sin(DEG2RAD(i*dAlfa)));
- glEnd();
- }
- }
- }
- void norstozek3() {
- float R = 3.0;
- float r = 1.0;
- float h = 2.0;
- float i, j;
- float x, y, z, R1 = R;
- glBegin(GL_LINES);
- glColor3f(1, 1, 1);
- glVertex3f(0, 0, 0);
- glVertex3f(0, -1, 0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f(R*cos(DEG2RAD(i*dAlfa)), 0.0, R*sin(DEG2RAD(i*dAlfa)));
- glVertex3f(R*cos(DEG2RAD(i*dAlfa)), -1, R*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glBegin(GL_LINES);
- glColor3f(1, 1, 1);
- glVertex3f(0, h, 0);
- glVertex3f(0, h + 1, 0);
- for (i = 0; i*dAlfa <= 360.0; i++)
- {
- glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h, r*sin(DEG2RAD(i*dAlfa)));
- glVertex3f(r*cos(DEG2RAD(i*dAlfa)), h + 1, r*sin(DEG2RAD(i*dAlfa)));
- }
- glEnd();
- glColor3f(1, 1, 1);
- for (y = 0; (y <= h) && (R1 >= r); y += h / N, R1 -= ((R - r) / N)) {
- for (i = 0.0; i*dAlfa < 360; i++) {
- glBegin(GL_LINES);
- x = R1 * cos(DEG2RAD(i*dAlfa));
- z = R1 * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, y, z);
- glVertex3f(x + cos(DEG2RAD(i*dAlfa)), y + 1, z + sin(DEG2RAD(i*dAlfa)));
- if (y + h / N < h) {
- x = (R1 - ((R - r) / N)) * cos(DEG2RAD(i*dAlfa));
- z = (R1 - ((R - r) / N)) * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, (y + h / N), z);
- glVertex3f(x + cos(DEG2RAD(i*dAlfa)), (y + h / N) + 1, z + sin(DEG2RAD(i*dAlfa)));
- }
- else {
- x = r * cos(DEG2RAD(i*dAlfa));
- z = r * sin(DEG2RAD(i*dAlfa));
- glVertex3f(x, h, z);
- glVertex3f(x + cos(DEG2RAD(i*dAlfa)), h + 1, z + sin(DEG2RAD(i*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);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja wyswietlajaca pojedyncza klatke animacji
- void WyswietlObraz(void)
- {
- if (po == 0) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- else glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- if (op == 0) glShadeModel(GL_FLAT);
- else glShadeModel(GL_SMOOTH);
- // 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, odleglosc);
- glRotatef(ob0x, 1, 0, 0);
- glRotatef(ob0y, 0, 1, 0);
- glRotatef(ob0z, 0, 0, 1);
- // uklad();
- // Narysowanie szescianu
- // RysujSzescian(bok);
- if (r == 1) norstozek3();
- stozek3();
- // Narysowanie tekstow z opisem parametrow oswietlenia i materialu
- RysujNakladke();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- if (klawisz == '-')
- {
- if (odleglosc - 1 < max);
- else
- {
- odleglosc -= 5;
- }
- }
- else if (klawisz == '+')
- {
- if (odleglosc + 1 > min);
- else
- {
- odleglosc += 5;
- }
- }
- else if (klawisz == 'w')
- ob0x++;
- else if (klawisz == 's')
- ob0x--;
- else if (klawisz == 'a')
- ob0y++;
- else if (klawisz == 'd')
- ob0y--;
- else if (klawisz == 'q')
- ob0z++;
- else if (klawisz == 'e')
- ob0z--;
- else if (klawisz == 'z')
- {
- if (N - 1 < 4);
- else
- {
- N -= 1;
- }
- }
- else if (klawisz == 'x')
- {
- if (N + 1 > 64);
- else
- {
- N += 1;
- }
- }
- else if (klawisz == '4')
- q = 1;
- else if (klawisz == '5')
- q = 0;
- else if (klawisz == '6')
- q = 2;
- else if (klawisz == '7')
- q = 0;
- else if (klawisz == 'k')
- r = 1;
- else if (klawisz == 'l')
- r = 2;
- else if (klawisz == '1')
- p = 1;
- else if (klawisz == '2')
- p = 2;
- else if (klawisz == '3')
- p = 3;
- else if (klawisz == '#')
- p = 0;
- else if (klawisz == 'O')
- po = 0;
- else if (klawisz == 'P')
- po = 1;
- else if (klawisz == 'h')
- op = 0;
- else if (klawisz == 'j')
- op = 1;
- else if (klawisz == '<')
- promien_obrotu -= 1;
- else if (klawisz == '>')
- promien_obrotu += 1;
- else if (klawisz == 'b')
- predkosc = 0.01;
- else if (klawisz == 'n')
- predkosc = 0.1;
- else if (klawisz == 'm')
- predkosc = 0.5;
- else if (klawisz == 'N')
- kat_nachylenia += 1;
- else if (klawisz == 'M')
- kat_nachylenia -= 1;
- 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.0f, 0.0f, 0.3f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- // 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