2

QGLWidgetのGLWdigetサブクラスがあり、Ox軸とOy軸に沿って3Dオブジェクトを回転させたいと考えています。

このために、私はこのように再実装mousePressEventしてmouseMoveEvent機能しました:

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->xGLWidgetevent->yを基準にした位置を指定します。

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

ユースケースに一致すると思われるQtHelloGLを確認することをお勧めします。

于 2012-12-21T21:28:49.943 に答える