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 (); }
我推测滚转的数学逻辑存在问题,但不确定问题所在。
解决方案
- 从
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;
- 在创建模型视图时,添加如下代码作为最后一行:
model = glm::rotate (model, glm::radians (m_camera->GetRoll()), { 0.0f, 0.0f, 1.0f });
内容的提问来源于stack exchange,提问作者Swatcat
相关产品推荐
相关产品推荐

