'Using quaternions to update a euler based camera using glm

I have a struct which I am passing as an argument. The idea is to take create a quaternion via slerp function by comparing the quaternion of a camera object and some other target &t orientation.

The problem is probably that I do not understand the math. The camera currently operates on euler angles (I do not have a problem with this presently). So I want to take the slerp quaternion, convert to euler, apply the transormation to the camera vectors, and then store a new quarternion based on the new euler values for use as a comparison.

Struct below with quaternion comparison function. Struggling to offer up more to describe the visual error other then the camera is freaking out significantly. Thanks.

Struct which I pass pass as argument for a std::function member elsewhere:

struct panning_camera_handle {
    Camera* cam;

    bool operator ()(glm::quat& s, const glm::quat& t) {
        float dps{ 180.0f }; // degrees per second

        //first calculate the distance (angular magnitude between two rotation quaternions)
        float cosOmega = glm::dot(s, t);
        float sinOmega = glm::sqrt(1.0f - cosOmega * cosOmega);
        float omega = glm::degrees(atan2(sinOmega, cosOmega)); // the diff. angle

        if (omega < 1.0f) {
            // CALC QUAT TO MOVE ORIENTATION TO TARGET
            auto q = glm::slerp(s, t, 1.0f); //single slerp step
            cam->update_camera_vectors(q);

            return true; //if angular distance is very small
        }               //we are done, return true.
        else {
            float min = dps * ejn::deltaTime * 0.001f; // min ang. displacement this cycle

            if (omega < min) {
                //CALC AS ABOVE 
                auto q = glm::slerp(s, t, 1.0f); //single slerp step
                cam->update_camera_vectors(q);
                return true;
            }
            else {
                //CALC THE INCREMENT AND UPDATE CAMERA VECTORS
                float tt = min / omega;
                auto q = glm::slerp(s, t, tt);

                cam->update_camera_vectors(q);

                return false; //test for completion on next cycle
            }
        }
    }
};

Current revision of camera function (theres been a few...) which I would like to make the transformation. Note the orient member which is the variable I want to use to make further comparisons in the struct above.

void enjyn_Camera::update_camera_vectors(glm::quat q) {
    eul = glm::degrees(glm::eulerAngles(q));
    
    if (eul.x > 89.0f)
        eul.x = 89.0f;

    if (eul.x < -89.0f)
        eul.x = -89.0f;

    glm::vec3 front;
    front.x = cos(glm::radians(eul.y)) * cos(glm::radians(eul.x));
    front.y = sin(glm::radians(eul.x));
    front.z = sin(glm::radians(eul.y)) * cos(glm::radians(eul.x));

    Front = Front + glm::normalize(front);
    Right = glm::normalize(glm::cross(Front, WorldUp));  // normalize the vectors, because their length gets closer to 0 the more you look up or down which results in slower movement.
    Up = glm::normalize(glm::cross(Right, Front));

    orient = glm::quat(glm::radians(eul));
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source