Резкий разворот камеры при поднятии взгляда "в небо" (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

Ответы (0 шт):