glm库中有实现好的lookAt矩阵,我们要做的只是定义一个摄像机位置,一个目标位置和一个表示世界空间中的上向量的向量(我们计算右向量使用的那个上向量)
glm::mat4 view;
view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f),
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 1.0f, 0.0f));
lookAt函数实现的是下面这个矩阵
LookAt=[RxRyRz0UxUyUz0DxDyDz00001]∗[100−Px010−Py001−Pz0001]LookAt = \begin{bmatrix} \color{red}{R_x} & \color{red}{R_y} & \color{red}{R_z} & 0 \\ \color{green}{U_x} & \color{green}{U_y} & \color{green}{U_z} & 0 \\
\color{blue}{D_x} & \color{blue}{D_y} & \color{blue}{D_z} & 0 \\
0 & 0 & 0 & 1 \end{bmatrix} * \begin{bmatrix} 1 & 0 & 0 & -\color{purple}{P_x} \\
0 & 1 & 0 & -\color{purple}{P_y} \\
0 & 0 & 1 & -\color{purple}{P_z} \\
0 & 0 & 0 & 1 \end{bmatrix}
位移矩阵好理解,生成一个沿相机反方向移动的矩阵即可
[100−Px010−Py001−Pz0001]\begin{bmatrix} 1 & 0 & 0 & -\color{purple}{P_x} \\
0 & 1 & 0 & -\color{purple}{P_y} \\
0 & 0 & 1 & -\color{purple}{P_z} \\
0 & 0 & 0 & 1 \end{bmatrix}
重点看下坐标的旋转矩阵
[RxRyRz0UxUyUz0DxDyDz00001]\begin{bmatrix} \color{red}{R_x} & \color{red}{R_y} & \color{red}{R_z} & 0 \\ \color{green}{U_x} & \color{green}{U_y} & \color{green}{U_z} & 0 \\
\color{blue}{D_x} & \color{blue}{D_y} & \color{blue}{D_z} & 0 \\
0 & 0 & 0 & 1 \end{bmatrix}
它实际上是相机旋转矩阵的逆矩阵,即对将相机旋转
[RxUxDx0RyUyDy0RzUzDz00001]\begin{bmatrix} \color{red}{R_x} & \color{green}{U_x} & \color{blue}{D_x} & 0 \\ \color{red}{R_y} & \color{green}{U_y} & \color{blue}{D_y} & 0 \\
\color{red}{R_z} & \color{green}{U_z} & \color{blue}{D_z} & 0 \\
0 & 0 & 0 & 1 \end{bmatrix}
补充说明下,上面这个为什么是相机旋转:
空间变换时,变换矩阵的本质就是基向量的变换,原始的基向量可以看成(先不管齐次坐标):
[1000010000100001]\begin{bmatrix} \color{red}{1} & \color{green}{0} & \color{blue}{0} & 0 \\ \color{red}{0} & \color{green}{1} & \color{blue}{0} & 0 \\
\color{red}{0} & \color{green}{0} & \color{blue}{1} & 0 \\
0 & 0 & 0 & 1 \end{bmatrix}
反向作用到物体上,即对上面的矩阵求逆,因为该矩阵是正交单位矩阵,所以逆和转置相等
原文链接:https://juejin.cn/post/7231850971869462589 作者:sumsmile