在Qt5中计算OpenGL绘图中鼠标移动的对象旋转角度

时间:2017-11-13 02:52:27

标签: c++ qt opengl rotation

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);
    ....
}

2 个答案:

答案 0 :(得分:0)

有关代码的一切都闻起来像是一个根本不知道他们正在做什么的人。

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

夹紧到范围[0,360 * 16]只是废话的一部分。他们只是以一种非常迟钝和疯狂的方式将

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

答案 1 :(得分:0)

我会假设他们只是想在旋转中保持更高的精度,因为示例中的变量是整数。用浮子将它们分开可以使旋转更平稳。 通过乘以鼠标dx只是使其变得更加敏感-使其更容易翻转。 我认为这反倒不是一个坏例子。