2

我有一个 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);
   }
}

我的问题是,dx并且dy永远不会是负数,所以无论我用鼠标做什么方向,它总是在同一个方向旋转。

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

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

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

4

1 回答 1

5

您没有在 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 。

于 2012-12-21T21:28:49.943 回答