2013-01-13 39 views
2

我想围绕感兴趣的点旋转我的“相机”。目前相机只能围绕原点旋转。在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; 

差异仅仅是两个鼠标移动事件点的差异。

+0

您的四元数必须产生错误的矩阵。 –

+0

我添加了四元数旋转的代码。这很奇怪,因为旋转在第一种情况下没有问题。 – anopheles

回答

5

你想要做的是基本上实现gluLookAt,对吧?

这里的gluLookAt做什么,你应该能够复制你从它需要的东西:

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

我不知道你真正想用的载体和四元数的事,但我想你知道你在那里做什么,因为它对于不熟悉gluLookat的人来说看起来相当先进。