Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //ZESTAW 7, ZADANIE 14 - Indywidualne
- #include <GL/glut.h>
- #include "math.h"
- #include "materials.h"
- #include <stdio.h>
- // Definicja stalych
- #define DLUGOSC_BOKU 10.0
- #define OBSERWATOR_ODLEGLOSC 20.0
- #define OBSERWATOR_OBROT_X 20.0
- #define OBSERWATOR_OBROT_Y 20.0
- #define OBSERWATOR_FOV_Y 30.0
- int zmienna = 5;
- int zmienna2 = 5;
- int smooth = 1;
- int fill = 1;
- int zrodlo1 = 1;
- int zrodlo2 = 1;
- int obecnymaterial = 0;
- int normalne = 1;
- int promien = 10;
- float v = 10;
- float v1, v2, v3;
- float kat;
- int zmien = 1;
- float material1[5][4] = {
- {0.174500, 0.011750, 0.011750, 0.550000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.614240, 0.041360, 0.041360, 0.550000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.727811, 0.626959, 0.626959, 0.550000}, // [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
- // Tablica parametrow materialu nr 2
- float material2[5][4] = {
- {1, 1, 1, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {1, 1, 1, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {1, 1, 1, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {0, 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.174500, 0.011750, 0.011750, 0.550000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.614240, 0.041360, 0.041360, 0.550000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.727811, 0.626959, 0.626959, 0.550000}, // [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
- // Tablica parametrow zrodla swiatla nr 1
- GLfloat swiatlo1[5][4] =
- {
- {0.8, 0.8, 0, 1.0}, // [0] otoczenie
- {0.1, 0.2, 0.3, 1.0}, // [1] rozproszenie
- {0.2, 0.8, 1, 1.0}, // [2] lustrzane
- {5, 10, 0, 1.0},// [3] polozenie
- {1.0, 1.0, 1.0, 0.0}// [4] kierunek swiecenia
- };
- // Tablica parametrow zrodla swiatla nr 2
- GLfloat swiatlo2[5][4] = {
- {0, 1, 1, 1.0}, // [0] otoczenie
- {0, 0.2, 0.5, 1.0}, // [1] rozproszenie
- {0, 18, 1, 1.0}, // [2] lustrzane
- {10.0, -10.0, 10.0, 1.0},// [3] polozenie
- {-1.0, -1.0, -1.0, 0.0}// [4] kierunek swiecenia
- };
- // Zmienne globalne
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- int zm1 = 1;
- int a = 5;
- float length;
- GLfloat minOdl = -10.0;
- GLfloat maxOdl = -200.0;
- GLfloat obsOdl = -30.0;
- GLfloat rotObsY = 40.0;
- GLfloat rotObsX = 40.0;
- GLfloat rotObsZ = 0.0;
- // Prototypy funkcji
- void RysujSzescian(int N);
- void UstawParametryWidoku(int szer, int wys);
- void WyswietlObraz(void);
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y);
- void ObslugaKlawiszySpecjalnych(int 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 PoliczNormal(float x1, float x2, float x3, float y1, float y2, float y3, float z1, float z2, float z3, float* normal)
- {
- float xa = x2 - x1;
- float ya = y2 - y1;
- float za = z2 - z1;
- float xb = x3 - x1;
- float yb = y3 - y1;
- float zb = z3 - z1;
- normal[0] = ya * zb - za * yb;
- normal[1] = za * xb - xa * zb;
- normal[2] = xa * yb - ya * xb;
- //normalizacja
- length = sqrtf(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
- normal[0] /= length;
- normal[1] /= length;
- normal[2] /= length;
- }
- 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++;
- }
- }
- void RysujNakladke(void)
- {
- char tab[13][50] =
- { "+ - Oddalenie",
- "- - Przyblizenie",
- "p - Zmiana materialu stozka",
- "o - Sterowanie swiatlem nr. 1",
- "u - Sterowanie swiatlem nr. 2",
- "i - Widocznosc wektorow normalnych",
- "7 - Zmiana cienia (GL_SMOOTH i GL_FLAT)",
- "6 ^ - Zmiana wypelnienia (GL_FILL, GL_LINE)",
- "1 - Zmniejszanie ilosci podzialow pionowych",
- "2 - Zwiekszanie ilosci podzialow pionowych ",
- "4- Zmniejszanie ilosci podzialow poziomych",
- "5- Zwiekszenie ilosci podzialow poziomych",
- "Strzałki + zx - Sterowanie kamera",
- };
- int i;
- // Zmiana typu rzutu z perspektywicznego na ortogonalny
- glDisable(GL_LIGHTING);
- 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();
- // Okreslenie koloru tekstu
- glColor3f(1.0, 1.0, 1.0);
- // RYSOWANIE MENU PARAMETROW ZRODLA SWIATLA
- for (i = 0;i < 13;i++)
- {
- glRasterPos2i(10, 10 + i * 13);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, tab[13 - i - 1]);
- }
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- glEnable(GL_LIGHTING);
- }
- void RysujStozekBezPodstaw(float R, float r, float y, float h, int n)
- {
- float alfa;
- int i;
- float x;
- float z;
- float normal[3];
- float x1, x2, x3, z1, z2, z3, y1, y2, y3, xa, za;
- glBegin(GL_QUAD_STRIP);
- alfa = 90.0 / n; //kat
- for (i = 0; i <= n; i++)
- {
- x = cos(0.0174532925f * i * alfa);
- z = sin(0.0174532925f * i * alfa);
- xa = cos(0.0174532925f * (i + 1) * alfa);
- za = sin(0.0174532925f * (i + 1) * alfa);
- glVertex3f(x * R, y + 0, z * R);
- glVertex3f(x * r, y + h, z * r);
- }
- x = cos(0.0);
- z = sin(0.0);
- // glVertex3f(R, y + 0, 0);
- // glVertex3f(r, y + h, 0);
- glEnd();
- }
- void RysujKolo(float R, float y, int n)
- {
- float alfa;
- int i;
- float x;
- float z;
- glColor3f(0.0, 0.0, 1.0);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(0, y, 0);
- alfa = 90.0f / n;
- for (i = 0; i <= n; i++)
- {
- x = cos(0.0174532925f * i * alfa);
- z = sin(0.0174532925f * i * alfa);
- glVertex3f(x * R, y + 0, z * R);
- }
- x = cos(0.0);
- z = sin(0.0);
- glVertex3f(x * R, y + 0, z * R);
- glEnd();
- }
- void ScianaBoczna(float R, float h)
- {
- glColor3f(1, 0.0, 0.5); // sciana boczna
- glBegin(GL_QUAD_STRIP);
- glVertex3f(R, 0, 0);
- glVertex3f(R, h, 0);
- glVertex3f(0, 0, 0);
- glVertex3f(0, h, 0);
- glVertex3f(0, 0, R);
- glVertex3f(0, h, R);
- glEnd();
- }
- void RysujWektory(float R, float r, float y, float h, int n)
- {
- float alfa;
- int i;
- float x;
- float z;
- float normal[3];
- float x1, x2, x3, z1, z2, z3, y1, y2, y3, xa, za;
- alfa = 90.0 / n; //kat
- for (i = 0; i <= n; i++)
- {
- x = cos(0.0174532925f * i * alfa);
- z = sin(0.0174532925f * i * alfa);
- xa = cos(0.0174532925f * (i + 1) * alfa);
- za = sin(0.0174532925f * (i + 1) * alfa);
- x1 = x * R;
- x2 = x * r;
- x3 = xa * R;
- y1 = y;
- y2 = y + h;
- y3 = y;
- z1 = z * R;
- z2 = z * r;
- z3 = za * R;
- PoliczNormal(x1, x2, x3, y1, y2, y3, z1, z2, z3, normal);
- if (normalne)
- {
- glBegin(GL_LINES);
- glVertex3f(x * R, y + 0, z * R);
- glVertex3f(x1 + normal[0], y1 + normal[1], z1 + normal[2]);
- glVertex3f(x * r, y + h, z * r);
- glVertex3f(x2 + normal[0], y2 + normal[1], z2 + normal[2]);
- glEnd();
- }
- }
- }
- void RysujStozekZPodzialami(float R, float r, float h, int n, int m)
- {
- int i;
- float dR, dr, dh, y, tmp1, tmp2;
- dh = h / m; // wysokosc nowego stozka
- for (i = 0; i < m; i++)
- {
- y = dh * i; // poczatkowa wysokosc
- tmp1 = y / h;
- tmp2 = (y + dh) / h;
- dR = R + (r - R) * tmp1; // promien dolnej podstawy nowego stozka
- dr = R + (r - R) * tmp2; // promien gornej podstawy nowego stozka
- if (i % 2 == 0)
- glColor3f(0.0, 1.0, 0.0);
- else
- glColor3f(1.0, 0.0, 1.0);
- RysujStozekBezPodstaw(dR, dr, y, dh, n);
- RysujWektory(dR, dr, y, dh, n);
- }
- RysujKolo(R, 0, n);
- RysujKolo(r, h, n);
- ScianaBoczna(R, h);
- }
- void RysujSzescian()
- {
- // Pocztaek tworzenia ukladu wspolrzednych
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-25.0, 0.0, 0.0);
- glVertex3f(25.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, -25.0, 0.0);
- glVertex3f(0.0, 25.0, 0.0);
- // Os Z
- glColor3f(0.0, 0.0, 1.0);
- glVertex3f(0.0, 0.0, -25.0);
- glVertex3f(0.0, 0.0, 25.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- glColor3f(1.0, 1.0, 1.0);
- glShadeModel(GL_FLAT);
- // Sciany boczne
- glBegin(GL_QUAD_STRIP);
- glColor3f(1.0, 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(1.0, 0.5, 0.5);
- glVertex3f(-a / 2.0, a / 2.0, -a / 2.0);
- glVertex3f(-a / 2.0, -a / 2.0, -a / 2.0);
- glColor3f(0.0, 1.0, 0);
- glVertex3f(-a / 2.0, a / 2.0, a / 2.0);
- glVertex3f(-a / 2.0, -a / 2.0, a / 2.0);
- glColor3f(0.0, 0, 1.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(0.5, 0.5, 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);
- glEnd();
- // Dolna sciana
- glBegin(GL_QUAD_STRIP);
- glColor3f(0.5, 0, 0.5);
- 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);
- }
- void SwapLineFill(int zm1)
- {
- if (zm1 == 1)
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- else
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
- void SyncSmooth()
- {
- if (smooth)
- glShadeModel(GL_SMOOTH);
- else
- glShadeModel(GL_FLAT);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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, obsOdl);
- glRotatef(rotObsX, 1, 0, 0);
- glRotatef(rotObsY, 0, 1, 0);
- glRotatef(rotObsZ, 0, 0, 1);
- // Narysowanie szescianu
- // RysujSzescian();
- glColor3f(1.0, 1.0, 1.0);
- RysujStozekZPodzialami(2, 2, 3, zmienna, zmienna2);
- SwapLineFill(zm1);
- UstawSwiatlaIMaterialy();
- RysujNakladke();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- switch (klawisz)
- {
- case '+':
- if (obsOdl < minOdl)
- obsOdl++;
- break;
- case '-':
- if (obsOdl > maxOdl)
- obsOdl--;
- break;
- case 'z':
- rotObsZ++;
- break;
- case 'x':
- rotObsZ--;
- break;
- case '1':
- zmienna = (zmienna > 4) ? zmienna - 1 : zmienna;
- break;
- case '2':
- zmienna = (zmienna < 64) ? zmienna + 1 : zmienna;
- break;
- case '4':
- zmienna2 = (zmienna2 > 4) ? zmienna2 - 1 : zmienna2;
- break;
- case '5':
- zmienna2 = (zmienna2 < 64) ? zmienna2 + 1 : zmienna2;
- break;
- case '^':
- zm1 = 0;
- break;
- case '6':
- zm1 = 1;
- break;
- case '7':
- smooth = !smooth;
- SyncSmooth();
- break;
- case 'p':
- obecnymaterial++;
- if (obecnymaterial > 2)
- obecnymaterial = 0;
- break;
- case 'o':
- zrodlo1 = !zrodlo1;
- break;
- case 'u':
- zrodlo2 = !zrodlo2;
- break;
- case 'i':
- normalne = !normalne;
- break;
- }
- }
- 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;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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_LINE);
- // 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);
- //DOPISANE
- glutSpecialFunc(ObslugaKlawiszySpecjalnych);
- // 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