Построение графиков функций (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;
}
Однако, вращение задается первоначально само (т.е. во время работы программы не получается вращать), как и масштабирование. Как можно задать в коде программы так, чтобы осуществлять их во время работы самой программы? (через какие функции)