class Camera { public: Camera(); virtual ~Camera(); void rotate_mouse(int16_t x, int16_t y); void rotate(double angle, glm::dvec3 axis); void update(); protected: private: glm::dvec3 pos; glm::dvec3 tar; glm::dvec3 up; }; Camera::Camera() : pos(0,0,-5), tar(0,0,1), up(1,0,0) { update(); } void Camera::rotate_mouse(int16_t x, int16_t y) { glm::dvec3 axis = glm::cross(tar-pos, up); glm::normalize(axis); rotate((double)y/1000.0f, axis); rotate((double)x/1000.0f, glm::dvec3(0.0f, 1.0f, 0.0f)); } void Camera::rotate(double angle, glm::dvec3 axis) { glm::dquat temp(cos(angle/2), axis.x * sin(angle/2), axis.y * sin(angle/2), axis.z * sin(angle/2)); glm::dquat quat_view(0, tar); glm::dquat result = (temp * quat_view) * glm::conjugate(temp); tar.x = result.x; tar.y = result.y; tar.z = result.z; } void Camera::update() { gluLookAt(pos[0], pos[1], pos[2], tar[0], tar[1], tar[2], up[0], up[1], up[2]); }

case SDL_MOUSEMOTION: if (dragging) { //graphics->get_camera()->rotate(event.motion.xrel/1000000.0f, glm::vec3(0.f,1.f,0.f)); graphics->get_camera()->rotate_mouse(event.motion.xrel, event.motion.yrel); graphics->get_camera()->update(); } break;