[英]Issue with GLM Camera X,Y Rotation introducing Z Rotation
所以我一直在使用GLM庫在OpenGL和C ++中實現的相機出現問題。 我所瞄准的相機類型是一個飛行相機,可以輕松探索3D世界。 我已經設法使相機工作得非常好,它很好而且流暢,環顧四周,機芯看起來很漂亮和正確。
我似乎唯一的問題是沿着攝像機的X和Y軸(向上和向下看)的旋轉引入了繞它的Z軸的一些旋轉。 這導致世界在旅行時輕微翻滾。
作為一個例子......如果我在相機前面有一個方形四邊形並以圓周運動移動相機,那么就像用頭看一圈一樣,一旦動作完成,四邊形將略微滾動如果你歪着頭
我的相機目前是一個組件,我可以附加到我的場景中的對象/實體。 每個實體都有一個“框架”,它基本上是該實體的模型矩陣。 Frame包含以下屬性:
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;
}
現在......這是我在Frame對象中的旋轉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旋轉和相機移動。
我看了一眼萬向節鎖,但從我的理解來看,這個問題似乎並不像我對萬向節的鎖定。 但我可能錯了。
存儲當前俯仰/偏航角度並在運行中生成攝像機矩陣,而不是嘗試在中間矢量上累積小的變化。
在您的RotateY函數中,將其更改為:
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.