2013-01-08 67 views
3

所以我一直在使用GLM庫在OpenGL和C++中實現的相機出現問題。我瞄準的相機類型是相機周圍的飛行,這將允許輕鬆探索3D世界。我已經設法讓相機工作得很好,它很好,很流暢,環顧四周,運動似乎很好,很正確。問題與GLM相機X,Y引入Z旋轉的旋轉

我似乎有唯一的問題是,沿拍攝的X和Y軸的旋轉(看上下)介紹了一些繞它的Z軸。這導致世界在旅行時輕微滾動。

舉個例子......如果我有一個四方形的鏡頭前移動相機的圓周運動,所以彷彿四處尋找與你的腦袋轉了一圈,一旦運動完成四會稍微翻了一下,好像你已經傾斜了你的頭。

我的相機目前是我可以附加到我的場景中的對象/實體的組件。每個實體都有一個「框架」,它基本上是該實體的模型矩陣。該框架包含以下屬性:

glm::mat4 m_Matrix; 
glm::vec3 m_Position; 
glm::vec3 m_Up; 
glm::vec3 m_Forward; 

然後這些用相機創建相應viewMatrix這樣的:

const glm::mat4& CameraComponent::GetViewMatrix() 
{ 
    //Get the transform of the object 
    const Frame& transform = GetOwnerGO()->GetTransform(); 

    //Update the viewMatrix 
    m_ViewMatrix = glm::lookAt(transform.GetPosition(), //position of camera 
          transform.GetPosition() + transform.GetForward(), //position to look at 
          transform.GetUp()); //up vector 

    //return reference to the view matrix 
    return m_ViewMatrix; 
} 

而現在...這裏是我的內旋轉X和Y的方法框架對象,我猜是問題的地方:

void Frame::RotateX(float delta) 
{ 
    glm::vec3 cross = glm::normalize(glm::cross(m_Up, m_Forward)); //calculate x axis 

    glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta, cross); 

    m_Forward = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Forward, 0.0f))); //Rotate forward vector by new rotation 

    m_Up = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Up, 0.0f))); //Rotate up vector by new rotation 
} 


void Frame::RotateY(float delta) 
{ 
    glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta, m_Up);  

    //Rotate forward vector by new rotation 
    m_Forward = glm::normalize(glm::vec3(Rotation * glm::vec4(m_Forward, 0.0f))); 
} 

所以在那裏的某個地方,有我一直在尋找周圍試圖解決問題。我已經搞了幾天,嘗試隨機的東西,但我得到的結果是一樣的,或者z軸旋轉是固定的,但是會出現其他錯誤,例如不正確的X,Y旋轉和相機移動。

我看了一下萬向節鎖止但是從我瞭解的是,此問題似乎並不太喜歡萬向節鎖定我。但我可能是錯的。

回答

6

存儲當前俯仰/偏轉角並生成相機矩陣代替上即時試圖積累在中間載體的小變化。

-1

在你的旋轉Y功能,從這個改變:

glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta, m_Up); 

這樣:

glm::mat4 Rotation = glm::rotate(glm::mat4(1.0f), delta, glm::vec3(0,1,0)); 
+0

我會很感激,如果任何人下來投票解釋自己的理由。 – Kaa