You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL相机类滚转实现问题:滚转影响偏航与俯仰方向

OpenGL相机滚转功能导致偏航/俯仰方向异常的问题与解决方案

我尝试在OpenGL相机类中添加*滚转(Roll)功能,参考旧帖实现后,相机虽能完成滚转,但滚转操作会影响偏航(Yaw)和俯仰(Pitch)*的方向。请问应在何时应用滚转矩阵?

相关变量及类型

glm::vec3 m_position;
glm::vec3 m_front;
glm::vec3 m_up;
glm::vec3 m_right;
glm::vec3 m_worldUp;

相机核心更新函数

void Camera::UpdateCamera ()
{
    glm::vec3 front;
    front.x = cos (glm::radians (m_yaw)) * cos (glm::radians (m_pitch));
    front.y = sin (glm::radians (m_pitch));
    front.z = sin (glm::radians (m_yaw)) * cos (glm::radians (m_pitch));
    m_front = glm::normalize (front);

    m_right = glm::normalize (glm::cross (m_front, m_worldUp));
    m_up = glm::normalize (glm::cross (m_right, m_front));

    glm::mat4 roll_mat = glm::rotate(glm::mat4(1.0f), glm::radians(m_roll), m_front);
    m_up = glm::mat3(roll_mat) * m_up;
}

视图矩阵计算

glm::mat4 Camera::GetViewMatrix ()
{
    return glm::lookAt (m_position, m_position + m_front, m_up);;
}

偏航与俯仰的调用逻辑

void KeyCtrl::CursorPositionChange(double xPosIn, double yPosIn)
{
    float xpos = static_cast<float>(xPosIn);
    float ypos = static_cast<float>(yPosIn);

    if (m_firstMouse)
    {
        m_lastX = xpos;
        m_lastY = ypos;
        m_firstMouse = false;
    }

    float xoffset = xpos - m_lastX;

    // reversed since y-coordinates go from bottom to top
    float yoffset = m_lastY - ypos;

    m_lastX = xpos;
    m_lastY = ypos;

    xoffset *= MouseSensitivity;
    yoffset *= MouseSensitivity;

    m_camera->SetYaw (xoffset);
    m_camera->SetPitch (yoffset);

    m_camera->UpdateCamera ();
}

我推测滚转的数学逻辑存在问题,但不确定问题所在。


解决方案

  1. 从Camera::UpdateCamera中移除以下两行代码:
glm::mat4 roll_mat = glm::rotate(glm::mat4(1.0f), glm::radians(m_roll), m_front);
m_up = glm::mat3(roll_mat) * m_up;
  1. 在创建模型视图时,添加如下代码作为最后一行:
model = glm::rotate (model, glm::radians (m_camera->GetRoll()), { 0.0f, 0.0f, 1.0f });

内容的提问来源于stack exchange,提问作者Swatcat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:23:24