Qt OpenGL — вращение с помощью перетаскивания мышью

Я проходил через Hello GL Пример в документации Qt.

У них есть некоторый код, который помогает вращать сцену с помощью мыши.

void GLWidget::mouseMoveEvent(QMouseEvent *event)
{
int dx = event->x() - lastPos.x();
int dy = event->y() - lastPos.y();

if (event->buttons() & Qt::LeftButton) {
setXRotation(xRot + 8 * dy);
setYRotation(yRot + 8 * dx);
} else if (event->buttons() & Qt::RightButton) {
setXRotation(xRot + 8 * dy);
setZRotation(zRot + 8 * dx);
}
lastPos = event->pos();
}

А также

 void GLWidget::setXRotation(int angle)
{
qNormalizeAngle(angle);
if (angle != xRot) {
xRot = angle;
emit xRotationChanged(angle);
updateGL();
}
}

Я могу понять, что они пытаются вычислить изменение координат x / y в процессе перетаскивания.

Но как они соотносят это с поворотом сцены? В документации отсутствует объяснение того, что делается.

Кроме того, что с этими магическими числами 8 ?

-1

Решение

OpenGL — это карандаш для рисования. Там нет такой вещи, как сцена. Вы, программист, создаете кучу переменных, а затем, когда пришло время рисовать что-то, используйте их для перемещения по карандашу, который является OpenGL.

В вашем конкретном случае есть некоторые переменные xRot, yRot а также zRot которые используются при создании цепочки преобразования, применяемой для рисования объекта. Фактический рисунок происходит в GLWidget::paintGL; Я аннотировал это для вас:

 void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); // reset transformation state
glTranslatef(0.0, 0.0, -10.0); // apply translation to transformation
glRotatef(xRot / 16.0, 1.0, 0.0, 0.0); // apply rotation on x
glRotatef(yRot / 16.0, 0.0, 1.0, 0.0); // apply rotation on x
glRotatef(zRot / 16.0, 0.0, 0.0, 1.0); // apply rotation on x
logo->draw(); // draw logo using the currently set transformation
}
2

Другие решения

emit xRotationChanged (angle) — вращает вашу сцену по оси x

8 управляет чувствительностью вашей мыши

-1

По вопросам рекламы [email protected]