Так что у меня возникли проблемы с камерой, которую я реализовал в 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 и движение камеры.
Я посмотрел на замок на карданном подвесе, но из того, что я понял, эта проблема не казалась мне совсем замком на карданном подвесе. Но я могу ошибаться.
Сохраняйте текущие углы наклона / рыскания и генерируйте матрицу камеры на лету, вместо того, чтобы пытаться накапливать небольшие изменения в промежуточных векторах.
В вашей функции 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));