Лабораторная работа. Программа написана на языке С, в среде разработки Visual Studio, с использованием OpenGL
Скачать 36.04 Kb.
|
ОглавлениеЦель работы. 1 Задание. 2 Описание работы. 2 Программная реализация. 2 Исходный код. 2 Описание функций: 5 Вывод. 6 Цель работы.Научиться создавать трехмерную сцену, состоящую из нескольких объектов. Задание.Создать трёхмерную сцену. Задать перспективное проецирование и определить пирамиду видимости. Расположить объекты: куб, конус и тор в виде пирамиды. Задать смещение для каждой фигуры, согласно примеру. Реализовать вращение пирамиды. Описание работы.Программа написана на языке С++, в среде разработки Visual Studio, с использованием OpenGL. Были подключены стандартные библиотеки gl, glu, а также библиотека glut, с помощью которой были реализованы все объекты. Программная реализация.Для создания сцены была задана область вывода объектов и способ проецирования. Для визуализации трёхмерного изображения с перспективой выполнено перспективное преобразование. Были использованы видовые преобразования, к которым относится перенос и поворот . Для проведения этих операций достаточно умножить на соответствующую матрицу каждую вершину объекта и получить измененные координаты этой вершины. Функции glTranslatef и glRotatef(). Анимация в программе реализована с помощью функций glutTimerFunc() и timer(). Вращение пирамиды и её остановка осуществляются по кнопкам клавиатуры, пробел и escape соответственно. Исходный код.#include #include #include #include int a = 0; bool b = 0; void initGL() { glClearColor(0.0, 0.0, 0.0, 1.0); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //куб1 glTranslatef(0.0, -3.0, -3.0); glRotatef(a, 0, 1, 0); glRotatef(45, 0, 1, 0); glColor3f(1.0, 0.0, 0.0); glutSolidCube(2); //куб2 glLoadIdentity(); glTranslatef(0.0, -1.1, -3.0); glRotatef(a, 0, 1, 0); glColor3f(0.0, 0.0, 1.0); glutSolidCube(1.5); //Тор glLoadIdentity(); glTranslatef(0.0, 0.0, -3.0); glRotatef(a, 0, 1, 0); glRotatef(90, 1, 0, 0); glColor3f(0.0, 1.0, 1.0); glutSolidTorus(0.3, 1.3, 50, 50); //Конус glRotatef(180, 1, 0, 0); glColor3f(1.0, 1.0, 0.0); glutSolidCone(1.0, 1.7, 50, 50); glutSwapBuffers(); } void reshape(GLsizei width, GLsizei height) { // для неотрицательного целого числа // Вычисление соотношения сторон в новом окне чтобы предотвратить деление на 0 if (height == 0) height = 1; GLfloat aspect = (GLfloat)width / (GLfloat)height; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70, aspect, 1, 50); //перспективное преобразование gluLookAt(0, 2, 4, 0, 0, 0, 0, 50, 0); } void timer(int = 0) { if (b == 1) { ++a; display(); glutTimerFunc(12, timer, 0); } else display(); } void processNormalKeys(unsigned char key, int x, int y) { switch (key) { case 27: //escape (ASCII) b = 0; timer(); break; case 32: //пробел b = 1; timer(); } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE); glutInitWindowSize(640, 480); glutInitWindowPosition(50, 50); glutCreateWindow("Pyramid"); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(processNormalKeys); initGL(); glutMainLoop(); return 0; } Рис.1 - Результат работы программы Описание функций:
Вывод.В результате выполнения лабораторной работы была реализована трехмерная сцена с перспективным преобразованием, создана пирамида из объектов, выполнена анимация в виде вращения. |