簡體   English   中英

GLM Camera X問題,Y旋轉引入Z旋轉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM