1

Qt で OpenGL を使用しておりQGLWidget、基本的なマウスとキーボード駆動の対話を実装しようとしています。

たとえば、キーボードの矢印キーを使用してシーンを「パン」し、マウス ホイールを使用してシーンをズームし、マウスを使用してモデルを回転する必要があります。

パンとズームの実装方法はわかりましたが、回転の実装に問題があります。

これは私がこれまでに持っているものです:

void MyGLWidget::paintGL() {
    glLoadIdentity();
    gluLookAt(0+camDelta[0],0+camDelta[1],-100+camDelta[2],centerCoords[0]+lookAtDelta[0],centerCoords[1]+lookAtDelta[1],centerCoords[2]+lookAtDelta[2],0,1,0);
    // draw stuff here
}

したがって、基本的には初期gluLookAtパラメータを設定し、2 つの配列 と を追加float camDelta[3]float lookAtDelta[3]て、カメラの位置の変化と、ユーザーがシーンを操作するのに応じてカメラが見ている場所を追跡します。

マウス ホイールについては、次のようにします。

void MyGLWidget::wheelEvent(QWheelEvent *event) {
    camDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    lookAtDelta[2] += (event->delta() / 8.0 / 15.0) * WHEEL_DELTA;
    updateGL();
}

同様に、 では、左右にパンMyGLWidget::keyPressEventするためにデルタのフィールドを変更し、上下にパンするためにデルタを変更します。[0][1]

だから私の質問は、マウスでの回転をサポートするために似たようなものをどのように実装するのですか? カメラが見ている場所だけでなく、アップ ベクトルも何らかの方法で変更する必要があると推測しているため、ちょっと混乱していますが、それを行う方法について明確な考えがありません。

4

2 に答える 2

3

このようなもののために私が行ったことは、軌道カメラ モデルと呼ばれます。

カメラのターゲット位置 (または視線) と、その他の 3 つのパラメーター (方位角、赤緯 (または傾斜角)、および距離 (または半径)) を追跡します。方位角は、ターゲットを水平方向に中心としたカメラの回転です (ターゲットが地面にあり、それを見ながら円を描くようにその周りを歩いているかのように)。赤緯は垂直回転です。距離は、まあ、ターゲットとカメラの間の距離です。

これらは球座標とも呼ばれます。

http://mathworld.wolfram.com/SphericalCoordinates.html

次のような方程式が必要です。

x = r * sin(phi) * cos(theta)
y = r * sin(phi) * sin(theta)
z = r * cos(phi)

ここで、r は距離、theta は方位角、phi は偏角です。これにより、カメラのルックアット位置からカメラ位置までのオフセットが得られます。

だからここにあなたがすることです。カメラのターゲット位置を維持しますが、カメラの位置は維持しません。カメラをパンすると、ターゲット位置が移動します。カメラを回転させるときは、方位角と偏角を調整します。カメラをズームするときは、距離を調整します。次に、gluLookAt を呼び出す前のすべてのフレームで、上記の式を使用してカメラの位置を計算します。その x、y、および z をターゲット位置に追加するだけです。

于 2012-06-15T21:08:13.347 に答える
0

これに対する最善のアプローチは、クォータニオンを使用することです。複素数が 2D での回転に非常に役立つように、四元数は 3D 回転に最適です。

標準の「x、y、z 軸を中心に回転」は機能しますが、動作が奇妙になり、期待どおりにはなりません。

これらすべてについてのすばらしいチュートリアルをhttp://content.gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotationで入手できます。

于 2012-06-15T21:29:12.227 に答える