Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*************************************************************************************/
- // Szkielet programu do tworzenia modelu sceny 3-D z wizualizacją osi
- // układu współrzędnych dla rzutowania perspektywicznego
- /*************************************************************************************/
- #include <windows.h>
- #include <gl/gl.h>
- #include <gl/glut.h>
- #include <cmath>
- #include <ctime>
- #include <iostream>
- #pragma warning (disable : 4996)
- using namespace std;
- #define M_PI 3.14159265358979323846
- typedef float point3[3];
- //static GLfloat theta1[] = { 0.0, 0.0, 0.0 }; // trzy kąty obrotu
- struct Point
- {
- float x;
- float y;
- float z;
- float xu;
- float xv;
- float yu;
- float yv;
- float zu;
- float zv;
- float nx;
- float ny;
- float nz;
- };
- static int N = 60; //wielkosc tablicy
- Point **tablica; //dynamiczna tablica struktur punktowych
- Point **kolory; //dynamiczna tablica kolorów
- GLfloat promien = 20.0;
- float y = 1.0f;
- bool kierunek = true; //true - dodawanie, false - odejmowanie
- GLfloat PHI = 0.0, THETA = 0.0;
- //GLfloat cosPhi = 0.5, sinPhi = 0.5, cosTheta = 0.5, sinTheta = 0.5;
- static GLfloat viewer[] = { 0.1, 0.1, 10.0 };
- // inicjalizacja położenia obserwatora
- static GLfloat theta[] = { 0.0, 0.0 }; // kąt obrotu obiektu
- static GLfloat pix2angleX; // przelicznik pikseli na stopnie
- static GLfloat pix2angleY; // przelicznik pikseli na stopnie
- static GLint statusL = 0; // stan klawiszy myszy
- // 0 - nie naciśnięto żadnego klawisza
- // 1 - naciśnięty został lewy klawisz
- static GLint statusP = 0; // stan klawiszy myszy
- // 0 - nie naciśnięto żadnego klawisza
- // 1 - naciśnięty został prawy klawisz
- static int x_pos_old = 0; // poprzednia pozycja kursora myszy
- static int y_pos_old = 0; // poprzednia pozycja kursora myszy
- static int delta_x = 0; // różnica pomiędzy pozycją bieżącą
- // i poprzednią kursora myszy
- static int delta_y = 0; // różnica pomiędzy pozycją bieżącą
- // i poprzednią kursora myszy
- /*************************************************************************************/
- /*************************************************************************************/
- // Funkcja "bada" stan myszy i ustawia wartości odpowiednich zmiennych globalnych
- GLbyte *LoadTGAImage(const char *FileName, GLint *ImWidth, GLint *ImHeight, GLint *ImComponents, GLenum *ImFormat)
- {
- /*************************************************************************************/
- // Struktura dla nagłówka pliku TGA
- #pragma pack(1)
- typedef struct
- {
- GLbyte idlength;
- GLbyte colormaptype;
- GLbyte datatypecode;
- unsigned short colormapstart;
- unsigned short colormaplength;
- unsigned char colormapdepth;
- unsigned short x_orgin;
- unsigned short y_orgin;
- unsigned short width;
- unsigned short height;
- GLbyte bitsperpixel;
- GLbyte descriptor;
- }TGAHEADER;
- #pragma pack(8)
- FILE *pFile;
- TGAHEADER tgaHeader;
- unsigned long lImageSize;
- short sDepth;
- GLbyte *pbitsperpixel = NULL;
- /*************************************************************************************/
- // Wartości domyślne zwracane w przypadku błędu
- *ImWidth = 0;
- *ImHeight = 0;
- *ImFormat = GL_BGR_EXT;
- *ImComponents = GL_RGB8;
- pFile = fopen(FileName, "rb");
- if (pFile == NULL)
- return NULL;
- /*************************************************************************************/
- // Przeczytanie nagłówka pliku
- fread(&tgaHeader, sizeof(TGAHEADER), 1, pFile);
- /*************************************************************************************/
- // Odczytanie szerokości, wysokości i głębi obrazu
- *ImWidth = tgaHeader.width;
- *ImHeight = tgaHeader.height;
- sDepth = tgaHeader.bitsperpixel / 8;
- /*************************************************************************************/
- // Sprawdzenie, czy głębia spełnia założone warunki (8, 24, lub 32 bity)
- if (tgaHeader.bitsperpixel != 8 && tgaHeader.bitsperpixel != 24 && tgaHeader.bitsperpixel != 32)
- return NULL;
- /*************************************************************************************/
- // Obliczenie rozmiaru bufora w pamięci
- lImageSize = tgaHeader.width * tgaHeader.height * sDepth;
- /*************************************************************************************/
- // Alokacja pamięci dla danych obrazu
- pbitsperpixel = (GLbyte*)malloc(lImageSize * sizeof(GLbyte));
- if (pbitsperpixel == NULL)
- return NULL;
- if (fread(pbitsperpixel, lImageSize, 1, pFile) != 1)
- {
- free(pbitsperpixel);
- return NULL;
- }
- /*************************************************************************************/
- // Ustawienie formatu OpenGL
- switch (sDepth)
- {
- case 3:
- *ImFormat = GL_BGR_EXT;
- *ImComponents = GL_RGB8;
- break;
- case 4:
- *ImFormat = GL_BGRA_EXT;
- *ImComponents = GL_RGBA8;
- break;
- case 1:
- *ImFormat = GL_LUMINANCE;
- *ImComponents = GL_LUMINANCE8;
- break;
- };
- fclose(pFile);
- return pbitsperpixel;
- }
- void Mouse(int btn, int state, int x, int y)
- {
- if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
- {
- x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
- // jako pozycji poprzedniej
- y_pos_old = y; // przypisanie aktualnie odczytanej pozycji kursora
- statusL = 1; // wcięnięty został lewy klawisz myszy
- }
- else
- statusL = 0; // nie został wcięnięty żaden klawisz
- if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
- {
- statusP = 1; // wcięnięty został lewy klawisz myszy
- y_pos_old = y; // przypisanie aktualnie odczytanej pozycji kursora
- }
- else
- statusP = 0; // nie został wcięnięty żaden klawisz
- }
- /*************************************************************************************/
- // Funkcja "monitoruje" położenie kursora myszy i ustawia wartości odpowiednich
- // zmiennych globalnych
- void Motion(GLsizei x, GLsizei y)
- {
- delta_x = x - x_pos_old; // obliczenie różnicy położenia kursora myszy
- delta_y = y - y_pos_old; // obliczenie różnicy położenia kursora myszy
- x_pos_old = x; // podstawienie bieżącego położenia jako poprzednie
- y_pos_old = y; // podstawienie bieżącego położenia jako poprzednie
- glutPostRedisplay(); // przerysowanie obrazu sceny
- }
- /*************************************************************************************/
- // Funkcja rysująca osie układu wspó?rz?dnych
- /*void spinTeapot()
- {
- theta1[0] += 0.15;
- theta1[1] -= 0.25;
- theta1[2] += 0.05;
- glutPostRedisplay(); //odświeżenie zawartości aktualnego okna
- }
- */
- void DrawEggTriangle()
- {
- for (int i = 0; i <= N; i++)
- for (int j = 0; j <= N; j++)
- {
- if (i <= (N - 1))
- {
- if (j <= (N - 1))
- {
- glBegin(GL_TRIANGLES);
- //glColor3f(kolory[i][j].x, kolory[i][j].y, kolory[i][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][j].nx, tablica[i][j].ny, tablica[i][j].nz);
- glTexCoord2f((float)((float)i/(float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i][j].x, tablica[i][j].y - 5.0f, tablica[i][j].z);
- //glColor3f(kolory[i + 1][j + 1].x, kolory[i + 1][j + 1].y, kolory[i + 1][j + 1].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i + 1][j + 1].nx, tablica[i + 1][j + 1].ny, tablica[i + 1][j + 1].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i + 1][j + 1].x, tablica[i + 1][j + 1].y - 5.0f, tablica[i + 1][j + 1].z);
- //glColor3f(kolory[i][j + 1].x, kolory[i][j + 1].y, kolory[i][j + 1].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][j + 1].nx, tablica[i][j + 1].ny, tablica[i][j + 1].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i][j + 1].x, tablica[i][j + 1].y - 5.0f, tablica[i][j + 1].z);
- glEnd();
- glBegin(GL_TRIANGLES);
- //glColor3f(kolory[i][j].x, kolory[i][j].y, kolory[i][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][j].nx, tablica[i][j].ny, tablica[i][j].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i][j].x, tablica[i][j].y - 5.0f, tablica[i][j].z);
- //glColor3f(kolory[i + 1][j].x, kolory[i + 1][j].y, kolory[i + 1][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i + 1][j].nx, tablica[i + 1][j].ny, tablica[i + 1][j].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i + 1][j].x, tablica[i + 1][j].y - 5.0f, tablica[i + 1][j].z);
- //glColor3f(kolory[i + 1][j + 1].x, kolory[i + 1][j + 1].y, kolory[i + 1][j + 1].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i + 1][j + 1].nx, tablica[i + 1][j + 1].ny, tablica[i + 1][j + 1].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i + 1][j + 1].x, tablica[i + 1][j + 1].y - 5.0f, tablica[i + 1][j + 1].z);
- glEnd();
- }
- }
- else
- {
- glBegin(GL_TRIANGLES);
- //glColor3f(kolory[i][j].x, kolory[i][j].y, kolory[i][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][j].nx, tablica[i][j].ny, tablica[i][j].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i][j].x, tablica[i][j].y - 5.0f, tablica[i][j].z);
- //glColor3f(kolory[0][0].x, kolory[0][0].y, kolory[0][0].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[0][0].nx, tablica[0][0].ny, tablica[0][0].nz);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(tablica[0][0].x, tablica[0][0].y - 5.0f, tablica[0][0].z);
- //glColor3f(kolory[i][0].x, kolory[i][0].y, kolory[i][0].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][0].nx, tablica[i][0].ny, tablica[i][0].nz);
- glTexCoord2f((float)((float)i / (float)N), 0.0f);
- glVertex3f(tablica[i][0].x, tablica[i][0].y - 5.0f, tablica[i][0].z);
- glEnd();
- glBegin(GL_TRIANGLES);
- //glColor3f(kolory[i][j].x, kolory[i][j].y, kolory[i][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[i][j].nx, tablica[i][j].ny, tablica[i][j].nz);
- glTexCoord2f((float)((float)i / (float)N), (float)((float)j / (float)N));
- glVertex3f(tablica[i][j].x, tablica[i][j].y - 5.0f, tablica[i][j].z);
- //glColor3f(kolory[0][j].x, kolory[0][j].y, kolory[0][j].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[0][j].nx, tablica[0][j].ny, tablica[0][j].nz);
- glTexCoord2f(0.0f, (float)((float)j / (float)N));
- glVertex3f(tablica[0][j].x, tablica[0][j].y - 5.0f, tablica[0][j].z);
- //glColor3f(kolory[0][0].x, kolory[0][0].y, kolory[0][0].z);
- glColor3f(1.0, 1.0, 1.0);
- glNormal3f(tablica[0][0].nx, tablica[0][0].ny, tablica[0][0].nz);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(tablica[0][0].x, tablica[0][0].y - 5.0f, tablica[0][0].z);
- glEnd();
- }
- }
- }
- void GeneratingColors()
- {
- kolory = new Point*[N + 1];
- for (int i = 0; i <= N; i++)
- kolory[i] = new Point[N + 1];
- for (int i = 0; i <= N; i++)
- for (int j = 0; j <= N; j++)
- {
- // else {
- kolory[i][j].x = (float)(rand() % 1000 / 1000.0);
- kolory[i][j].y = (float)(rand() % 1000 / 1000.0);
- kolory[i][j].z = (float)(rand() % 1000 / 1000.0);
- // }
- }
- for (int i = 0; i <= N; i++)
- for (int j = 0; j <= N; j++)
- {
- if (j == N - 1)
- {
- kolory[i][j].x = kolory[i][0].x;
- kolory[i][j].y = kolory[i][0].y;
- kolory[i][j].z = kolory[i][0].z;
- }
- }
- /*
- for (int i = 0; i <= N; i++)
- {
- for(int j = 0 ; j <= N; j++)
- std::cout << "X = " << kolory[i][j].x << "\t";
- std::cout << std::endl;
- for (int j = 0; j <= N; j++)
- std::cout << "Y = " << kolory[i][j].y << "\t";
- std::cout << std::endl;
- for (int j = 0; j <= N; j++)
- std::cout << "Z = " << kolory[i][j].z << "\t";
- std::cout << std::endl << std::endl;
- }
- std::cin.get();
- std::cin.get();*/
- tablica = new Point*[N + 1];
- for (int i = 0; i <= N; i++)
- tablica[i] = new Point[N + 1];
- }
- void Egg()
- {
- for (int i = 0; i <= N; i++)
- for (int j = 0; j <= N; j++)
- {
- float u = (float)i / (float)N;
- float v = (float)j / (float)N;
- tablica[i][j].x = ((-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * u*u - 45 * u)*cosf((float)M_PI*v));
- tablica[i][j].y = (160 * pow(u, 4) - 320 * pow(u, 3) + 160 * u*u);
- tablica[i][j].z = ((-90 * pow(u, 5) + 225 * pow(u, 4) - 270 * pow(u, 3) + 180 * u*u - 45 * u)*sinf((float)M_PI*v));
- tablica[i][j].xu = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * u*u + 360 * u - 45)*cosf((float)M_PI*v);
- tablica[i][j].xv = (float)M_PI*(90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * u*u + 45 * u)*sinf(M_PI*v);
- tablica[i][j].yu = (640 * pow(u, 3) - 960 * u*u + 320 * u);
- tablica[i][j].yv = 0.0;
- tablica[i][j].zu = (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * u*u + 360 * u - 45)*sinf((float)M_PI*v);
- tablica[i][j].zv = (-1 * (float)M_PI)*(90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * u*u + 45 * u)*cosf((float)M_PI*v);
- tablica[i][j].nx = tablica[i][j].yu*tablica[i][j].zv - tablica[i][j].zu*tablica[i][j].yv;
- tablica[i][j].ny = tablica[i][j].zu*tablica[i][j].xv - tablica[i][j].xu*tablica[i][j].zv;
- tablica[i][j].nz = tablica[i][j].xu*tablica[i][j].yv - tablica[i][j].yu*tablica[i][j].xv;
- if (i > N / 2)
- {
- tablica[i][j].nx = -1.0*tablica[i][j].nx;
- tablica[i][j].ny = -1.0*tablica[i][j].ny;
- tablica[i][j].nz = -1.0*tablica[i][j].nz;
- }
- if (i == N / 2)
- {
- tablica[i][j].nx = 0.0;
- tablica[i][j].ny = 1.0;
- tablica[i][j].nz = 0.0;
- }
- if (i == 0 || i == N)
- {
- tablica[i][j].nx = 0.0;
- tablica[i][j].ny = -1.0;
- tablica[i][j].nz = 0.0;
- }
- // cout << "Przed: " << sqrtf(tablica[i][j].nx*tablica[i][j].nx + tablica[i][j].ny*tablica[i][j].ny + tablica[i][j].nz*tablica[i][j].nz);
- float pierwiastek = sqrtf(tablica[i][j].nx*tablica[i][j].nx + tablica[i][j].ny*tablica[i][j].ny + tablica[i][j].nz*tablica[i][j].nz);
- // if ()
- // {
- tablica[i][j].nx = tablica[i][j].nx / pierwiastek;
- tablica[i][j].ny = tablica[i][j].ny / pierwiastek;
- tablica[i][j].nz = tablica[i][j].nz / pierwiastek;
- // cout << " po: " << sqrtf(tablica[i][j].nx*tablica[i][j].nx + tablica[i][j].ny*tablica[i][j].ny + tablica[i][j].nz*tablica[i][j].nz);
- // }
- //cout << " po: " << sqrtf(tablica[i][j].nx*tablica[i][j].nx + tablica[i][j].ny*tablica[i][j].ny + tablica[i][j].nz*tablica[i][j].nz) << endl;
- }
- /*for(int i = 0; i <= N; i++)
- {
- for (int j = 0; j <= N; j++)
- std::cout << tablica[i][j].x << ", " << tablica[i][j].y << ", " << tablica[i][j].z << "\t";
- std::cout << std::endl;
- }
- std::cin.get();
- std::cin.get();
- */
- DrawEggTriangle();
- }
- void Axes(void)
- {
- point3 x_min = { -5.0, 0.0, 0.0 };
- point3 x_max = { 5.0, 0.0, 0.0 };
- // pocz?tek i koniec obrazu osi x
- point3 y_min = { 0.0, -5.0, 0.0 };
- point3 y_max = { 0.0, 5.0, 0.0 };
- // pocz?tek i koniec obrazu osi y
- point3 z_min = { 0.0, 0.0, -5.0 };
- point3 z_max = { 0.0, 0.0, 5.0 };
- // pocz?tek i koniec obrazu osi y
- glColor3f(1.0f, 0.0f, 0.0f); // kolor rysowania osi - czerwony
- glBegin(GL_LINES); // rysowanie osi x
- glVertex3fv(x_min);
- glVertex3fv(x_max);
- glEnd();
- glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
- glBegin(GL_LINES); // rysowanie osi y
- glVertex3fv(y_min);
- glVertex3fv(y_max);
- glEnd();
- glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
- glBegin(GL_LINES); // rysowanie osi z
- glVertex3fv(z_min);
- glVertex3fv(z_max);
- glEnd();
- }
- /*************************************************************************************/
- // Funkcja określająca co ma być rysowane (zawsze wywoływana, gdy trzeba
- // przerysować scenę)
- void viewerPlacing()
- {
- viewer[0] = promien*cos(THETA)*cos(PHI);
- viewer[1] = promien*sin(PHI);
- viewer[2] = promien*sin(THETA)*cos(PHI);
- }
- void AnglesCounting()
- {
- /*GLfloat temp1 = cosTheta, temp2 = sinTheta, temp3 = cosPhi, temp4 = sinPhi;
- cosTheta = viewer[0] / (GLfloat)sqrt(viewer[0] * viewer[0] + viewer[1] * viewer[1]);
- if (cosTheta < -1 || cosTheta > 1)
- cosTheta = temp1;
- sinTheta = viewer[2] / (GLfloat)sqrt(viewer[0] * viewer[0] + viewer[2] * viewer[2]);
- if (sinTheta < -1 || cosTheta > 1)
- sinTheta = temp1;
- //cosPhi = (GLfloat)sqrt(viewer[0] * viewer[0] + viewer[2] * viewer[2]) / (GLfloat)sqrt((GLfloat)sqrt(viewer[0] * viewer[0] + viewer[1] * viewer[1]) + viewer[1]*viewer[1]);
- cosPhi = (GLfloat)sqrt(viewer[0] * viewer[0] + viewer[2] * viewer[2]) / promien;
- if (cosPhi < -1 || cosTheta > 1)
- cosPhi = temp1;
- // sinPhi = viewer[1] / (GLfloat)sqrt((GLfloat)sqrt(viewer[0] * viewer[0] + viewer[1] * viewer[1]) + viewer[1] * viewer[1]);
- sinPhi = viewer[1] /promien;
- if (sinPhi < -1 || cosTheta > 1)
- sinPhi = temp1;*/
- /*
- GLfloat temp1 = PHI, temp2 = THETA;
- if (PHI >= 0 && PHI <= M_PI)
- PHI += delta_y*pix2angleY / 40.0;
- if (PHI < 0 || PHI > 2 * M_PI)
- PHI = temp1;
- if (THETA >= 0 && THETA <= M_PI)
- THETA += delta_x*pix2angleX / 40.0;
- if (THETA < 0 || THETA > 2 * M_PI)
- THETA = temp2;
- */
- //GLfloat temp1 = PHI, temp2 = THETA;
- //if(!(viewer[0] <= 0.5 && viewer[0] >= -0.5 && viewer[2] <= 0.5 && viewer[2] >= -0.5))
- //{
- //PHI += delta_y*pix2angleY / 20.0;
- //THETA += delta_x*pix2angleX / 20.0;
- //}
- //viewerPlacing();
- //if (viewer[0] <= 0.5 && viewer[0] >= -0.5 && viewer[2] <= 0.5 && viewer[2] >= -0.5)
- //{
- // PHI = temp1;
- // THETA = temp2;
- //}
- /*if (viewer[0] == 0.0 && viewer[2] == 0.0)
- if (kierunek == true)
- kierunek = false;
- else
- kierunek = true;
- if(kierunek)
- {
- PHI += delta_y*pix2angleY / 40.0;
- THETA += delta_x*pix2angleX / 40.0;
- }
- else
- {
- PHI = PHI * (-1.0);
- THETA = THETA * (-1.0);
- }
- */
- PHI += delta_y*pix2angleY;// / 40.0;
- // PHI = fmod(PHI, M_PI);
- THETA += delta_x*pix2angleX;// / 40.0;
- // THETA = fmod(THETA, M_PI);
- if (cosf(PHI) >= 0.0f)
- y = 1.0f;
- else
- y = -1.0f;
- }
- void RenderScene(void)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Czyszczenie okna aktualnym kolorem czyszczącym
- glLoadIdentity();
- // Czyszczenie macierzy bie??cej
- //gluLookAt(5.0, 2.0, 10.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0);
- gluLookAt(viewer[0], viewer[1], viewer[2], 0.0, 0.0, 0.0, 0.0, y, 0.0);
- // Zdefiniowanie położenia obserwatora
- Axes();
- // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
- /*
- if (statusL == 1) // jeśli lewy klawisz myszy wcięnięty
- {
- theta[0] += delta_x*pix2angleX;
- theta[1] += delta_y*pix2angleY;
- } // do różnicy położeń kursora myszy
- if (statusP == 1) // jeśli prawy klawisz myszy wcięnięty
- {
- GLfloat temp = viewer[2];
- if (viewer[2] >= 7.0 && viewer[2] <= 30.0)
- viewer[2] += delta_y*pix2angleY; // modyfikacja kąta obrotu o kat proporcjonalny
- if (viewer[2] < 7.0 || viewer[2] > 30.0)
- viewer[2] = temp;
- }
- */
- if (statusL == 1) // jeśli lewy klawisz myszy wcięnięty
- {
- AnglesCounting();
- } // do różnicy położeń kursora myszy
- if (statusP == 1) // jeśli prawy klawisz myszy wcięnięty
- {
- GLfloat temp = promien;
- if (promien >= 7.0 && promien <= 30.0)
- promien += delta_y*pix2angleY; // modyfikacja kąta obrotu o kat proporcjonalny
- if (promien < 7.0 || promien > 30.0)
- promien = temp;
- }
- viewerPlacing();
- //glRotatef(theta[0], 0.0, 1.0, 0.0); //obrót obiektu o nowy kąt
- //glRotatef(theta[1], 1.0, 0.0, 0.0); //obrót obiektu o nowy kąt
- /*
- glRotatef(theta1[0], 1.0, 0.0, 0.0);
- glRotatef(theta1[1], 0.0, 1.0, 0.0);
- glRotatef(theta1[2], 0.0, 0.0, 1.0);
- */
- //glColor3f(1.0f, 1.0f, 1.0f);
- // Ustawienie koloru rysowania na biały
- //glutWireTeapot(3.0);
- //glColor3f(1.0f, 1.0f, 1.0f);
- //glutSolidTeapot(3.0f);
- Egg();
- // Narysowanie czajnika
- glFlush();
- // Przekazanie poleceń rysujących do wykonania
- glutSwapBuffers();
- }
- /*************************************************************************************/
- // Funkcja ustalająca stan renderowania
- void MyInit(void)
- {
- /*************************************************************************************/
- // Zmienne dla obrazu tekstury
- GLbyte *pBytes;
- GLint ImWidth, ImHeight, ImComponents;
- GLenum ImFormat;
- // ..................................
- // Pozostała część funkcji MyInit()
- // ..................................
- /*************************************************************************************/
- // Teksturowanie będzie prowadzone tyko po jednej stronie ściany
- // glEnable(GL_CULL_FACE);
- /*************************************************************************************/
- // Przeczytanie obrazu tekstury z pliku o nazwie tekstura.tga
- pBytes = LoadTGAImage("tekstura.tga", &ImWidth, &ImHeight, &ImComponents, &ImFormat);
- /*************************************************************************************/
- // Zdefiniowanie tekstury 2-D
- glTexImage2D(GL_TEXTURE_2D, 0, ImComponents, ImWidth, ImHeight, 0, ImFormat, GL_UNSIGNED_BYTE, pBytes);
- /*************************************************************************************/
- // Zwolnienie pamięci
- free(pBytes);
- /*************************************************************************************/
- // Włączenie mechanizmu teksturowania
- glEnable(GL_TEXTURE_2D);
- /*************************************************************************************/
- // Ustalenie trybu teksturowania
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- /*************************************************************************************/
- // Określenie sposobu nakładania tekstur
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- /************************************************************************************* /
- // Definicja materiału z jakiego zrobiony jest czajnik
- // i definicja źródła światła
- /*************************************************************************************/
- /*************************************************************************************/
- // Definicja materiału z jakiego zrobiony jest czajnik
- GLfloat mat_ambient[] = { 1.0, 1.0, 0.0, 1.0 };
- // współczynniki ka =[kar,kag,kab] dla światła otoczenia
- GLfloat mat_diffuse[] = { 1.0, 1.0, 0.0, 1.0 };
- // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
- GLfloat mat_specular[] = { 1.0, 1.0, 0.0, 1.0 };
- // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego
- GLfloat mat_shininess = { 20.0 };
- // współczynnik n opisujący połysk powierzchni
- /*************************************************************************************/
- // Definicja źródła światła
- GLfloat light_position[] = { 0.0, 0.0, 10.0, 1.0 };
- // położenie źródła
- GLfloat light_ambient[] = { 0.1, 0.1, 0.1, 1.0 };
- // składowe intensywności świecenia źródła światła otoczenia
- // Ia = [Iar,Iag,Iab]
- GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- // składowe intensywności świecenia źródła światła powodującego
- // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
- GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- // składowe intensywności świecenia źródła światła powodującego
- // odbicie kierunkowe Is = [Isr,Isg,Isb]
- GLfloat att_constant = { 1.0 };
- // składowa stała ds dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- GLfloat att_linear = { 0.05f };
- // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- GLfloat att_quadratic = { 0.001f };
- // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- /*************************************************************************************/
- // Ustawienie parametrów materiału i źródła światła
- /*************************************************************************************/
- // Ustawienie patrametrów materiału
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
- glMaterialf(GL_FRONT, GL_SHININESS, mat_shininess);
- /*************************************************************************************/
- // Ustawienie parametrów źródła
- glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, att_linear);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, att_quadratic);
- /*************************************************************************************/
- // Ustawienie opcji systemu oświetlania sceny
- glShadeModel(GL_SMOOTH); // właczenie łagodnego cieniowania
- glEnable(GL_LIGHTING); // właczenie systemu oświetlenia sceny
- glEnable(GL_LIGHT0); // włączenie źródła o numerze 0
- glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
- /*************************************************************************************/
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
- }
- /*************************************************************************************/
- // Funkcja ma za zadanie utrzymanie stałych proporcji rysowanych
- // w przypadku zmiany rozmiarów okna.
- // Parametry vertical i horizontal (wysokość i szerokość okna) są
- // przekazywane do funkcji za każdym razem gdy zmieni się rozmiar okna.
- void ChangeSize(GLsizei horizontal, GLsizei vertical)
- {
- pix2angleX = 2 * M_PI / (float)horizontal; // przeliczenie pikseli na stopnie
- pix2angleY = 2 * M_PI / (float)vertical; // przeliczenie pikseli na stopnie
- glMatrixMode(GL_PROJECTION);
- // Przełączenie macierzy bieżącej na macierz projekcji
- glLoadIdentity();
- // Czyszcznie macierzy bieżącej
- gluPerspective(70, 1.0, 1.0, 30.0);
- // Ustawienie parametrów dla rzutu perspektywicznego
- if (horizontal <= vertical)
- glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
- else
- glViewport((horizontal - vertical) / 2, 0, vertical, vertical);
- // Ustawienie wielkości okna okna widoku (viewport) w zależności
- // relacji pomiędzy wysokością i szerokością okna
- glMatrixMode(GL_MODELVIEW);
- // Przełączenie macierzy bieżącej na macierz widoku modelu
- glLoadIdentity();
- // Czyszczenie macierzy bieżącej
- }
- /*************************************************************************************/
- // Główny punkt wejścia programu. Program działa w trybie konsoli
- void main(void)
- {
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(300, 300);
- glutCreateWindow("Rzutowanie perspektywiczne - 2 Zadanie");
- GeneratingColors();
- glutDisplayFunc(RenderScene);
- // Określenie, że funkcja RenderScene będzie funkcją zwrotną
- // (callback function). Będzie ona wywoływana za każdym razem
- // gdy zajdzie potrzeba przerysowania okna
- glutMouseFunc(Mouse);
- // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
- glutMotionFunc(Motion);
- // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
- //glutIdleFunc(spinTeapot);
- glutReshapeFunc(ChangeSize);
- // Dla aktualnego okna ustala funkcję zwrotną odpowiedzialną
- // za zmiany rozmiaru okna
- MyInit();
- // Funkcja MyInit() (zdefiniowana powyżej) wykonuje wszelkie
- // inicjalizacje konieczne przed przystąpieniem do renderowania
- glEnable(GL_DEPTH_TEST);
- // Włączenie mechanizmu usuwania niewidocznych elementów sceny
- glutMainLoop();
- // Funkcja uruchamia szkielet biblioteki GLUT
- }
- /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement