【问题标题】:Calculate object rotation angle from mouse movement in OpenGL drawing in Qt5在 Qt5 的 OpenGL 绘图中根据鼠标移动计算对象旋转角度
【发布时间】:2018-04-25 16:04:17
【问题描述】:

在Qt 5.9 Qt OpenGL Hello GL2 Example中,为了实现物体的旋转,在根据鼠标移动计算旋转时,有一个度数归一化函数。我只是不明白 1)为什么它需要 dx 和 dy 时间 8 来获得鼠标移动距离?和 2)然后在这里 360 乘以 16 来归一化角度,为什么是 16?和 3) 什么时候通过除以 16 来设置渲染中的旋转?谢谢。

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

    if (event->buttons() & Qt::RightButton) {
        ....
        setZRotation(m_zRot + 8 * dx);
    }
    m_lastPos = event->pos();
}

static void qNormalizeAngle(int &angle) {
    while (angle < 0)
        angle += 360 * 16;
    while (angle > 360 * 16)
        angle -= 360 * 16;
}

void GLWidget::setZRotation(int angle)
{
    qNormalizeAngle(angle);
    if (angle != m_zRot) {
        m_zRot = angle;
        .....
        update();
    }
}

void GLWidget::paintGL() {
    ....
    m_world.rotate(m_zRot / 16.0f, 0, 0, 1);
    ....
}

【问题讨论】:

    标签: c++ qt opengl rotation


    【解决方案1】:

    我会假设他们只是试图在旋转中保持更高的精度,因为示例中的变量是整数。用浮点数将它们分开可能会导致更平滑的旋转。 通过增加鼠标 dx 只是让它更敏感 - 更容易转动它。 无论如何,我认为这不是那么糟糕的例子。

    【讨论】:

      【解决方案2】:

      有关代码的所有内容都像是一个根本不知道自己在做什么的人。

      他们所做的效果是这样的。他们将输入角度相对于鼠标增量缩放了 8 倍。这会导致最终角度大 8 倍。但随后他们将这个角度除以 16,然后得到矩阵。因此,他们所做的就是将输入角度缩放 0.5。

      限制在 [0, 360 * 16] 范围内只是废话的一部分。它们真的钳制到 [0, 360],只是以一种非常愚蠢和疯狂的方式。

      总的来说,我想说你应该避免像瘟疫一样使用 Qt 的示例代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-18
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-21
        • 1970-01-01
        相关资源
        最近更新 更多