2013-01-13 72 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的人來說看起來相當先進。