0

QtのドキュメントでHello GLの例を調べていました。

マウスドラッグでシーンを回転させるのに役立つコードがいくつかあります。

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

 void GLWidget::setXRotation(int angle)
{
   qNormalizeAngle(angle);
   if (angle != xRot) {
       xRot = angle;
       emit xRotationChanged(angle);
       updateGL();
   }
}

ドラッグの過程で x/y 座標の変化を計算しようとしていることがわかります。

しかし、彼らはそれをシーンの回転にどのようにマッピングしていますか? ドキュメントには、何が行われているのかについての説明がありません。

また、これらのマジックナンバーは8どうですか?

4

2 に答える 2

2

OpenGL は、基本的に描画用の鉛筆です。シーンのようなものはありません。あなた、プログラマーは変数の束を作成し、何かを描画するときは、それらを使用して OpenGL である鉛筆の周りを移動します。

特定のケースでは、いくつかの変数がありxRotyRotオブジェクトzRotの描画に適用される変換チェーンの作成に使用されます。実際の描画は で行われGLWidget::paintGLます。私はあなたのためにそれに注釈を付けました:

 void GLWidget::paintGL()
 {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity(); // reset transformation state
     glTranslatef(0.0, 0.0, -10.0); // apply translation to transformation
     glRotatef(xRot / 16.0, 1.0, 0.0, 0.0); // apply rotation on x
     glRotatef(yRot / 16.0, 0.0, 1.0, 0.0); // apply rotation on x
     glRotatef(zRot / 16.0, 0.0, 0.0, 1.0); // apply rotation on x
     logo->draw(); // draw logo using the currently set transformation
 }
于 2015-01-27T09:46:51.607 に答える
-1

emit xRotationChanged(angle) - シーンを x 軸で回転させます

8 はマウスの感度を処理します

于 2015-01-27T09:34:01.057 に答える