Главная страница
Навигация по странице:

  • Исходный

  • Лабораторная работа. Программа написана на языке С, в среде разработки Visual Studio, с использованием OpenGL


    Скачать 36.04 Kb.
    НазваниеПрограмма написана на языке С, в среде разработки Visual Studio, с использованием OpenGL
    Дата17.01.2018
    Размер36.04 Kb.
    Формат файлаdocx
    Имя файлаЛабораторная работа.docx
    ТипПрограмма
    #34419

    Оглавление


    Цель работы. 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 - Результат работы программы

    Описание функций:


    1. glTranslatef() - перемещение

    2. glRotatef() – поворот объекта

    3. glColor3f()- установка цвета

    4. glutSolidCube(GLdouble size)- команда построения куба

    5. glutSolidTorus()-команда построения тора

    6. glutSolidCone()-команда построения конуса

    7. glClearColor()- цвет очистки окна

    8. glClearDept()-Код очистки буфера глубины

    9. glEnable(GL_DEPTH_TEST) - Включить проверку глубины для z-отбраковки

    10. glDepthFunc(GL_LEQUAL) - тип теста глубины

    11. glShadeModel(GL_SMOOTH) - включить плавное затенение

    12. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)- коррекция

    13. glMatrixMode(GL_MODELVIEW)-  матрица модели

    14. glLoadIdentity()- считывает текущую матрицу

    15. glutSwapBuffers() - переключить буферы в режиме двойной буферизации

    16. glViewport(0, 0, ClientWidth, ClientHeight) - задание области вывода

    17. gluPerspective(fovy, aspect, near, far) - перспективное преобразование

    18. gluLookAt() - установка точки наблюдения

    19. glMatrixMode(GL_PROJECTION) - Матрица проекции

    20. glutTimerFunc(unsigned int msecs, (*func)(int value), int value) – таймер

    21. processNormalKeys(unsigned char key, x, y) – установка команд для клавиатуры

    22. glutInitDisplayMode(GLUT_DOUBLE);

    23. glutInitWindowSize(640, 480) – размер окна

    24. glutInitWindowPosition(50, 50) – расположение окна на экране

    25. glutCreateWindow("Pyramid") – название окна

    26. glutDisplayFunc(display) – вызов окна

    27. glutReshapeFunc(reshape) – изменение размера она

    28. glutKeyboardFunc(processNormalKeys) - вызов клавиатуры для текущего окна

    29. initGL() – инициализация OpenGL

    30. glutInit(&argc, argv) – инициализация Glu

    31. glutMainLoop()-запустить основной цикл обработки Glut



    Вывод. 


    В результате выполнения лабораторной работы была реализована трехмерная сцена с перспективным преобразованием, создана пирамида из объектов, выполнена анимация в виде вращения.


    написать администратору сайта