Проблема с GLM Camera X, Y Rotation, представляющей Z Rotation

Так что у меня возникли проблемы с камерой, которую я реализовал в OpenGL и C ++ с использованием библиотеки GLM. Тип камеры, к которой я стремлюсь, — это камера с круговым движением, которая позволит легко исследовать трехмерный мир. Мне удалось заставить камеру работать, она приятная и плавная, смотрит вокруг, и движение кажется хорошим и правильным.

Кажется, единственная проблема, которую я испытываю, заключается в том, что вращение вдоль оси X и Y камеры (взгляд вверх и вниз) создает некоторый поворот вокруг оси Z. Это приводит к тому, что мир немного катится во время путешествий.

Например, если у меня квадратный квадратор перед камерой и я перемещаю камеру круговыми движениями, как если бы я смотрел по кругу головой, как только движение завершится, квад будет слегка катиться как если ты наклонил голову

Моя камера в настоящее время является компонентом, который я могу прикрепить к объекту / объекту в моей сцене. У каждого объекта есть «Кадр», который в основном является моделью матрицы для этого объекта. Кадр содержит следующие атрибуты:

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;
}

А теперь … вот мои методы поворота X и Y в объекте Frame, которые, я полагаю, являются местом проблемы:

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 и движение камеры.

Я посмотрел на замок на карданном подвесе, но из того, что я понял, эта проблема не казалась мне совсем замком на карданном подвесе. Но я могу ошибаться.

3

Решение

Сохраняйте текущие углы наклона / рыскания и генерируйте матрицу камеры на лету, вместо того, чтобы пытаться накапливать небольшие изменения в промежуточных векторах.

7

Другие решения

В вашей функции 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));
-1

По вопросам рекламы [email protected]