Search code examples
3dcameraframe-ratequaternionsglm-math

Quaterion first person style camera


my update function is adding rotation around the view axis(roll),which is increasing over time.I only want to change the yaw and pitch part.

is my calculation wrong or is it the float accuracy?

m_orientation is my global Quaterion to hold the final rotation. Q is type of glm::quat. V is glm::vec3

return [this](glm::vec2 ls, glm::vec2 rs, double dTime) {
    auto rightVec = m_orientation * V(1, 0, 0);
    Q q1 = glm::angleAxis(-rs.x * (float)dTime, V(0,1,0)); // yaw   
    Q q2 = glm::angleAxis(rs.y * (float)dTime, rightVec); // pitch

    auto roll = glm::roll(m_orientation);
    printf("%f\n", roll);

    m_orientation = q1 * m_orientation;
    m_orientation = q2 * m_orientation;


    m_position += m_orientation * V(1, 0, 0) * ls.x * (float)dTime * sensitivity; //sidewards 
    m_position += m_orientation * V(0, 0, -1) * ls.y * (float)dTime * sensitivity; //forwards
    buildViewMatrix();
};

Solution

  • solved with 2 changes

    auto q2 = glm::angleAxis(rs.y * (float)dTime, V(1,0,0)); // pitch
    m_orientation = q1 * m_orientation * q2;