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>
- // 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 0.0
- #define OBSERWATOR_FOV_Y 30.0
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- float odlmin = -300;
- float odlmax = 200;
- float DEG2RAD = 3.1415926535 / 180.0;
- float u = 4;
- float alfa = 360.0;
- float alfa1 = 30;
- float alfa2 = 360.0 / 4;
- float R = 2;
- float r = 0;
- float k = 0.1;
- float H = 10;
- float h = 3;
- float pom1;
- float pom2;
- int zmiana4 = 0;
- float pom3;
- float pom4;
- float l = 6;
- float r1 = 4;
- float podz_h = 1.0 / 4.0;
- float pom_podz_h = 4;
- int zrodlo1 = 1;
- int obecnymaterial = 2;
- int zrodlo2 = 1;
- int normalne = 1;
- int smooth = 1;
- int fill = 1;
- float vector1[3];
- float vector2[3];
- float vector3out[3];
- float n_vector1[3];
- float n_vector2[3];
- float n_vector3out[3];
- float il[3];
- float k_vector1[3];
- float k_vector2[3];
- float k_vector3out[3];
- float k_n_vector1[3];
- float k_n_vector2[3];
- float k_n_vector3out[3];
- float k_il[3];
- void vectorCreate(float fVecU[3], float fVecV[3], float fVecOut[3])
- {
- fVecOut[0] = fVecV[0]- fVecU[0];
- fVecOut[1] = fVecV[1] - fVecU[1];
- fVecOut[2] = fVecV[2] - fVecU[2];
- }
- void vectorCreate_iloczyn(float fVecU[3], float fVecV[3], float fVecOut[3])
- {
- fVecOut[0] = (fVecU[1] * fVecV[2] - fVecU[2] * fVecV[1]);
- fVecOut[1] = -(fVecU[0] * fVecV[2] - fVecU[2] * fVecV[0]);
- fVecOut[2] = (fVecU[0] * fVecV[1] - fVecU[1] * fVecV[0]);;
- }
- GLfloat swiatlo1[5][4] = {
- {1.0, 1.0, 1.0, 1.0}, // [0] otoczenie
- {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {0, 10.0, 0, 1.0},// [3] polozenie
- {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
- };
- // Tablica parametrow zrodla swiatla nr 1
- GLfloat swiatlo2[5][4] = {
- {1, 1, 1, 1.0}, // [0] otoczenie
- {1, 1, 1, 1.0}, // [1] rozproszenie
- {0, 1, 1, 1.0}, // [2] lustrzane
- {0, -10.0, 0.0, 1.0},// [3] polozenie
- {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
- };
- float material1[5][4] = {
- {0.192250, 0.192250, 0.192250, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.507540, 0.507540, 0.507540, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.508273, 0.508273, 0.508273, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {51.2, 0.0, 0.0, 0.0}, // [3] polysk
- {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
- // Tablica parametrow materialu nr 2
- float material2[5][4] = {
- {0.250000, 0.148000, 0.064750, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.400000, 0.236800, 0.103600, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.774597, 0.458561, 0.200621, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {76.8, 0.0, 0.0, 0.0}, // [3] polysk
- {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
- float material3[5][4] = {
- {0.247250, 0.199500, 0.074500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.751640, 0.606480, 0.226480, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.628281, 0.555802, 0.366065, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {52.2, 0.0, 0.0, 0.0}, // [3] polysk
- {0.0, 0.0, 0.0, 1.0} }; // [4] kolor swiatla emitowanego
- void UstawSwiatlaIMaterialy()
- {
- glEnable(GL_LIGHTING);
- // Odblokowanie zrodla swiatla nr 1
- if (zrodlo1 == 1) {
- glEnable(GL_LIGHT0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, swiatlo1[0]);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, swiatlo1[1]);
- glLightfv(GL_LIGHT0, GL_SPECULAR, swiatlo1[2]);
- glLightfv(GL_LIGHT0, GL_POSITION, swiatlo1[3]);
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, swiatlo1[4]);
- }
- else {
- //wylaczenie zrodla swiatla nr 1
- glDisable(GL_LIGHT0);
- }
- // Odblokowanie zrodla swiatla nr 2
- if (zrodlo2 == 1) {
- glEnable(GL_LIGHT1);
- glLightfv(GL_LIGHT1, GL_AMBIENT, swiatlo2[0]);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, swiatlo2[1]);
- glLightfv(GL_LIGHT1, GL_SPECULAR, swiatlo2[2]);
- glLightfv(GL_LIGHT1, GL_POSITION, swiatlo2[3]);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, swiatlo2[4]);
- }
- else {
- //wylaczenie zrodla swiatla nr 2
- glDisable(GL_LIGHT1);
- }
- switch (obecnymaterial)
- {
- case 0:
- 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]);
- break;
- case 1:
- 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]);
- break;
- case 2:
- 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]);
- break;
- default:
- break;
- }
- }
- void RysujTekstRastrowy(void* font, char* tekst)
- {
- int i = 0;
- while (tekst[i] != '\0')
- {
- glutBitmapCharacter(font, tekst[i]);
- i++;
- }
- }
- #define numberofoptions 11
- void RysujNakladke(void)
- {
- char tab[numberofoptions][50] =
- { "+ - PRZYBLIZENIE",
- " - -ODDALENIE",
- "G/H - ZMNIEJSZANIE ILOSCI PODZIALOW",
- "V/B - ZWIEKSZANIE ILOSCI PODZIALOW",
- "1 - Zmiana materialu pierscienia",
- "6 - Sterowanie swiatlem I",
- "7 - Sterowanie swiatlem II",
- "2 - Widocznosc normalnych",
- "i - GL_SMOOTH <-> GL_FLAT",
- "u - GL_FILL <-> GL_LINE",
- "w/s, a/d, q/e - Sterowanie osia x,y,z",
- };
- int i;
- // 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 ZRODLA SWIATLA
- for (i = 0; i < numberofoptions; i++)
- {
- glRasterPos2i(10, 10 + i * 13);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, tab[numberofoptions - i - 1]);
- }
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
- GLfloat odleglosc_ob = OBSERWATOR_ODLEGLOSC;
- GLfloat rot_x = OBSERWATOR_OBROT_X;
- GLfloat rot_y = OBSERWATOR_OBROT_Y;
- GLfloat rot_z = OBSERWATOR_OBROT_Z;
- // 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).
- stozek2_wektor(void)
- {
- for (int j = 0; j < 4; j++)
- {
- /*
- glBegin(GL_LINES);
- glColor3f(1,0,0);
- glVertex3f(0,0,0);
- glVertex3f(0,-1,0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
- glVertex3f((float)(2 * cos(pom1)), -1, (float)(2 * sin(pom1)));
- }
- glEnd();
- */
- glColor3f(1, 0, 0);
- for (int j = 1; j * podz_h <= 1; j++)
- {
- glBegin(GL_LINES);
- if (j % 2 == 0)
- glColor3f(1, 1, 0);
- else
- glColor3f(1, 0.5, 0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- pom2 = DEG2RAD * ((i - 1) * alfa2);
- pom2 = DEG2RAD * ((i + 1) * alfa2);
- vector1[0] = 2 * (1 - (j - 1) * podz_h) * cos(pom1);
- vector1[1] = 4 * ((j - 1) * podz_h);
- vector1[2] = 2 * (1 - (j - 1) * podz_h) * sin(pom1);
- vector2[0] = 2 * (1 - j * podz_h) * cos(pom1);
- vector2[1] = 4 * (j * podz_h);
- n_vector2[2] = 2 * (1 - j * podz_h) * sin(pom1);
- n_vector2[0] = 2 * (1 - j * podz_h) * cos(pom2);
- n_vector2[1] = 4 * (j * podz_h);
- vector2[2] = 2 * (1 - j * podz_h) * sin(pom2);
- vectorCreate(vector1, vector2, vector3out);
- vectorCreate(vector1, n_vector2, n_vector3out);
- vectorCreate_iloczyn(vector3out, n_vector3out, il);
- // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
- // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)) + il[0] / il[1], 4 * ((j - 1) * podz_h) + 1, (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)) + il[2] / il[1]);
- glVertex3f((float)(2 * (1 - (j -1)* podz_h) * cos(pom1)), 4 * ((j-1) * podz_h), (float)(2 * (1 - (j-1)* podz_h) * sin(pom1)));
- glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom1) + il[0]/il[1])), (4 * ((j-1) * podz_h) + il[1] / il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom1)) + il[2] / il[1]));
- // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
- // glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom3) + k_il[0] / k_il[1])), (4 * ((j - 1) * podz_h) + k_il[1] / k_il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom3)) + k_il[2] / k_il[1]));
- k_il[0] = il[0];
- k_il[1] = il[1];
- k_il[2] = il[2];
- // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom2)));
- // glVertex3f(((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)) + il[0]), (4 * ((j - 1) * podz_h) + il[1]), ((float)(2 * (1 - (j - 1) * podz_h) * sin(pom2)) + il[2]));
- // glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom2)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1)* podz_h) * sin(pom2)));
- // glVertex3f((float)((2 * (1 - (j - 1) * podz_h) * cos(pom2) + il[0] / il[1])), (4 * ((j - 1) * podz_h) + il[1]/il[1]), (float)((2 * (1 - (j - 1) * podz_h) * sin(pom2)) + il[2]/il[1]));
- }
- glEnd();
- /* glBegin(GL_QUAD_STRIP);
- if (j % 2 == 0)
- glColor3f(0, 1, 0);
- else
- glColor3f(0, 0.8, 0);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- glBegin(GL_QUAD_STRIP);
- if (j % 2 == 0)
- glColor3f(0, 1, 1);
- else
- glColor3f(0, 0.8, 0.8);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- */
- }
- }
- }
- void stozek(void)
- {
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, 0, 0);
- for (int i = 0; i * alfa2 <= 360.0; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f(20 * cos(pom1), 0, 20 * sin(pom1));
- }
- glEnd();
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, 25, 0);
- for (int i = 0; i * alfa2 <= 360.0; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f((float)(10 * cos(pom1)), 25, 10 * sin(pom1));
- }
- glEnd();
- for (int i = 0; i * alfa2 <= 360.0; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- pom2 = DEG2RAD * ((i + 1) * alfa2);
- glBegin(GL_QUADS);
- glVertex3f((float)(20 * cos(pom1)), 0, (float)(20 * sin(pom1)));
- glVertex3f((float)(10 * cos(pom1)), 25, (float)(10 * sin(pom1)));
- glVertex3f((float)(10 * cos(pom2)), 25, (float)(10 * sin(pom2)));
- glVertex3f((float)(20 * cos(pom2)), 0, (float)(20 * sin(pom2)));
- glEnd();
- }
- }
- test(void)
- {
- glBegin(GL_LINES);
- {
- glVertex3f(0, 0, 0);
- glVertex3f(1, 1, 0);
- glVertex3f(0, 0, 0);
- glVertex3f(0, 1, 1);
- vector1[0] = 0;
- vector1[1] = 0;
- vector1[2] = 0;
- vector2[0] = 1;
- vector2[1] = 1;
- vector2[2] = 0;
- n_vector2[0] = 0;
- n_vector2[1] = 1;
- n_vector2[2] = 1;
- vectorCreate(vector1, vector2, vector3out);
- vectorCreate(vector1, n_vector2, n_vector3out);
- vectorCreate_iloczyn(vector3out,n_vector3out, il);
- glVertex3f(0, 0, 0);
- glVertex3f(-il[0], -il[1], -il[2]);
- }
- glEnd();
- }
- stozek2(void)
- {
- for (int j = 0; j < 4; j++)
- {
- glBegin(GL_TRIANGLE_FAN);
- glColor3f(1, 0, 0);
- glNormal3f(0, 1, 0);
- glVertex3f(0, 0, 0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
- }
- glEnd();
- glColor3f(1, 0, 0);
- for (int j = 1; j * podz_h <= 1; j++)
- {
- glBegin(GL_QUAD_STRIP);
- if (j % 2 == 0)
- glColor3f(1, 1, 0);
- else
- glColor3f(1, 0.5, 0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glNormal3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 2 * (1 - (j ) * podz_h)/(4 * ((j - 1) * podz_h)), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
- glNormal3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 2 * (1 - (j )* podz_h)/ (4 * (j * podz_h)), (float)(2 * (1 - j * podz_h) * sin(pom1)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(pom1)));
- }
- glEnd();
- glBegin(GL_QUAD_STRIP);
- if (j % 2 == 0)
- glColor3f(0, 1, 0);
- else
- glColor3f(0, 0.8, 0);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- glBegin(GL_QUAD_STRIP);
- if (j % 2 == 0)
- glColor3f(0, 1, 1);
- else
- glColor3f(0, 0.8, 0.8);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- }
- }
- }
- stozek3(void)
- {
- for (int j = 0; j < 4; j++)
- {
- glBegin(GL_TRIANGLE_FAN);
- glColor3f(1, 0, 0);
- glVertex3f(0, 0, 0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f((float)(2 * cos(pom1)), 0, (float)(2 * sin(pom1)));
- }
- glEnd();
- glColor3f(1, 0, 0);
- for (int j = 1; j * podz_h <= 1; j++)
- {
- glBegin(GL_TRIANGLE_STRIP);
- if (j % 2 == 0)
- glColor3f(1, 1, 0);
- else
- glColor3f(1, 0.5, 0);
- for (int i = 0; i * alfa2 <= 360.0 * 0.75; i++)
- {
- pom1 = DEG2RAD * (i * alfa2);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(pom1)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(pom1)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(pom1)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(pom1)));
- }
- glEnd();
- glBegin(GL_TRIANGLE_STRIP);
- // if (j % 2 == 0)
- glColor3f(0, 1, 0);
- // else
- // glColor3f(0, 0.8, 0);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 0)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 0)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 0)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- glBegin(GL_TRIANGLE_STRIP);
- // if (j % 2 == 0)
- glColor3f(0, 1, 1);
- // else
- // glColor3f(0, 0.8, 0.8);
- glVertex3f((float)(2 * (1 - (j - 1) * podz_h) * cos(DEG2RAD * 270)), 4 * ((j - 1) * podz_h), (float)(2 * (1 - (j - 1) * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f((float)(2 * (1 - j * podz_h) * cos(DEG2RAD * 270)), 4 * (j * podz_h), (float)(2 * (1 - j * podz_h) * sin(DEG2RAD * 270)));
- glVertex3f(0, 4 * ((j - 1) * podz_h), 0);
- glVertex3f(0, 4 * (j * podz_h), 0);
- glEnd();
- }
- }
- }
- void X_Y_Z(void)
- {
- glPushMatrix();
- glBegin(GL_LINES);
- //x
- glColor3f(1, 0, 0);
- glVertex3f(-30, 0, 0);
- glVertex3f(30, 0, 0);
- //y
- glColor3f(0, 1, 0);
- glVertex3f(0, -30, 0);
- glVertex3f(0, 30, 0);
- //z
- glColor3f(0, 0, 1);
- glVertex3f(0, 0, -30);
- glVertex3f(0, 0, 30);
- glEnd();
- }
- void RysujSzescian(double a)
- {
- // Sciany boczne
- glBegin(GL_QUAD_STRIP);
- glColor3f(1, 0, 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);
- glColor3f(0, 1, 0);
- glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
- glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
- glColor3f(0, 0, 1);
- glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
- glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
- glColor3f(0, 1, 1);
- 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();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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, -odleglosc_ob);
- glRotatef(rot_x, 1, 0, 0);
- glRotatef(rot_y, 0, 1, 0);
- glRotatef(rot_z, 0, 0, 1);
- RysujNakladke();
- UstawSwiatlaIMaterialy();
- // Narysowanie szescianu
- // RysujSzescian(bok);
- //X_Y_Z();
- stozek2();
- stozek2_wektor();
- //test();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- if (zmiana4 == 0)
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- else if (zmiana4 == 1)
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- if (smooth)
- glShadeModel(GL_SMOOTH);
- else
- glShadeModel(GL_FLAT);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- if (klawisz == '-' && odleglosc_ob <= odlmax)
- odleglosc_ob += 1;
- else if (klawisz == '+' && odleglosc_ob >= odlmin)
- odleglosc_ob -= 1;
- else if (klawisz == 'w')
- rot_x += 1.0;
- else if (klawisz == 's')
- rot_x -= 1.0;
- else if (klawisz == 'd')
- rot_y -= 1.0;
- else if (klawisz == 'a')
- rot_y += 1.0;
- else if (klawisz == 'e')
- rot_z -= 1.0;
- else if (klawisz == 'q')
- rot_z += 1.0;
- else if (klawisz == 'b' && r1 >= 4 && r1 < 64)
- {
- r1 += 1;
- alfa2 = 360 * 3 / 4 / r1;
- }
- else if (klawisz == 'v' && r1 > 4 && r1 <= 64)
- {
- r1 -= 1;
- alfa2 = 360 * 3 / 4 / r1;
- }
- else if (klawisz == 'h' && pom_podz_h >= 4 && pom_podz_h < 64)
- {
- pom_podz_h++;
- podz_h = 1.0 / pom_podz_h;
- }
- else if (klawisz == 'g' && pom_podz_h > 4 && pom_podz_h <= 64)
- {
- pom_podz_h--;
- podz_h = 1.0 / pom_podz_h;
- }
- else if (klawisz == 'u' && zmiana4 == 0)
- {
- zmiana4 = 1;
- }
- else if (klawisz == 'u' && zmiana4 == 1)
- {
- zmiana4 = 0;
- }
- else if (klawisz == '6' && zrodlo1 == 0)
- {
- zrodlo1 = 1;
- }
- else if (klawisz == '6' && zrodlo1 == 1)
- {
- zrodlo1 = 0;
- }
- else if (klawisz == '7' && zrodlo2 == 0)
- {
- zrodlo2 = 1;
- }
- else if (klawisz == '7' && zrodlo2 == 1)
- {
- zrodlo2 = 0;
- }
- else if (klawisz == '1' && obecnymaterial == 0)
- {
- obecnymaterial = 1;
- }
- else if (klawisz == '1' && obecnymaterial == 1)
- {
- obecnymaterial = 2;
- }
- else if (klawisz == '1' && obecnymaterial == 2)
- {
- obecnymaterial = 0;
- }
- else if (klawisz == 'i' && smooth == 0)
- {
- smooth = 1;
- }
- else if (klawisz == 'i' && smooth == 1)
- {
- smooth = 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.0f, 0.0f);
- // Wlaczenie wyswietlania wielokatow w postaci obrysow (przydatne w celach diagnostycznych).
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- // 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