Qt OpenGL - 用鼠标拖动旋转

时间:2015-01-27 07:09:33

标签: c++ qt opengl qtopengl

我正在浏览Qt文档中的Hello GL Example

他们有一些代码可以帮助用鼠​​标拖动旋转场景。

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是什么?

2 个答案:

答案 0 :(得分:2)

OpenGL基本上是用来绘制东西的铅笔。没有像场景这样的东西。你,程序员创建了一堆变量,然后,当它绘制一些东西时,用它来移动OpenGL的铅笔。

在您的特定情况下,有一些变量xRotyRotzRot用于创建应用于绘制对象的转换链。实际绘图发生在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
 }

答案 1 :(得分:-1)

emit xRotationChanged(angle) - 在x轴上旋转场景

8可处理您的鼠标灵敏度