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 "stdafx.h"
- #include <windows.h>
- #include <gl/gl.h>
- #include <gl/glut.h>
- #include <iostream>
- #include <math.h>
- #include <fstream>
- #define PI 3.14159265358979323846
- using namespace std;
- typedef double point3[3];
- typedef double point2[2];
- point3 ** points;
- point2 ** pointsq;
- static GLfloat viewer0[] = { 0.0, 0.0, 0.0 };
- static GLfloat viewer1[] = { 0.0, 0.0, 0.0 };
- // inicjalizacja po?o?enia obserwatora
- /*************************************************************************************/
- // Funkcja rysuj?ca osie uk?adu wspó?rz?dnych
- static GLfloat theta = 0.0; // k?t obrotu obiektu
- static GLfloat theta1 = 0.0; // k?t obrotu obiektu
- static GLfloat theta2 = 0.0; // k?t obrotu obiektu
- static GLfloat pix2angle_x; // przelicznik pikseli na stopnie
- static GLfloat pix2angle_y; // przelicznik pikseli na stopnie
- static GLint status = 0; // stan klawiszy myszy
- // 0 - nie naci?ni?to ?adnego klawisza
- // 1 - naci?ni?ty zosta? lewy klawisz
- // 2 - naciśnięty prawy klawisz
- static int x_pos_old = 0; // poprzednia pozycja kursora myszy
- static int y_pos_old = 0;
- static int z_pos_old = 0;
- static int delta_x = 0; // ró?nica pomi?dzy pozycj? bie??c? i poprzedni? kursora myszy
- static int delta_y = 0;
- static int delta_z = 0;
- static int x_pos_old1 = 0; // poprzednia pozycja kursora myszy
- static int y_pos_old1 = 0;
- static int z_pos_old1 = 0;
- static int delta_x1 = 0; // ró?nica pomi?dzy pozycj? bie??c? i poprzedni? kursora myszy
- static int delta_y1 = 0;
- static int delta_z1 = 0;
- int model = 1;
- const int N = 50;
- double R = 10;
- float fi = 0.0;
- float fi1 = 0.0;
- double x(double u, double v) {
- return (((-90)*pow(u, 5)) + (225 * pow(u, 4)) + ((-270)*pow(u, 3)) + (180 * pow(u, 2)) + ((-45)*u))*cos(PI*v);
- }
- double y(double u, double v) {
- return ((160 * pow(u, 4)) + ((-320)*pow(u, 3)) + (160 * pow(u, 2)));
- }
- double z(double u, double v) {
- return (((-90)*pow(u, 5)) + (225 * pow(u, 4)) + ((-270)*pow(u, 3)) + (180 * pow(u, 2)) + ((-45)*u))*sin(PI*v);
- }
- GLfloat xu(double u, double v) {
- return (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45) * cos(PI * v);
- }
- GLfloat xv(double u, double v) {
- return PI * (90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u) * sin(PI * v);
- }
- GLfloat yu(double u, double v) {
- return 640 * pow(u, 3) - 960 * pow(u, 2) + 320 * u;
- }
- GLfloat yv(double u, double v) {
- return 0;
- }
- GLfloat zu(double u, double v) {
- return (-450 * pow(u, 4) + 900 * pow(u, 3) - 810 * pow(u, 2) + 360 * u - 45) * sin(PI * v);
- }
- GLfloat zv(double u, double v) {
- return -PI * (90 * pow(u, 5) - 225 * pow(u, 4) + 270 * pow(u, 3) - 180 * pow(u, 2) + 45 * u) * cos(PI * v);
- }
- GLfloat ret[3];
- void norm(double u, double v) {
- ret[0] = yu(u, v) * zv(u, v) - zu(u, v) * yv(u, v);
- ret[1] = zu(u, v) * xv(u, v) - xu(u, v) * zv(u, v);
- ret[2] = xu(u, v) * yv(u, v) - yu(u, v) * xv(u, v);
- GLfloat l = sqrt(ret[0] * ret[0] + ret[1] * ret[1] + ret[2] * ret[2]);
- ret[0] /= l;
- ret[1] /= l;
- ret[2] /= l;
- }
- /*void Colors()//losowanie i przydzielanie kolorów do tablicy
- {
- for (int i = 0; i < N; i++)
- {
- for (int j = 0; j < N; j++)
- {
- Color[i][j].x = float(rand() % 100) / 100;
- Color[i][j].y = float(rand() % 100) / 100;
- Color[i][j].z = float(rand() % 100) / 100;
- }
- }
- }*/
- 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
- glVertex3dv(x_min);
- glVertex3dv(x_max);
- glEnd();
- glColor3f(0.0f, 1.0f, 0.0f); // kolor rysowania - zielony
- glBegin(GL_LINES); // rysowanie osi y
- glVertex3dv(y_min);
- glVertex3dv(y_max);
- glEnd();
- glColor3f(0.0f, 0.0f, 1.0f); // kolor rysowania - niebieski
- glBegin(GL_LINES); // rysowanie osi z
- glVertex3dv(z_min);
- glVertex3dv(z_max);
- glEnd();
- }
- void egg() {
- //Wypełnienie kwadratu dziedziny parametrycznej
- pointsq = new point2*[N];
- for (int i = 0; i < N; i++) {
- pointsq[i] = new point2[N];
- for (int j = 0; j < N; j++) {
- pointsq[i][j][0] = (double)i / (N - 1);
- pointsq[i][j][1] = (double)j / (N - 1);
- }
- }
- double u = 0;
- double v = 0;
- //Wyznaczenie współrzędnych (x,y,z) dla punktów (u,v)
- points = new point3*[N];
- for (int i = 0; i < N; i++) {
- points[i] = new point3[N];
- for (int j = 0; j < N; j++) {
- points[i][j][0] = x(pointsq[i][j][0], pointsq[i][j][1]);
- points[i][j][1] = y(pointsq[i][j][0], pointsq[i][j][1]);
- points[i][j][2] = z(pointsq[i][j][0], pointsq[i][j][1]);
- }
- }
- glTranslated(0.0, -5.0, 0.0);
- if (model == 1) {
- glColor3f(1.0, 1.0, 1.0);
- glBegin(GL_POINTS);
- for (int i = 0; i < N; i++)
- for (int j = 0; j < N; j++)
- glVertex3dv(points[i][j]);
- glEnd();
- }
- if (model == 2) {
- glColor3f(1.0, 1.0, 1.0);
- for (int i = 0; i < N - 1; i++) {
- for (int j = 0; j < N - 1; j++) {
- glBegin(GL_LINES);
- glVertex3dv(points[i][j]);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- glBegin(GL_LINES);
- glVertex3dv(points[i][j]);
- glVertex3dv(points[i + 1][j]);
- glEnd();
- glBegin(GL_LINES);
- glVertex3dv(points[i + 1][j]);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- glBegin(GL_LINES);
- glVertex3dv(points[i][j]);
- glVertex3dv(points[i + 1][j + 1]);
- glEnd();
- }
- }
- }
- if (model == 3) {
- glColor3f(1.0, 1.0, 1.0);
- for (int i = 0; i < N - 1; i++) {
- for (int j = 0; j < N - 1; j++) {
- if (i == 0 || i == N - 2) {
- glBegin(GL_TRIANGLES);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i + 1][j + 1]);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i + 1][j]);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- glBegin(GL_TRIANGLES);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i][j]);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i + 1][j]);
- glNormal3f(0, -1, 0);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- }
- else if (i == N / 2 - 1) {
- glBegin(GL_TRIANGLES);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i + 1][j + 1]);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i + 1][j]);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- glBegin(GL_TRIANGLES);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i][j]);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i + 1][j]);
- glNormal3f(0, 1, 0);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- }
- else if (i < N / 2) {
- glBegin(GL_TRIANGLES);
- norm(pointsq[i + 1][j + 1][0], pointsq[i + 1][j + 1][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i + 1][j + 1]);
- norm(pointsq[i + 1][j][0], pointsq[i + 1][j][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i + 1][j]);
- norm(pointsq[i][j + 1][0], pointsq[i][j + 1][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i][j + 1]);
- glEnd();
- glBegin(GL_TRIANGLES);
- norm(pointsq[i][j + 1][0], pointsq[i][j + 1][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i][j + 1]);
- norm(pointsq[i + 1][j][0], pointsq[i + 1][j][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i + 1][j]);
- norm(pointsq[i][j][0], pointsq[i][j][1]);
- glNormal3f(ret[0], ret[1], ret[2]);
- glVertex3dv(points[i][j]);
- glEnd();
- }
- else {
- glBegin(GL_TRIANGLES);
- norm(pointsq[i][j + 1][0], pointsq[i][j + 1][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i][j + 1]);
- norm(pointsq[i + 1][j][0], pointsq[i + 1][j][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i + 1][j]);
- norm(pointsq[i + 1][j + 1][0], pointsq[i + 1][j + 1][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i + 1][j + 1]);
- glEnd();
- glBegin(GL_TRIANGLES);
- norm(pointsq[i + 1][j][0], pointsq[i + 1][j][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i + 1][j]);
- norm(pointsq[i][j + 1][0], pointsq[i][j + 1][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i][j + 1]);
- norm(pointsq[i][j][0], pointsq[i][j][1]);
- glNormal3f(-ret[0], -ret[1], -ret[2]);
- glVertex3dv(points[i][j]);
- glEnd();
- }
- }
- }
- }
- }
- /*************************************************************************************/
- // Funkcja "bada" stan myszy i ustawia warto?ci odpowiednich zmiennych globalnych
- void Mouse(int btn, int state, int x, int y)
- {
- if (state == GLUT_DOWN)
- {
- if (btn == GLUT_LEFT_BUTTON)
- {
- x_pos_old = x; // przypisanie aktualnie odczytanej pozycji kursora
- y_pos_old = y; // jako pozycji poprzedniej
- status = 1; // wciśnięty został lewy klawisz myszy
- }
- if (btn == GLUT_RIGHT_BUTTON)//wciśnięty został prawy klawisz
- {
- x_pos_old1 = x;
- y_pos_old1 = y;
- status = 2;
- }
- }
- else {
- status = 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;
- x_pos_old = x; // podstawienie bieżącego położenia jako poprzednie
- y_pos_old = y;
- delta_x1 = x - x_pos_old1; // obliczenie różnicy położenia kursora myszy
- delta_y1 = y - y_pos_old1;
- x_pos_old1 = x; // podstawienie bieżącego położenia jako poprzednie
- y_pos_old1 = y;
- glutPostRedisplay(); // przerysowanie obrazu sceny
- }
- /*************************************************************************************/
- /*************************************************************************************/
- // Funkcja okre?laj?ca co ma by? rysowane (zawsze wywo?ywana, gdy trzeba
- // przerysowa? scen?)
- void RenderScene(void)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // Czyszczenie okna aktualnym kolorem czyszczącym
- glLoadIdentity();
- // Czyszczenie macierzy bieżącej
- if (status == 1) // jeśli lewy klawisz myszy wciśnięty
- {
- theta += 0.2*delta_x*pix2angle_x; // modyfikacja kąta obrotu o kąt proporcjonalny
- fi += 0.2*delta_y*pix2angle_y; // do różnicy położeń kursora myszy
- viewer0[0] = R * cos(theta) * cos(fi);
- viewer0[1] = R * sin(fi);
- viewer0[2] = R * sin(theta) * cos(fi); /*if (fi >= 2)
- fi = 0;
- if (theta >= 2)
- theta = 0;*/
- }
- else if (status == 2) { // jeśli prawy klawisz myszy wciśnięty
- theta1 += 0.2*delta_x1*pix2angle_x; // modyfikacja kąta obrotu o kąt proporcjonalny
- fi1 += 0.2*delta_y1*pix2angle_y; // do różnicy położeń kursora myszy
- viewer1[0] = R * cos(theta1) * cos(fi1);
- viewer1[1] = R * sin(fi1);
- viewer1[2] = R * sin(theta1) * cos(fi1);
- }
- gluLookAt(10, 0, 0, 0.0, 0.0, 0.0, 0.0, 1, 0.0);
- GLfloat light_position[] = { viewer0[0], -viewer0[1], -viewer0[2], 1.0 };
- GLfloat light_position1[] = { viewer1[0], -viewer1[1], -viewer1[2], 1.0 };
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
- glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
- Axes();
- glColor3f(1.0f, 1.0f, 1.0f);
- // Ustawienie koloru rysowania na bia?y
- egg();
- //glutWireTeapot(3.0);
- // Narysowanie czajnika
- glFlush();
- // Przekazanie polece? rysuj?cych do wykonania
- glutSwapBuffers();
- //
- }
- void keys(unsigned char key, int x, int y)
- {
- if (key == 'p') model = 1;
- if (key == 'w') model = 2;
- if (key == 's') model = 3;
- RenderScene(); // przerysowanie obrazu sceny
- }
- /*************************************************************************************/
- // Funkcja ustalaj?ca stan renderowania
- void MyInit(void)
- {
- /*************************************************************************************/
- // 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, 1.0, 1.0 };
- // współczynniki ka =[kar,kag,kab] dla światła otoczenia
- GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
- // współczynniki kd =[kdr,kdg,kdb] światła rozproszonego
- GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
- // współczynniki ks =[ksr,ksg,ksb] dla światła odbitego
- GLfloat mat_shininess = { 200.0 };
- // współczynnik n opisujący połysk powierzchni
- /*************************************************************************************/
- // Definicja źródła światła
- GLfloat light_position0[] = { viewer0[0], viewer0[1], viewer0[2], 1.0 };
- // położenie źródła
- GLfloat light_position1[] = { viewer1[0], viewer1[1], viewer1[2], 0.5 };
- GLfloat light_ambient0[] = { 0.2, 0.2, 0.1, 1.0 };
- // składowe intensywności świecenia źródła światła otoczenia
- // Ia = [Iar,Iag,Iab]
- GLfloat light_ambient1[] = { 0.1, 0.2, 0.2, 0.5 };
- GLfloat light_diffuse0[] = { 2.0, 2.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_diffuse1[] = { 1.0, 2.0, 2.0, 0.5 };
- GLfloat light_specular0[] = { 2.0, 2.0, 1.0, 1.0 };
- // składowe intensywności świecenia źródła światła powodującego
- // odbicie kierunkowe Is = [Isr,Isg,Isb]
- GLfloat light_specular1[] = { 2.0, 1.0, 2.0, 1.0 };
- GLfloat att_constant = { 3.0 };
- // składowa stała ds dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- //GLfloat att_linear = { 0.05 };
- // składowa liniowa dl dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- // GLfloat att_quadratic = { 0.001 };
- // 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_ambient0);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse0);
- glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular0);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position0);
- glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, att_constant);
- glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05);
- glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.001);
- glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient1);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse1);
- glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular1);
- glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
- glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, att_constant);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.05);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.001);
- /*************************************************************************************/
- // 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_LIGHT1); // włączenie źródła o numerze 1
- 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)
- {
- pix2angle_x = 360.0*0.1 / (float)horizontal; // przeliczenie pikseli na stopnie
- pix2angle_y = 360.0*0.1 / (float)vertical;
- 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)
- {
- //Colors();
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(300, 300);
- glutCreateWindow("Rzutowanie perspektywiczne");
- glutKeyboardFunc(keys);
- 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
- 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
- glutMouseFunc(Mouse);
- // Ustala funkcj? zwrotn? odpowiedzialn? za badanie stanu myszy
- glutMotionFunc(Motion);
- // Ustala funkcj? zwrotn? odpowiedzialn? za badanie ruchu myszy
- // cout << Point[3][4].x << " x" << endl;
- glutMainLoop();
- // Funkcja uruchamia szkielet biblioteki GLUT
- }
- /*************************************************************************************/
Advertisement
Add Comment
Please, Sign In to add comment