在opengl中围绕关注点旋转相机

在opengl中围绕关注点旋转相机,opengl,3d,rotation,Opengl,3d,Rotation,我想围绕一个感兴趣的点旋转我的“相机”。当前,相机仅围绕原点旋转 许多教程建议使用以下方案: translate(-P) rotate translate(P) 不幸的是,这不起作用。我的应用程序使用平移向量(QVector3D)和四元数(QQuaternion)来保存相机的平移和旋转 目前,它是这样做的,始终围绕原点旋转: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(translation.x(),translati

我想围绕一个感兴趣的点旋转我的“相机”。当前,相机仅围绕原点旋转

许多教程建议使用以下方案:

translate(-P)
rotate
translate(P) 
不幸的是,这不起作用。我的应用程序使用平移向量(QVector3D)和四元数(QQuaternion)来保存相机的平移和旋转

目前,它是这样做的,始终围绕原点旋转:

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(translation.x(),translation.y(), translation.z());
multMatrix(accumulatedQuaternionRotation);
其中,mulMatrix使用四元数构建4x4矩阵,该矩阵被传递给glMultMatrixf()

使用类似这样的方法:

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仅仅是两个鼠标移动事件点之间的差异。

您试图做的基本上是实现gluLookAt,对吗

以下是gluLookAt的功能,您应该能够从中复制所需内容:


我不确定你到底想用向量和四元数做什么,但我想你知道你在那里做什么,因为对于不熟悉gluLookat的人来说,这似乎很高级。

你的四元数一定生成了错误的矩阵。我添加了四元数旋转的代码。这很奇怪,因为在第一种情况下旋转工作没有问题。