【问题标题】:Qt OpenGL - Rotating with mouse dragQt OpenGL - 用鼠标拖动旋转
【发布时间】:2015-01-27 07:09:33
【问题描述】:

我正在浏览 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 是怎么回事?

【问题讨论】:

  • 有时,或者更确切地说,很多时候,这些数字是根据经验得出的。尝试了不同的数字,并选出了最好的、最神奇的数字。

标签: c++ qt opengl qtopengl


【解决方案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
 }

【讨论】:

  • 我理解这部分。我特别关心的是代码中出现的那些特殊数字。为什么鼠标位置的变化会乘以/除以这些幻数 (8,16)?
  • @AmitTomar:这些只是(硬编码)比例因子。除了赋予交互某种“感觉”之外,它们没有特殊意义。在更复杂的实现(比如轨迹球)中,缩放甚至可能取决于指针相对于运动开始位置的位置。
【解决方案2】:

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

8 处理您的鼠标灵敏度

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多