Qt OpenGL - 用鼠标拖动旋转 - 负增量

时间:2012-12-21 21:13:34

标签: qt opengl rotation qglwidget

我有一个QGLWidget的GLWdiget子类,我想沿着Ox和Oy轴旋转一个3D对象。

为此,我以这种方式重新实现了mousePressEventmouseMoveEvent功能:

void GLWidget::mousePressEvent(QMouseEvent *event)
{
 lastPos = event->pos();
}

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

 if (event->buttons() & Qt::LeftButton) 
   {
   glRotatef(dy*0.1, 1.0f, 0.0f, 0.0f);
   glRotatef(dx*0.1, 0.0f, 1.0f, 0.0f);
   }
}

我的问题是dxdy永远不会是负面的,所以无论我对鼠标做什么方向,它总是朝同一方向旋转。

例如,如果我向右水平拖动,我希望对象沿着0y轴以正角度旋转,如果我向左水平拖动,则以负角度旋转。

对于垂直拖动,这将是相同的,但旋转将沿着Ox轴。

此问题是否来自全球坐标?但是,event->xevent->y会给出相对于GLWidget的位置。

1 个答案:

答案 0 :(得分:4)

您是不是在mouseMoveEvent结束时更新lastPos? 从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();
}

我建议您查看Qt Hello GL,这似乎与您的用例相符。