Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <gl/gl.h>
- #include <gl/glut.h>
- #include <array>
- #include <math.h>
- #include <cstdlib>
- #include <ctime>
- #include <math.h>
- typedef float point3[3];
- static GLfloat viewer[] = { 0.0, 0.0, 10.0 };
- GLfloat light_position[] = { 5.0, 5.0, 5.0, 1.0 };
- GLfloat light_position1[] = { -5.0, -5.0, 5.0, 1.0 };
- static GLfloat thetaX = 0.0; // kąt obrotu obiektu
- static GLfloat thetaY = 0.0;
- static GLfloat thetaZ= 0.0;
- static GLfloat pix2angle; // 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
- static int x_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 y_pos_old = 0;
- static int delta_y = 0;
- static int z_pos_old = 0;
- static int delta_z = 0;
- float xs, ys, zs =10, xc, yc, zc, vx, vy, vz;
- 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
- y_pos_old = y;
- //z_pos_old = y;
- status = 1; // wcięnięty został lewy klawisz myszy
- //glDisable(GL_LIGHT1);
- glutPostRedisplay();
- }
- else if (btn == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
- {
- //z_pos_old = y;
- status = 2;
- //glEnable(GL_LIGHT1);
- light_position1[0] = (float)x / 100;
- light_position1[1] = (float)y / 100;
- glLightfv(GL_LIGHT1, GL_POSITION, light_position1);
- glutPostRedisplay();
- }
- else
- status = 0; // nie został wcięnięty żaden klawisz
- }
- void Motion(GLsizei x, GLsizei y)
- {
- delta_x = x - x_pos_old; // obliczenie różnicy położenia kursora myszy
- x_pos_old = x; // podstawienie bieżącego położenia jako poprzednie
- delta_y = y - y_pos_old;
- y_pos_old = y;
- delta_z = y - z_pos_old;
- //z_pos_old = y;
- vx = delta_x;
- vy = delta_y;
- glutPostRedisplay(); // przerysowanie obrazu sceny
- }
- 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();
- }
- void RenderScene(void)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- // Czyszczenie macierzy bie??cej
- gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
- Axes();
- // Narysowanie osi przy pomocy funkcji zdefiniowanej powyżej
- if (status == 1) // jeśli lewy klawisz myszy wcięnięty
- {
- thetaX += delta_x * pix2angle; // modyfikacja kąta obrotu o kat proporcjonalny
- thetaY += delta_y * pix2angle;
- } // do różnicy położeń kursora myszy
- else if (status == 2)
- {
- //thetaZ += delta_z;
- }
- //glTranslatef(0.0, 0.0, thetaZ);
- glRotatef(thetaX, 0.0, 1.0, 0.0); //obrót obiektu o nowy kąt
- glRotatef(thetaY, 1.0, 0.0, 0.0);
- glColor3f(1.0f, 1.0f, 1.0f);
- // Ustawienie koloru rysowania na biały
- glutSolidTeapot(3.0);
- // Narysowanie czajnika
- glFlush();
- // Przekazanie poleceń rysujących do wykonania
- glutSwapBuffers();
- }
- // Funkcja ustalająca stan renderowania
- void MyInit(void)
- {
- glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
- // Kolor czyszczący (wypełnienia okna) ustawiono na czarny
- 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 = { 20.0 };
- // współczynnik n opisujący połysk powierzchni
- //GLfloat light_position[] = { 5.0, 0.1, -2.0, 1.0 };
- //GLfloat light_position1[] = { -5.5, 0.1, -2.0, 1.0 };
- // położenie źródła
- GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat light_ambient1[] = { 0.0, 0.0, 0.0, 1.0 };
- // składowe intensywności świecenia źródła światła otoczenia
- // Ia = [Iar,Iag,Iab]
- GLfloat light_diffuse[] = { 1.0, 0.0, 0.0, 0.0 };
- GLfloat light_diffuse1[] = { 0.0, 0.0, 1.0, 0.0 };
- // składowe intensywności świecenia źródła światła powodującego
- // odbicie dyfuzyjne Id = [Idr,Idg,Idb]
- GLfloat light_specular[] = { 1.0, 0.0, 0.0, 1.0 };
- GLfloat light_specular1[] = { 1.0, 0.0, 0.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 };
- GLfloat att_constant1 = { 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.05 };
- GLfloat att_linear1 = { 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 };
- GLfloat att_quadratic1 = { 0.001 };
- // składowa kwadratowa dq dla modelu zmian oświetlenia w funkcji
- // odległości od źródła
- 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);
- 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);
- 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_constant1);
- glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, att_linear1);
- glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, att_quadratic1);
- 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 0
- glEnable(GL_DEPTH_TEST); // włączenie mechanizmu z-bufora
- }
- void ChangeSize(GLsizei horizontal, GLsizei vertical)
- {
- pix2angle = 360.0 / (float)horizontal; // 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);
- if (horizontal <= vertical)
- glViewport(0, (vertical - horizontal) / 2, horizontal, horizontal);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void main(void)
- {
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(300, 300);
- glutCreateWindow("Rzutowanie perspektywiczne");
- glutMouseFunc(Mouse);
- // Ustala funkcję zwrotną odpowiedzialną za badanie stanu myszy
- glutMotionFunc(Motion);
- // Ustala funkcję zwrotną odpowiedzialną za badanie ruchu myszy
- glutDisplayFunc(RenderScene);
- glutReshapeFunc(ChangeSize);
- MyInit();
- 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