Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // zajecia10manipulowanie.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <stdlib.h>
- #include "glut.h"
- #include <cmath>
- #include <iostream>
- #define PI 3.1415
- enum
- {
- FULL_WINDOW,
- WIDOK_1_1,
- WIRE_CONE, // stożek
- EXIT // wyjście
- };
- int aspect = FULL_WINDOW;
- int object = WIRE_CONE;
- const GLdouble left = -3.0;
- const GLdouble right = 3.0;
- const GLdouble bottom = -3.0;
- const GLdouble top = 3.0;
- const GLdouble near = 50.0;
- const GLdouble far = 80.0;
- GLfloat scale = 1.0;
- GLfloat rotatex = 0.0;
- GLfloat rotatey = 0.0;
- GLfloat translatex = 0.0;
- GLfloat translatey = 0.0;
- // funkcja generująca scenę 3D
- void Display()
- {
- glClearColor(1.0, 1.0, 1.0, 1.0);
- glClear(GL_COLOR_BUFFER_BIT);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0, 0, -(near + far) / 2);
- // skalowanie obiektu - klawisze "+" i "-"
- glScalef(scale, scale, scale);
- // obroty obiektu - klawisze kursora
- glRotatef(rotatex, 1.0, 0, 0);
- glRotatef(rotatey, 0, 1.0, 0);
- // kolor krawędzi obiektu
- glColor3f(0.0, 0.0, 0.0);
- // rysowanie obiektu
- switch (object)
- {
- // stożek
- case WIRE_CONE:
- glutWireCone(1.0, 2.0, 20, 10);
- break;
- }
- // skierowanie poleceń do wykonania
- glFlush();
- // zamiana buforów koloru
- glutSwapBuffers();
- }
- // zmiana wielkości okna
- void Reshape(int width, int height)
- {
- // obszar renderingu - całe okno
- glViewport(0, 0, width, height);
- // wybór macierzy rzutowania
- glMatrixMode(GL_PROJECTION);
- // macierz rzutowania = macierz jednostkowa
- glLoadIdentity();
- if (aspect == WIDOK_1_1)
- {
- if (width < height && width > 0)
- glFrustum(left, right, bottom * height / width, top * height / width, near, far);
- else
- if (width >= height && height > 0)
- glFrustum(left * width / height, right * width / height, bottom, top, near, far);
- }
- else
- glFrustum(left, right, bottom, top, near, far);
- // generowanie sceny 3D
- Display();
- }
- // obsługa klawiatury
- void Keyboard(unsigned char key, int x, int y)
- {
- // klawisz +
- if (key == '+')
- scale += 0.1;
- else
- // klawisz -
- if (key == '-' && scale > 0.1)
- scale -= 0.1;
- // odrysowanie okna
- Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
- }
- // obsługa klawiszy funkcyjnych i klawiszy kursora
- void SpecialKeys(int key, int x, int y)
- {
- switch (key)
- {
- case GLUT_KEY_LEFT:
- rotatey -= 1;
- break;
- case GLUT_KEY_UP:
- rotatex -= 1;
- break;
- case GLUT_KEY_RIGHT:
- rotatey += 1;
- break;
- case GLUT_KEY_DOWN:
- rotatex += 1;
- break;
- }
- Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
- }
- // obsługa menu podręcznego
- void Menu(int value)
- {
- switch (value)
- {
- case FULL_WINDOW:
- aspect = FULL_WINDOW;
- Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
- break;
- case WIDOK_1_1:
- aspect = WIDOK_1_1;
- Reshape(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
- break;
- case WIRE_CONE:
- object = WIRE_CONE;
- Display();
- break;
- case EXIT:
- exit(0);
- }
- }
- int main(int argc, char * argv[])
- {
- // inicjalizacja biblioteki GLUT
- glutInit(&argc, argv);
- // inicjalizacja bufora ramki
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- // rozmiary głównego okna programu
- glutInitWindowSize(600, 600);
- // utworzenie głównego okna programu
- #ifdef WIN32
- glutCreateWindow("Manipulacja");
- #else
- glutCreateWindow("Manipulacja");
- #endif
- // dołączenie funkcji generującej scenę 3D
- glutDisplayFunc(Display);
- // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
- glutReshapeFunc(Reshape);
- // dołączenie funkcji obsługi klawiatury
- glutKeyboardFunc(Keyboard);
- // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
- glutSpecialFunc(SpecialKeys);
- // utworzenie podmenu - aspekt obrazu
- int MenuAspect = glutCreateMenu(Menu);
- #ifdef WIN32
- glutAddMenuEntry("Całe okno", FULL_WINDOW);
- #else
- glutAddMenuEntry("Cale okno", FULL_WINDOW);
- #endif
- glutAddMenuEntry("1:1", WIDOK_1_1);
- // utworzenie podmenu - obiekt
- int MenuObject = glutCreateMenu(Menu);
- #ifdef WIN32
- glutAddMenuEntry("Stożek", WIRE_CONE);;
- #else
- glutAddMenuEntry("Stozek", WIRE_CONE);
- #endif
- // menu główne
- glutCreateMenu(Menu);
- glutAddSubMenu("Widok", MenuAspect);
- glutAddSubMenu("Obiekt", MenuObject);
- #ifdef WIN32
- glutAddMenuEntry("Wyjście", EXIT);
- #else
- glutAddMenuEntry("Wyjscie", EXIT);
- #endif
- // określenie przycisku myszki obsługującego menu podręczne
- glutAttachMenu(GLUT_RIGHT_BUTTON);
- // wprowadzenie programu do obsługi pętli komunikatów
- glutMainLoop();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement