View/Camera Transformation 视图变换
🧻

View/Camera Transformation 视图变换

定义相机

notion image
定义一个相机需要三个变量,位置,朝向,和一个向上的方向。

视图变换

notion image
当相机和要拍的东西一起移动的时候,那拍出来的相片是一样的。也就是说,当我们移动物体时,只要同时以相同的方式移动相机,没有相对位置,那么得出来的结果就是一样的。
如果我们将相机放在一个固定的位置上,那么所有东西在移动时,都可以认为是其他东西在移动,而相机一直在位置上不动。
我们可以将相机变换原点上,对其他东西也都加上相同变换,这样相机和物体的相对位置就不会变了。我们让相机永远往 方向看,以 轴为向上方向(右手坐标系,符合 OpenGL 传统)。这是约定俗成的。相机放在原点上会有很多好处,能简化计算。
从坐标空间的角度来看,就是将物体和相机从世界空间转到观察空间(摄像机空间)。
 
notion image
我们要将相机移到原点,就需要先把相机中心 平移到原点,还得把观察的方向 移到 上,再把向上方向 旋转到 方向上,把 的方向移到 方向上。
下面将这系列操作转为矩阵操作。

求视图变换矩阵

 
  1. 先把相机中心 平移到原点
in math?
  • Let’s write
  • Translate to origin
平移矩阵写好后,接下来写旋转矩阵。
2. 把观察的方向 旋转到 上,把向上方向 旋转到 方向上, 的方向旋转到 方向上
  • Rotate to , to , To (世界空间到观察空间)
  • Consider its inverse rotation: to , to , to (观察空间到世界空间)
我们可以反过来写,例如把 旋转到 方向上的旋转矩阵,就比 移到 轴的旋转矩阵要好写很多,而这两个旋转矩阵是互逆的。写出 轴旋转到 方向的旋转矩阵后,再求其逆变换就是我们所需要的 移到 轴的旋转矩阵。
to , to , to 的旋转矩阵就是:
⚠️
这里 to 是因为我们定义相机的坐标空间为右手坐标系。
我们构造出了这个旋转矩阵,要验证也很简单,用该旋转矩阵变换 轴就能得到 的方向:
将其分别和 x y z 轴单位向量点乘,就能发现得到的结果就是对的。
因为旋转矩阵是正交矩阵,因此要求逆矩阵,对其转置即可。
那么我们的旋转矩阵就能通过对上面的矩阵求逆得出:
这样我们世界空间到观察空间的变换矩阵就能得出来了:
其中 的向量, 为相机原点。
相机需要进行这种变换,变换到约定俗成的位置(原点)上去,那么其他所有物体也需要做这样的变换,这样才能保持相对运动不变。这个就是视图变换
模型变换和视图变换经常一起被称为模型视图变换(ModelView Transformation)