我想围绕感兴趣的点旋转我的“相机”。目前相机只能围绕原点旋转。在opengl中围绕兴趣点旋转相机
很多教程的建议使用以下方案:
translate(-P)
rotate
translate(P)
不幸的是,这是行不通的。我的应用程序使用翻译矢量(QVector3D)以及四元数(QQuaternion)来保存相机的平移和旋转。
目前,它是这样的,它总是围绕原点旋转完成:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(translation.x(),translation.y(), translation.z());
multMatrix(accumulatedQuaternionRotation);
其中mulMatrix采用四元数来构建其传递给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;
差异仅仅是两个鼠标移动事件点的差异。
您的四元数必须产生错误的矩阵。 –
我添加了四元数旋转的代码。这很奇怪,因为旋转在第一种情况下没有问题。 – anopheles