LearnOpenGL 摄像机


定义摄像机的主要目的是为了设置对应的view

一、定义摄像机空间向量

1、空间向量包含了:摄像机方向向量、摄像机右向量和摄像机上向量 (这里均以摄像机为前缀是因为在求摄像机空间向量的过程中会用到世界坐标的上向量)

2、在求空间向量的时候需要有:cameraPos(摄像机位置向量)、cameraTarget(摄像机目标向量)、up(世界坐标上向量)

3、摄像机的空间向量要跟opengl的坐标方向保持一致

4、摄像机方向向量:cameraDirection = glm::normalize(cameraPos - cameraTarget)  则从目标向量只想了摄像机的位置向量,从而符合3

5、摄像机右向量:由于两个向量叉乘得到的向量会跟这两个向量组成的平面垂直,所以摄像机右向量则可以通过 cameraRight = glm::normalize(glm::cross(up, cameraDirection))  这里up放在前面是为了符合3

6、摄像机上向量:摄像机方向向量和摄像机右向量叉乘则会得到垂直于这两个向量组成的平面cameraUp = glm::cross(cameraDirection, cameraRight)  cameraDirection放在前面同样是为了符合3

二、如下摄像机的空间向量乘以右边的平移向量矩阵则会得到对应的view的位置;如果的P使用负值是为了把世界平移到与我们自身移动的相反方向

三、glm有一个对应的LookAt函数,通过传入cameraPos、cameraTarget和worldUp来求得view

    template
    GLM_FUNC_QUALIFIER mat<4, 4, T, Q> lookAtRH(vec<3, T, Q> const& eye, vec<3, T, Q> const& center, vec<3, T, Q> const& up)
    {
        vec<3, T, Q> const f(normalize(center - eye));
        vec<3, T, Q> const s(normalize(cross(f, up)));
        vec<3, T, Q> const u(cross(s, f));

        mat<4, 4, T, Q> Result(1);
        Result[0][0] = s.x;
        Result[1][0] = s.y;
        Result[2][0] = s.z;
        Result[0][1] = u.x;
        Result[1][1] = u.y;
        Result[2][1] = u.z;
        Result[0][2] =-f.x;
        Result[1][2] =-f.y;
        Result[2][2] =-f.z;
        Result[3][0] =-dot(s, eye);
        Result[3][1] =-dot(u, eye);
        Result[3][2] = dot(f, eye);
        return Result;
    }

如上所示根据eye、center和up来求得

1、f(normalize(center - eye))  使用了从摄像机位置到目标位置的向量,跟上文提到的方向相反则导致了s(normalize(cross(f, up))); 这个叉乘的方向为fXup 同理u也是一样

要理解的是求出来的view是跟目标物体挂钩的