2013-03-25 157 views
2

嘿傢伙我想做一個Camera類,使用glm庫中的lookAt。我有4點,第一個是眼睛,那就是相機在太空中的位置,第二個是相機看的地方,第三個是upp,設置相機的方向,第四是側面,這是眼睛和眼睛的交叉產物。相機旋轉使用lookAt

所以最終我得到了3個向量的基礎,所有這些向量的起源都在眼點。我得到了相機的座標系。

在我的相機類中,我希望能夠圍繞相機的座標系旋轉,而不是世界的座標系。所以我正在做的是圍繞相機座標系的一個軸旋轉。

我構建具有初始值類是這樣的:

void Observer::initialize(glm::vec3 eye, glm::vec3 look, glm::vec3 upp, glm::vec3 side) 
{ 
    this->eye = eye;  // (0.0, 0.0, 0.0) 
    this->look = look;  // (0.0, 0.0, -1.0) 
    this->upp = upp;  // (0.0, 1.0, 0.0) 
    this->side = side;  // (1.0, 0.0, 0.0) 
} 

當欲繞x軸例如我調用該函數從GLM這樣旋轉座標系:

void Observer::pitch(GLfloat pitch) 
{ 
    glm::mat4 rotate(1.0f); 

    rotate = glm::rotate(rotate, pitch, side - eye); 

    look = glm::vec3(rotate * glm::vec4(look, 1.0f)); 
    upp = glm::vec3(rotate * glm::vec4(upp, 1.0f)); 
} 

到目前爲止,我瞭解到,我所有的點仍然構成了相機的座標系,並且所有矢量都相互垂直。

但是,然後我使用這些觀點,我用lookAt函數獲得了相機在世界上的位置。

glm::mat4 view = glm::lookAt(eye, look, upp); 

,如果我開始轉動了很多乘以這個矩陣與OpenGL的

模型視圖矩陣,幾個旋轉後的攝像頭「反映」旋轉,就像我在其他的方式旋轉(我不知道如何以更好的方式描述真正發生的事情)。

我真的不明白髮生了什麼事。在應用旋轉後,我應該對矢量進行歸一化處理?我有一個萬向節鎖的問題(我對萬向節鎖沒有太多瞭解)?

回答

2

當你像向前一樣對矢量進行增量旋轉時,數值錯誤會加載。當錯誤導致向上看和向量指向幾乎相同的方向或彼此相反時,相機轉換計算是不穩定的,並且可能發生令人毛骨悚然的事情。萬向節鎖。長度變化導致不同的問題。

對我而言,解決方案是在每次旋轉後重新對正向和向後矢量進行正交化。爲此,計算它們的交叉積L,然後通過將L與lookAt交叉來調整(實際替換)向上向量。在所有這些都重新規範化後,再看看單位長度。

儘管正交化歸一化是一種快速操作,但您並不需要對每個攝像機運動都進行這種操作。

請注意,當您更正像這樣的向量時,您實際上正在執行lookAt矩陣計算的一部分,因此請考慮實施您自己的操作來避免不必要的交叉乘積。見例如this prior SO article on this topic