Построение графиков функций (C++, OpenGL)

Имеется задание - необходимо по имеющимся параметрическим функциям

x = cos(u)*sin(v)
y = sin(u)*sin(v)
z = cos(v) + lg(tan(v/2)) + u/5 - 4
u в [0, 4*pi] и v в [0.001, 2]

построить график этой функции на C++ с использованием библиотеки OpenGL. Также, требуется осуществить масштабирование графика и его вращение (при помощи мыши или клавиатуры).

У меня имеется написанный код:

#pragma once
//подключаем нужные библиотеки
#include "windows.h"

#include "GL/gl.h"

#include "GL/glu.h"

#include "glut.h"

#pragma comment(lib, "OpenGL32.lib")
#pragma comment(lib, "glut32.lib")

#include <cmath>
const double pi = 3.14159265358979323846;
float angle = 0.0;

//Ключи статуса камеры. Переменные инициализируются нулевыми значениями
float deltaAngle = 0.0f;
float deltaMove = 0;

//функция отрисовки графика параметрической функции
void draw_3d() {
    //отрисовываем примитивы (точки в данном случае)
    glBegin(GL_POINTS);
    for (double u = 0.0; u <= 4.0 * pi; u += 0.1) {
        for (double v = 0.001; v <= 2.0; v += 0.1) {
            double x = cos(u) * sin(v);
            double y = sin(u) * sin(v);
            double z = cos(v) + log(tan(v / 2)) + u / 5.0 - 4.0;
            glVertex3d(x, y, z);
        }
    }
    //заканчиваем отрисовку примитивов
    glEnd();
}

// Функция отрисовки
void display() {
    //очищаем буферы цвета и глубины
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    //устанавливаем позицию камеры и точку, на которую камера направлена
    gluLookAt(5.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    
    //устанавливаем цвет примитивов
    glColor3f(0.0, 1.0, 0.0);
    draw_3d();

    //указываем текущую матрицу
    glMatrixMode(GL_MODELVIEW);
    //устанавливаем единичную матрицу - начальное состояние объекта
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -60.0f);
    //вращаем график 
    glRotatef(angle, 1.0, 1.0, 1.0);
    //прорисовываем экран
    glFlush();
}

//функция вращения графика
void idle() {
    // увеличиваем угол вращения
    angle += 0.05;

    // перерисовываем сцену
    glutPostRedisplay();
}
// Функция изменения размеров окна
void reshape(int width, int height) {
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //устанавливаем матрицу перспективной проекции (для визуализации объемного пространства)
    gluPerspective(50.0, (double)width / (double)height, 0.01, 200.0);
    glMatrixMode(GL_MODELVIEW);
}

// Основная функция
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(50, 120);
    glutCreateWindow("График функции");

    glEnable(GL_DEPTH_TEST);

    glutDisplayFunc(display);
    glutIdleFunc(idle);
    glutReshapeFunc(reshape);

    //вход в главный цикл
    glutMainLoop();

    return 0;
}

Однако, вращение задается первоначально само (т.е. во время работы программы не получается вращать), как и масштабирование. Как можно задать в коде программы так, чтобы осуществлять их во время работы самой программы? (через какие функции)


Ответы (0 шт):