Sign in to follow this  
rejak

problem with quaternion camera

Recommended Posts

I have problems implementing a quaternion camera. It looks weird, it looks like the camera is not rotating but the object at the x,y-plane is rotating.

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;

Share this post


Link to post
Share on other sites
Hmm, maybe i've explained the problem not right. I have a camera and if i move the mouse the camera should rotate but the camera should not move to an other point, just rotating. But I can see the objects placed in the world, when i move the camera from the other side.

I can see the camera rotating AND the object a hexagonal tiled board, rotates very ugl arround himself.


Edit:
Even the camera rotation is correct. It rotates somehow but not in the right direction Edited by rejak

Share this post


Link to post
Share on other sites

I've had some problems with camera rotation that had to do with changing platforms. Sometimes the order of operations is different depending on the library you are using. For example, in SlimDX I had to say quat * rotMatrix, then when I switched to SharpDX I had to say rotMatrix * quat, and then in the latest SharpDX I had to go back to quat * rotMatrix. The order of terms changes things, so watch out for that. It depends upon how the '*' operator is overloaded.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this