興味のある場所を中心に「カメラ」を回転させたいです。現在、カメラは原点を中心にのみ回転します。
多くのチュートリアルでは、次のスキームを使用することを提案しています。
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つのマウス移動イベントポイントの差です。