Вращение сцены в OpenGL при помощи мыши (Qt)

Для изучения материала заметки вращения сцены в OpenGL при помощи мыши сначала необходимо изучить материал этой заметки.

Идея очень проста - перехватить ивент мыши, определить скорость перемещения указатель мыши и, основываясь на этом, рассчитать угол поворота сцены. Фактически, то же, что и в предыдущем примере, но вращение осуществляется не по таймеру, а по ивенту мыши (движение мыши с нажатой кнопкой).

void WOpengl::rotate()
{
 //Проверяем переполнение (360 градусов)
 (angle_x > 360)? angle_x = 0 : 0;
 (angle_z > 360)? angle_z = 0 : 0;

//Проверяем переполнение (0 градусов) (angle_x < 0)? angle_x = 360: 0; (angle_z < 0)? angle_z = 360: 0;

glMatrixMode(GL_MODELVIEW); glLoadIdentity();

//Очищаем экран glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//Делаем поворот системы glRotated(angle_x,1,0,0); glRotated(angle_z,0,1,0);

//Вызываем функцию отрисовки paintGL(); } void WOpengl::mouseMoveEvent(QMouseEvent*me) { //Проверка сильно большого отклонения - например, чтобы сцена не самовращалась при сворачивании-розварачивании окна, при перемещении на большое расстояние курсора с отпускнием и т.д. Не есть обязательным - но так естественнее if(abs(me->x()-mouse_x)>=20) mouse_x=me->x(); if(abs(me->y()-mouse_y)>=20) mouse_y=me->y();

//Меняем угол поворота в зависимости от положения мыши angle_x += (mouse_y-me->y())/2; angle_z += (mouse_x-me->x())/2;

//Сохраняем текущее значение координат курсора для возможности определения скорости их изменения. mouse_x = me->x(); mouse_y = me->y();

//Вызываем метод, который обработает поворот и выведет обновленное изображение rotate();

Ясно, что все новые методы и переменные нужно определить:
class WOpengl: public QGLWidget
{
 Q_OBJECT
 public:
   ...
    double angle_x; 
    double angle_z; 
    double mouse_x; 
    double mouse_y;
    void mouseMoveEvent(QMouseEvent *me);
...
}
Вот и все.

Готовый проект: qtopengl_rotate