2011-11-09 139 views
3

我遇到了相機旋轉的數學問題,更像是我缺乏關於這個主題的知識,並且在互聯網上找不到任何關於它的東西(閱讀,很可能不知道正確的搜索關鍵詞)相機與四元數的旋轉

無論如何,這是我所試圖做的(僞代碼):

RotateCamera(angle,axis){ 
     Quaternion rotation = cam.getRotation(); 
     Quaternion rot = new Quaternion(); 
     rot.fromAngleNormalAxis(angle, axis); 

     rotation.multLocal(rot); 

     cam.setRotation(rotation); 
    } 

    update(float value){ // just to show what input I use the RotateCamera method for the directions 
     RotateCamera(value,Vector3f(0,1,0)) // left 
     RotateCamera(-value,Vector3f(0,1,0)) // right 
     RotateCamera(value,Vector3f(1,0,0)) // up 
     RotateCamera(-value,Vector3f(1,0,0)) // down 
    } 

現在這工作得很好,但有時凸輪將推出,而不是隻偏航/間距。這樣做的正確方法是什麼?

回答

4

只給出了一點代碼,很難說清楚。但它看起來像是將旋轉軸硬編碼到更新方法中。關於旋轉的東西(無論是用四元數還是矩陣表示)都是它們的乘法不是「交換的」,這意味着做相同的兩次旋轉但是以相反的順序不會得到相同的結果。

它看起來像你正在假設相機面向(0,0,1)方向,我們稱之爲z軸,y軸(0,1,0)從頂部出來你的頭。只要這個假設成立,你的上下左右旋轉軸就是(1,0,0),(1,0,0),(0,1,0)和(0) ,1,0),因爲它們似乎在你的代碼片段中。但是說你剛剛向左旋轉了90度。這將攝像機的視圖從(0,0,1)方向發送到(1,0,0)方向。現在說你做了一個「向上」旋轉,它被編碼在(1,0,0)軸周圍。這是圍繞您正在查看的同一個軸的旋轉,效果將是一個滾動。

這是否解決了這個問題?如果是這樣,你應該編碼你的旋轉軸w.r.t.相機朝向的當前方向。

+0

基本上我應該創建一個getLeft()和getUp()方法並使用那些而不是靜態值? – Tim

+0

是的。 getLeft()將只是確定從攝像頭頂部出來的軸。然後,getUp()會將getLeft()的結果與相機所面向的方向構成其「交叉產品」(你見過這個?)。這應該做到這一點! – josh