当您将俯仰旋转超过 90 度时,如何修复俯仰/外观翻转?

问题描述 投票:0回答:1

我一直在关注 LearnOpenGL 教程系列,并且进入了有关相机的部分,虽然他们设置了飞行相机,但我一直在尝试将其适应更多 FPS 风格的相机。它通常工作得很好,但每当我尝试直接向上或向下看时,音高似乎会翻转,向上是向下,向下是向上。

void Camera::matrix(float fov, float nearPlane, float farPlane, Shader &shader, const char* uniform) {

  mat4 view = mat4(1.0f);
  mat4 proj = mat4(1.0f);

  direction.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
  direction.y = sin(glm::radians(pitch));
  direction.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
  front = normalize(direction);

  view = lookAt(pos, pos + front, up);
  proj = perspective(radians(fov), ((float)width / (float)height), nearPlane, farPlane);

  glUniformMatrix4fv(glGetUniformLocation(shader.shaderProgram, uniform), 1, GL_FALSE, glm::value_ptr(proj * view));

}

void Camera::look() {

  newMouseX = getMouseX();
  newMouseY = getMouseY();

  float dx = (float) (newMouseX - oldMouseX) * getDeltaTime();
  float dy = (float) (newMouseY - oldMouseY) * getDeltaTime();

  yaw += dx * sensitivity;
  pitch += dy * sensitivity;

  oldMouseX = newMouseX;
  oldMouseY = newMouseY;

}

我尝试夹紧旋转,这样它就不能旋转超过 90 度的俯仰角,虽然它工作并且感觉相当自然,但它只是感觉像是一个快速解决方案,可能会在以后引起问题。我认为允许相机旋转超过 90 度是一个更自然的解决方案,但我真的不知道该怎么做。

c++ c opengl camera glm
1个回答
0
投票

欢迎来到如何表示和积累方向这一长期存在的问题。

您使用的表示法,将俯仰角和偏航角分开,更正式地称为欧拉角。正如您所发现的,当您绕轴翻转时会发生奇怪的事情。有几种不同的解决方案:

坚持欧拉角,但每次更新值时都有固定的测试顺序。 “如果新音高 > 90 或 < -90, adjust the yaw ..."

每次更新,将现有角度和俯仰/坡度的变化转换为矩阵,将它们相乘,再转换回角度。

不使用欧拉角,只需将方向存储为矩阵即可。或者了解四元数。

没有完美的解决方案。有关 3D 游戏编程的更多详细信息,以及大多数有关 3D 图形的一般书籍,都应该有一个关于如何管理方向的部分。我非常喜欢 Dunn 和 Parberry 所著的《图形和游戏开发 3D 数学入门》。

© www.soinside.com 2019 - 2024. All rights reserved.