2

興味のある場所を中心に「カメラ」を回転させたいです。現在、カメラは原点を中心にのみ回転します。

多くのチュートリアルでは、次のスキームを使用することを提案しています。

translate(-P)
rotate
translate(P) 

残念ながら、これは機能しません。私のアプリケーションは、平行移動ベクトル(QVector3D)とクォータニオン(QQuaternion)を使用して、カメラの平行移動と回転を保存します。

現在、これは次のように実行され、常に原点を中心に回転します。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(translation.x(),translation.y(), translation.z());
multMatrix(accumulatedQuaternionRotation);

ここで、mulMatrixはQuaternionを使用して、glMultMatrixf()に渡される4x4マトリックスを構築します。

このようなものを使用する:

glTranslatef(-translation.x(),-translation.y(), -translation.z());
multMatrix(accumulatedQuaternionRotation);
glTranslatef(translation.x(),translation.y(), translation.z());

その結果、非常に奇妙なコントロールになり、これ以上説明することはできません。私のアプリケーションでは、translation.z()は次のことを意味します。カメラを前方に移動します。x()とy()を変更すると、パンのような操作が発行されます。

変換ベクトルを間違って使用しているため、上記の一連の操作が失敗したと思われます。

他に確認できることはありますか?

編集:これは、クォータニオン回転がどのように機能するかです。

        // calculate rotation axis
        QVector3D rotationAxis = QVector3D(diff.y(), diff.x(), 0.0).normalized();

        // update rotation see http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
        accumulatedQuaternionRotation = QQuaternion::fromAxisAndAngle(rotationAxis, diff.length()/4.0f) * accumulatedQuaternionRotation;

diffは、単に2つのマウス移動イベントポイントの差です。

4

1 に答える 1

5

あなたがしようとしているのは、基本的にgluLookAtを実装することですよね?

gluLookAt の機能は次のとおりです。そこから必要なものをコピーできるはずです。

http://www.opengl.org/wiki/GluLookAt_code

ベクトルとクォータニオンで実際に何をしようとしているのかはわかりませんが、gluLookat に慣れていない人にとってはかなり高度なように見えるので、そこで何をしているのかはわかっていると思います。

于 2013-01-14T21:46:51.197 に答える