Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- #include <string.h>
- #include <stdio.h>
- #include "glut.h"
- #include "materials.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
- #define DEG2RAD(x) ((float)(x)*M_PI/180.0)
- #define X_OFFSET_SWIATLO 10
- #define Y_OFFSET_SWIATLO 120
- #define rA 2.0
- #define rB 2.0
- #define rC 2.0
- #define KATpion 180.0
- #define KATpoz 180.0
- #define LPOZ_MAX 100
- #define LPOZ_MIN 4
- #define LPION_MAX 100
- #define LPION_MIN 4
- float podzial_pionowy = 10.0;
- float podzial_poziomy = 10.0;
- float PI = 3.14159265;
- float H = 5.0;
- int lPionowych = 8; // Liczba podzialow pionowych
- int lPoziomych = 4; // Liczba podzialow poziomych
- double promien = 2; // Promien walca
- double wysokosc = 4; // Wysokosc walca
- int ktory_material = 1;
- // Zmienne globalne
- GLfloat M_PI = 3.14159265359;
- double bok = DLUGOSC_BOKU; // Dlugosc boku szescianu
- int szerokoscOkna = 800;
- int wysokoscOkna = 600;
- GLfloat rotObsY = 40.0;
- GLfloat rotObsX = 40.0;
- GLfloat rotObsZ = 0.0;
- int odleglosc = 20, i, j;
- int N = 40;
- int mat1 = 0, mat2 = 0, mat3 = 0;
- int zrodlo1 = 0, zrodlo2 = 0;
- int czyWypelnienie;
- int czywektor = 0;
- float material1[5][4] = {
- {1.0, 0.0, 1.0, 1.0}, // [0] wspolczynnik odbicia swiatla otoczenia
- {1.0, 0.0, 1.0, 1.0}, // [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 - fiolet
- float material2[5][4] = { //polerowany braz
- {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] = { //polerowane zloto
- {0.247250, 0.224500, 0.064500, 1.000000}, // [0] wspolczynnik odbicia swiatla otoczenia
- {0.346150, 0.314300, 0.090300, 1.000000}, // [1] wspolczynnik odbicia swiatla rozproszonego
- {0.797357, 0.723991, 0.208006, 1.000000}, // [2] wspolczynnik odbicia swiatla lustrzanego
- {83.2, 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.2, 0.2, 0.2, 1.0}, // [0] otoczenie
- {1.0, 1.0, 1.0, 1.0}, // [1] rozproszenie
- {1.0, 1.0, 1.0, 1.0}, // [2] lustrzane
- {10.0, 10.0, 10.0, 1.0},// [3] polozenie
- {0.0, 0.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, 1, 1, 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
- };
- // 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);
- void Material1(void) { //Fiolet z przykladu
- 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]);
- }
- void Material2(void) { //Polerowany braz
- 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]);
- }
- void Material3(void) { //Polerowane zloto
- 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 RysujTekstRastrowy(void* font, char* tekst)
- {
- int i;
- for (i = 0; i < (int)strlen(tekst); i++)
- glutBitmapCharacter(font, tekst[i]);
- }
- void RysujSfere(double h, double r, int nv, int nh)
- {
- 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);
- }
- int ktorypoziom = 0;
- int b = 0;
- float POZi = 0.0, PIONj = 0.0, i2 = 0.0, j2 = 0.0, x1 = 0.0, y1 = 0.0, z1 = 0.0, x2 = 0.0, y2 = 0.0, z2 = 0.0, x3 = 0.0, y3 = 0.0, z3 = 0.0, x4 = 0.0, y4 = 0.0, z4 = 0.0;
- /*
- glBegin(GL_LINES);
- // Os X
- glColor3f(1.0, 0.0, 0.0);
- glVertex3f(-20.0, 0.0, 0.0);
- glVertex3f(20.0, 0.0, 0.0);
- // Os Y
- glColor3f(0.0, 1.0, 0.0);
- glVertex3f(0.0, -20.0, 0.0);
- glVertex3f(0.0, 20.0, 0.0);
- // Os Z
- glColor3f(0.0, 0.0, 1.0);
- glVertex3f(0.0, 0.0, -20.0);
- glVertex3f(0.0, 0.0, 20.0);
- // Koniec tworzenia ukladu wspolrzednych
- glEnd();
- */
- for (POZi = 0; POZi <= KATpoz - 1; POZi = POZi + KATpoz / podzial_poziomy)
- {
- if (ktorypoziom == 0)
- {
- ktorypoziom = 1;
- }
- else ktorypoziom = 0;
- for (PIONj = 90.0; PIONj <= ((KATpion - 1.0) + 90.0); PIONj = PIONj + KATpion / podzial_pionowy)
- {
- switch (ktorypoziom)
- {
- case 0:
- //Material1();
- ktorypoziom++;
- break;
- case 1:
- //Material2();
- ktorypoziom = 0;
- break;
- }
- switch (ktory_material)
- {
- case 1:
- Material1();
- break;
- case 2:
- Material2();
- break;
- case 3:
- Material3();;
- break;
- }
- x1 = rA * sin(POZi * PI / 180) * cos(PIONj * PI / 180);
- y1 = rB * cos(POZi * PI / 180);
- z1 = rC * sin(POZi * PI / 180) * sin(PIONj * PI / 180);
- i2 = POZi + KATpoz / podzial_poziomy;
- j2 = PIONj + KATpion / podzial_pionowy;
- x2 = rA * sin(i2 * PI / 180) * cos(PIONj * PI / 180);
- y2 = rB * cos(i2 * PI / 180);
- z2 = rC * sin(i2 * PI / 180) * sin(PIONj * PI / 180);
- x3 = rA * sin(POZi * PI / 180) * cos(j2 * PI / 180);
- y3 = rB * cos(POZi * PI / 180);
- z3 = rC * sin(POZi * PI / 180) * sin(j2 * PI / 180);
- x4 = rA * sin(i2 * PI / 180) * cos(j2 * PI / 180);
- y4 = rB * cos(i2 * PI / 180);
- z4 = rC * sin(i2 * PI / 180) * sin(j2 * PI / 180);
- // Sciany boczne
- //Material1();
- glColor3f(0.0, 0.0, 1.0);
- glBegin(GL_QUAD_STRIP);
- glNormal3f(x1 / rA, y1 / rB, z1 / rC);
- glVertex3f(x1, y1, z1);
- glNormal3f(x2 / rA, y2 / rB, z2 / rC);
- glVertex3f(x2, y2, z2);
- glNormal3f(x3 / rA, y3 / rB, z3 / rC);
- glVertex3f(x3, y3, z3);
- glNormal3f(x4 / rA, y4 / rB, z4 / rC);
- glVertex3f(x4, y4, z4);
- glEnd();
- glColor3f(1.0, 1.0, 1.0);
- if (PIONj == 90.0)
- {
- //Material1();
- glBegin(GL_QUAD_STRIP);
- glNormal3f(1.0, 0.0, 0.0);
- glVertex3f(0, y1, 0);
- glVertex3f(x2, y1, z1);
- glVertex3f(0, y2, 0);
- glVertex3f(x2, y2, z2);
- glEnd();
- }
- if (j2 >= ((KATpion - 1.0) + 90.0))
- {
- //Material1();
- glBegin(GL_QUAD_STRIP);
- glNormal3f(1.0, 0.0, 0.0);
- glVertex3f(0, y1, 0);
- glVertex3f(x4, y3, z3);
- glVertex3f(0, y2, 0);
- glVertex3f(x4, y4, z4);
- glEnd();
- }
- }
- }
- //Swiatlo1();
- //Swiatlo2();
- }
- void RysujNormalne()
- {
- 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);
- }
- int ktorypoziom = 0;
- int b = 0;
- float POZi = 0.0, PIONj = 0.0, i2 = 0.0, j2 = 0.0, x1 = 0.0, y1 = 0.0, z1 = 0.0, x2 = 0.0, y2 = 0.0, z2 = 0.0, x3 = 0.0, y3 = 0.0, z3 = 0.0, x4 = 0.0, y4 = 0.0, z4 = 0.0;
- for (POZi = 0; POZi <= KATpoz - 1; POZi = POZi + KATpoz / podzial_poziomy)
- {
- if (ktorypoziom == 0)
- {
- ktorypoziom = 1;
- }
- else ktorypoziom = 0;
- for (PIONj = 90.0; PIONj <= ((KATpion - 1.0) + 90.0); PIONj = PIONj + KATpion / podzial_pionowy)
- {
- switch (ktorypoziom)
- {
- case 0:
- //Material1();
- ktorypoziom++;
- break;
- case 1:
- //Material2();
- ktorypoziom = 0;
- break;
- }
- switch (ktory_material)
- {
- case 1:
- Material1();
- break;
- case 2:
- Material2();
- break;
- case 3:
- Material3();;
- break;
- }
- x1 = rA * sin(POZi * PI / 180) * cos(PIONj * PI / 180);
- y1 = rB * cos(POZi * PI / 180);
- z1 = rC * sin(POZi * PI / 180) * sin(PIONj * PI / 180);
- i2 = POZi + KATpoz / podzial_poziomy;
- j2 = PIONj + KATpion / podzial_pionowy;
- x2 = rA * sin(i2 * PI / 180) * cos(PIONj * PI / 180);
- y2 = rB * cos(i2 * PI / 180);
- z2 = rC * sin(i2 * PI / 180) * sin(PIONj * PI / 180);
- x3 = rA * sin(POZi * PI / 180) * cos(j2 * PI / 180);
- y3 = rB * cos(POZi * PI / 180);
- z3 = rC * sin(POZi * PI / 180) * sin(j2 * PI / 180);
- x4 = rA * sin(i2 * PI / 180) * cos(j2 * PI / 180);
- y4 = rB * cos(i2 * PI / 180);
- z4 = rC * sin(i2 * PI / 180) * sin(j2 * PI / 180);
- glColor3f(0.0, 0.0, 1.0);
- glBegin(GL_LINES);
- glVertex3f(x1 * rA, y1 * rB, z1 * rC);
- glVertex3f(x1, y1, z1);
- glVertex3f(x2 * rA, y2 * rB, z2 * rC);
- glVertex3f(x2, y2, z2);
- glVertex3f(x3 * rA, y3 * rB, z3 * rC);
- glVertex3f(x3, y3, z3);
- glVertex3f(x4 * rA, y4 * rB, z4 * rC);
- glVertex3f(x4, y4, z4);
- glEnd();
- glColor3f(1.0, 1.0, 1.0);
- if (PIONj == 90.0)
- {
- //Material1();
- glBegin(GL_LINES);
- glVertex3f(1.0, y1, 0.0);
- glVertex3f(0, y1, 0);
- glVertex3f(1, y1, z1);
- glVertex3f(x2, y1, z1);
- glVertex3f(1, y2, 0);
- glVertex3f(0, y2, 0);
- glVertex3f(1, y2, z2);
- glVertex3f(x2, y2, z2);
- glEnd();
- }
- if (j2 >= ((KATpion - 1.0) + 90.0))
- {
- //Material1();
- glBegin(GL_LINES);
- glVertex3f(1.0, y1, 0.0);
- glVertex3f(0, y1, 0);
- glVertex3f(1, y3, z3);
- glVertex3f(x4, y3, z3);
- glVertex3f(1, y2, 0);
- glVertex3f(0, y2, 0);
- glVertex3f(1, y4, z4);
- glVertex3f(x4, y4, z4);
- glEnd();
- }
- // Gorna sciana
- /*}}*/
- }
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja rysujaca szescian o boku "a" w trybie GL_QUAD_STRIP.
- // Srodek szescianu znajduje się w punkcie (0,0,0).
- void RysujSzescian(double a)
- {
- 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);
- }
- if (mat1 == 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 (mat2 == 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]);
- }
- else if (mat3 == 1) { //Polerowane zloto
- 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]);
- }
- // Pocztaek tworzenia ukladu wspolrzednych
- glColor3f(1, 0, 2);
- double i;
- double dAlfa = 360 / N;
- float stala = 4;
- int promien = 15;
- // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glBegin(GL_TRIANGLE_STRIP);
- // glPolygonMode(GL_BACK, GL_FILL);
- // glColor3f(1.0, 1.0, 0.0);
- //A
- for (i = 0; i * dAlfa <= 360.0; i++) {
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f(promien * cos(DEG2RAD((i)*dAlfa)), 4, promien * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
- }
- glVertex3f(promien * cos(DEG2RAD(360)), 0, promien * sin(DEG2RAD(360)));
- glVertex3f(promien * cos(DEG2RAD(360)), 4, promien * sin(DEG2RAD(360)));
- for (i = 0; i * dAlfa <= 360.0; i++) {
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), 0, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
- }
- glVertex3f(promien * cos(DEG2RAD(360)), 0, promien * sin(DEG2RAD(360)));
- glVertex3f((promien + 4) * cos(DEG2RAD(360)), 0, (promien + 4) * sin(DEG2RAD(360)));
- for (i = 0; i * dAlfa <= 360.0; i++) {
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), 0, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- //glVertex3f((promien + stala) * cos(DEG2RAD((i + 0.5) * dAlfa)), stala, (promien + stala) * sin(DEG2RAD((i + 0.5) * dAlfa)));
- }
- glEnd();
- /*
- // 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 RysujWektor(double a) {
- glDisable(GL_LIGHTING);
- glColor3f(0, 0, 2);
- double i;
- double dAlfa = 360 / N;
- float stala = 4;
- int promien = 15;
- // glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- glColor3f(0.0, 0.0, 0.0);
- glBegin(GL_LINES);
- // glPolygonMode(GL_BACK, GL_FILL);
- //A
- for (i = 0; i * dAlfa < 360.0; i++) {
- // lewy dol dol
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f(promien * cos(DEG2RAD((i)*dAlfa)), -1, promien * sin(DEG2RAD((i)*dAlfa)));
- }
- for (i = 0; i * dAlfa < 360.0; i++) {
- // lewy dol lewo
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 0, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien - 1) * cos(DEG2RAD((i)*dAlfa)), 0, (promien - 1) * sin(DEG2RAD((i)*dAlfa)));
- }
- for (i = 0; i * dAlfa < 360.0; i++) {
- // lewy gorny lewo
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien - 1) * cos(DEG2RAD((i)*dAlfa)), 4, (promien - 1) * sin(DEG2RAD((i)*dAlfa)));
- }
- for (i = 0; i * dAlfa < 360.0; i++) {
- // lewy gorny prawo
- glVertex3f(promien * cos(DEG2RAD(i * dAlfa)), 4, promien * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien + 1 / 1.4142) * cos(DEG2RAD((i)*dAlfa)), 4 + 1 / 1.4142, (promien + 1 / 1.4142) * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
- }
- for (i = 0; i * dAlfa < 360.0; i++) {
- // prawy dolny prawo
- glVertex3f((promien + 4) * cos(DEG2RAD(i * dAlfa)), 0, (promien + 4) * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien + 4 + 1 / 1.4142) * cos(DEG2RAD((i)*dAlfa)), 1 / 1.4142, (promien + 4 + 1 / 1.4142) * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
- }
- for (i = 0; i * dAlfa < 360.0; i++) {
- // prawy dolny dol
- glVertex3f((promien + 4) * cos(DEG2RAD(i * dAlfa)), 0, (promien + 4) * sin(DEG2RAD(i * dAlfa)));
- glVertex3f((promien + 4) * cos(DEG2RAD((i)*dAlfa)), -1, (promien + 4) * sin(DEG2RAD((i)*dAlfa)));
- //glVertex3f(1 / 1.4142 * promien * cos(DEG2RAD(i * dAlfa)), 4 + 1 / 1.4142 , 1 / 1.4142 * promien * sin(DEG2RAD(i * dAlfa)));
- }
- glEnable(GL_LIGHTING);
- 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 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 ZRODLA SWIATLA
- sprintf(buf, "Wlaczenie/wylaczenie pierwszego swiatla 1/!");
- glRasterPos2i(10, 180);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Wlaczenie/wylaczenie drugiego swiatla 2/@");
- glRasterPos2i(10, 160);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Zwiekszenie/zmniejszenie podzialow poziomych - [/{");
- glRasterPos2i(10, 140);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Zwiekszenie/zmniejszenie podzialow pionowych - ]/}");
- glRasterPos2i(10, 120);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Zmiana pozycji obserwatora - strzalki");
- glRasterPos2i(10, 100);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Przyblizenie/oddalenie - +/-");
- glRasterPos2i(10, 80);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "GL_LINES/GL_FILL - f/g");
- glRasterPos2i(10, 60);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Cieniowanie gladkie/plaskie - v/b");
- glRasterPos2i(10, 40);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- glColor3f(1.0, 1.0, 1.0);
- sprintf(buf, "Zmiana materialu - m");
- glRasterPos2i(10, 20);
- RysujTekstRastrowy(GLUT_BITMAP_8_BY_13, buf);
- // Odblokowanie oswietlenia
- glEnable(GL_LIGHTING);
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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();
- UstawParametryWidoku(szerokoscOkna, wysokoscOkna);
- // Ustalenie polozenia obserwatora
- glTranslatef(0, 0, -odleglosc);
- glRotatef(rotObsX, 1, 0, 0);
- glRotatef(rotObsY, 0, 1, 0);
- glRotatef(rotObsZ, 0, 0, 1);
- // Narysowanie szescianu
- //RysujSzescian(bok);
- if (czywektor == 1) {
- RysujNormalne();
- }
- // Narysowanie tekstow z opisem parametrow oswietlenia i materialu
- RysujSfere(wysokosc, promien, lPoziomych, lPionowych);
- RysujNakladke();
- // Przelaczenie buforow ramki
- glutSwapBuffers();
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // Funkcja obslugi klawiatury
- void ObslugaKlawiatury(unsigned char klawisz, int x, int y)
- {
- /*
- if(klawisz == '+')
- bok *= 1.1;
- else if (klawisz == '-')
- bok /= 1.1;
- else if (klawisz == 27)
- exit(0);
- */
- switch (klawisz)
- {
- case 'q':
- rotObsZ = rotObsZ - 1.0;
- break;
- case 'm':
- if (ktory_material == 1) ktory_material = 2;
- else if (ktory_material == 2) ktory_material = 3;
- else ktory_material = 1;
- break;
- case 'e':
- rotObsZ = rotObsZ + 1.0;
- break;
- case '-':
- case '_':
- odleglosc = (odleglosc < 200) ? odleglosc + 1 : odleglosc;
- break;
- case '+':
- case '=':
- odleglosc = (odleglosc > 10) ? odleglosc - 1 : odleglosc;
- break;
- case 'a':
- N = (N < 64) ? N + 2 : N;
- break;
- case 's':
- N = (N > 4) ? N - 2 : N;
- break;
- case '1':
- zrodlo1 = 1;
- break;
- case '!':
- zrodlo1 = 0;
- break;
- case '2':
- zrodlo2 = 1;
- break;
- case '@':
- zrodlo2 = 0;
- break;
- case '5':
- mat1 = 1;
- mat2 = 0;
- mat3 = 0;
- break;
- case '6':
- mat1 = 0;
- mat2 = 1;
- mat3 = 0;
- break;
- case '7':
- mat1 = 0;
- mat2 = 0;
- mat3 = 1;
- break;
- case ',':
- czywektor = 0;
- break;
- case '.':
- czywektor = 1;
- break;
- case ']':
- podzial_pionowy = (podzial_pionowy == LPION_MAX) ? LPION_MAX : podzial_pionowy + 2; //zwiększenie liczby podziałów pionowych
- break;
- case '}':
- podzial_pionowy = (podzial_pionowy == LPION_MIN) ? LPION_MIN : podzial_pionowy - 2; //zmniejszenie liczby podziałów pionowych
- break;
- case '[':
- podzial_poziomy = (podzial_poziomy == LPOZ_MAX) ? LPOZ_MAX : podzial_poziomy + 2; //zwiększenie liczby podziałów poziomych
- break;
- case '{':
- podzial_poziomy = (podzial_poziomy == LPOZ_MIN) ? LPOZ_MIN : podzial_poziomy - 2; //zmniejszenie liczby podziałów poziomych
- break;
- case 'v':
- glShadeModel(GL_SMOOTH);
- break;
- case 'b':
- glShadeModel(GL_FLAT);
- break;
- break;
- case 'f':
- czyWypelnienie = 1;
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- break;
- case 'g':
- czyWypelnienie = 0;
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- break;
- }
- if (klawisz == 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;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////
- // 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.0, 0.0, 0.0, 0.0);
- // 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);
- /// obsloga klawiszy specjalnych
- 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