2012-12-21 70 views
2

我有一個QGLWidget的GLWdiget子類,我想旋轉沿着Ox和Oy軸的3D對象。Qt OpenGL - 旋轉鼠標拖動 - 負三角洲

對於這一點,我已經重新實現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的位置。

回答

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這似乎符合您的使用案例。