【问题标题】:Issue with GLM Camera X,Y Rotation introducing Z RotationGLM 相机 X、Y 旋转引入 Z 旋转的问题
【发布时间】:2013-01-08 15:41:14
【问题描述】:

所以我在使用 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 旋转和相机移动。

我看过云台锁,但据我了解,这个问题对我来说似乎不太像云台锁。但我可能错了。

【问题讨论】:

    标签: c++ matrix camera rotation glm-math


    【解决方案1】:

    存储当前俯仰/偏航角并即时生成相机矩阵,而不是尝试在中间向量上累积微小变化。

    【讨论】:

      【解决方案2】:

      在您的 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));
      

      【讨论】:

      • 如果投反对票的人解释他们的原因,我将不胜感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多