向上和向左旋转相机

Mis*_*isa 3 c++ opengl

如何将相机左右转换?我试图通过几个例子来做到这一点,但没有什么好处.结果相机左侧像pic.2一样旋转,这是不正确的.还有我的相机 - 每次按"向上"按钮时翻转+缩小.

相机变换的示例 我的相机左转

    mat3 Transform::rotate(const float degrees, const vec3& axis) {

    mat3 second_mat = glm::mat3(
        glm::vec3(axis.x*axis.x, axis.x*axis.y, axis.x*axis.z),
        glm::vec3(axis.x*axis.y, axis.y*axis.y, axis.y*axis.z),
        glm::vec3(axis.x*axis.z, axis.y*axis.z, axis.z*axis.z));
    mat3 third_mat = glm::mat3(
        glm::vec3(0.0f, -axis.z, axis.y),
        glm::vec3(axis.z, 0.0f, -axis.x),
        glm::vec3(-axis.y, axis.x, 0.0f));
    mat3 rot = mat3((glm::radians(degrees))*mat3(1.0) + (1 - cos(glm::radians(degrees))*second_mat)+ (sin(glm::radians(degrees))*third_mat));

    return rot;
}

// Transforms the camera left around the "crystal ball" interface
void Transform::left(float degrees, vec3& eye, vec3& up) {
        up = glm::normalize(glm::cross(up, eye));

}

// Transforms the camera up around the "crystal ball" interface
void Transform::up(float degrees, vec3& eye, vec3& up) {
        eye = eye * rotate(degrees, up);
        up = up * rotate(degrees, up);
}


mat4 Transform::lookAt(vec3 eye, vec3 up) {

    glm::mat4 view = glm::lookAt(
        glm::vec3(eye.x, eye.y, eye.z),
        glm::vec3(0.0f, 0.0f, 0.0f),
        glm::vec3(up.x, up.y, up.z)
        );
    return view;
}
Run Code Online (Sandbox Code Playgroud)

Lit*_*Fox 5

你在"腐烂"中错过了"cos".

mat3 Transform::rotate(const float degrees, const vec3& axis) {
    float d = degrees *(pi / 180);
...
    mat3 rot = mat3(cosf(d)*mat3(1.0) + (1 - cosf(d))*second_mat + sinf(d)*third_mat);
}
Run Code Online (Sandbox Code Playgroud)
void Transform::left(float degrees, vec3& eye, vec3& up) {
       eye = eye * rotate(degrees, up);
       up =  up * rotate(degrees, up);
       }
Run Code Online (Sandbox Code Playgroud)
void Transform::up(float degrees, vec3& eye, vec3& up) {
        vec3 upv = glm::normalize(glm::cross(up, eye)); 
        eye = eye * rotate(degrees, upv);
        up = up * rotate(degrees, upv);
}
Run Code Online (Sandbox Code Playgroud)