所以我一直在使用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旋轉和相機移動。
我看了一下萬向節鎖止但是從我瞭解的是,此問題似乎並不太喜歡萬向節鎖定我。但我可能是錯的。
我會很感激,如果任何人下來投票解釋自己的理由。 – Kaa