在OpenGL相机类中计算侧倾

uidvcgyl  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(211)

我尝试向OpenGL相机添加滚动,但当我使用previous Stackoverflow question添加滚动时,相机滚动,但滚动会影响偏航和俯仰方向。
请问我应该在什么时候对胶卷进行矩阵旋转?
变量和类型:

  1. glm::vec3 m_position;
  2. glm::vec3 m_front;
  3. glm::vec3 m_up;
  4. glm::vec3 m_right;
  5. glm::vec3 m_worldUp;

字符串
主要的相机更新功能

  1. void Camera::UpdateCamera ()
  2. {
  3. glm::vec3 front;
  4. front.x = cos (glm::radians (m_yaw)) * cos (glm::radians (m_pitch));
  5. front.y = sin (glm::radians (m_pitch));
  6. front.z = sin (glm::radians (m_yaw)) * cos (glm::radians (m_pitch));
  7. m_front = glm::normalize (front);
  8. m_right = glm::normalize (glm::cross (m_front, m_worldUp));
  9. m_up = glm::normalize (glm::cross (m_right, m_front));
  10. glm::mat4 roll_mat = glm::rotate(glm::mat4(1.0f), glm::radians(m_roll), m_front);
  11. m_up = glm::mat3(roll_mat) * m_up;
  12. }


查看矩阵计算:

  1. lm::mat4 Camera::GetViewMatrix ()
  2. {
  3. return glm::lookAt (m_position, m_position + m_front, m_up);;
  4. }


这就是偏航和俯仰计算的调用方式:

  1. void KeyCtrl::CursorPositionChange(double xPosIn, double yPosIn)
  2. {
  3. float xpos = static_cast<float>(xPosIn);
  4. float ypos = static_cast<float>(yPosIn);
  5. if (m_firstMouse)
  6. {
  7. m_lastX = xpos;
  8. m_lastY = ypos;
  9. m_firstMouse = false;
  10. }
  11. float xoffset = xpos - m_lastX;
  12. // reversed since y-coordinates go from bottom to top
  13. float yoffset = m_lastY - ypos;
  14. m_lastX = xpos;
  15. m_lastY = ypos;
  16. xoffset *= MouseSensitivity;
  17. yoffset *= MouseSensitivity;
  18. m_camera->SetYaw (xoffset);
  19. m_camera->SetPitch (yoffset);
  20. m_camera->UpdateCamera ();
  21. }


不知何故,我把滚动数学错了,但是,我知道在哪里。

解决方案Camera::UpdateCamera中应删除以下两行:

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


创建模型视图时,将以下内容添加为最后一行:

  1. model = glm::rotate (model, glm::radians (m_camera->GetRoll()), { 0.0f, 0.0f, 1.0f });

ff29svar

ff29svar1#

解决方案

下面两行应该从Camera::UpdateCamera中删除:

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

字符串
创建模型视图时,将以下内容添加为最后一行:

  1. model = glm::rotate (model, glm::radians (m_camera->GetRoll()), { 0.0f, 0.0f, 1.0f });

相关问题