Резкий разворот камеры при поднятии взгляда "в небо" (OpenGL + GLM)
Я написал простой класс камеры, который должен поддерживать вращение по всем трём осям без gimbal lock`а (в моих планах), но при взгляде вверх происходит её дергание и вращение вокруг своей оси, что и нужно исправить... Скажите, пожалуйста, как реализовать это так, чтобы камера могла вращаться по всем осям без проблемы складывания рамок...
Вот то, что смог написать:
#ifndef CAMERA_HPP
#define CAMERA_HPP
#include "Window/Window.hpp"
#include "glm/gtx/rotate_vector.hpp"
class Camera
{
private:
glm::vec3 position = glm::vec3(0, 0, 0);
glm::vec3 direction = glm::vec3(0,0,-1);
glm::vec3 right = glm::normalize(glm::cross(direction, glm::vec3(0, 1, 0)));
glm::vec3 up = glm::normalize(glm::cross(right, direction));
float roll = 0;
public:
void rotate(float yaw, float pitch, float roll)
{
this->roll += roll;
right = glm::normalize(glm::cross(direction, glm::vec3(0, 1, 0)));
up = glm::normalize(glm::cross(right, direction));
direction = glm::rotate(direction, glm::radians<float>(yaw), up);
direction = glm::rotate(direction, glm::radians<float>(pitch), right);
}
void setPosition(glm::vec3 pos)
{
position = pos;
}
glm::vec3 getPosition()
{
return position;
}
glm::vec3 getDirection()
{
return direction;
}
glm::mat4 getMatrix()
{
glm::mat4 view = glm::lookAt(position, position + direction, up);
//здесь я буду вращать получившуюся матрицу по оси Z
return view;
}
};
#endif