这里回顾GAMES101 Lecture 4,变换(续)。

课程主页:

课程作业:

课程视频:

参考资料:

本讲内容

  • 3D变换
  • 观测变换
    • 视图/相机(view/camera)变换
    • 投影(projection)变换
      • 正交投影
      • 透视投影

3D变换

对于3D变换,依然使用其次坐标:

  • 对于3D point,利用$(x, y,z,1)^T$表示;
  • 对于3D vector,利用$(x,y,z,0)^T$表示;
  • 通常其次坐标$(x,y,z, w)$对应于点$(x/w, y/w, z/w)$;

仿射变换的矩阵形式为:

伸缩

伸缩变换:

平移

平移变换:

旋转

绕x, y, z轴旋转的矩阵:

这里$\mathbf R_y(\alpha)$的形式和$\mathbf R_x(\alpha),\mathbf R_z(\alpha)$不同,这是因为$\vec y = \vec z\times \vec x$。

对于一般的旋转,可以表示为:

$\alpha, \beta,\gamma$被称为Euler角;上述等式可以通过飞行器理解,飞行器中,有三个方向(roll, pitch, yaw),飞机的旋转可以分解为绕着三个轴旋转:

罗德里格斯旋转公式

对于一般的情形,即绕任意轴$\mathbf n$(单位向量)旋转角度$\alpha$的矩阵可以用罗德里格斯旋转公式描述:

首先要理解向量绕轴旋转的含义,其含义为将向量沿平行于轴和垂直于轴分解,平行于轴方向的分量不旋转,垂直于轴方向的分量进行旋转,这可以用下图理解:

备注:图片来自于博客

在证明之前,给出两个引理:

叉积的矩阵表示:

叉积化简:

取$\mathbf B= \mathbf A$:

特别地,如果$\mathbf A$为单位向量,即$\mathbf{A} \cdot \mathbf{A}=1$,那么:

现在根据上述引理给出证明。

证明:

给定轴$\mathbf k$,对于任意向量$\mathbf v$,将其沿$\mathbf k$和垂直于$\mathbf k$分解:

那么:

根据叉积化简定理,第二式可以变换为:

根据之前对旋转的讨论,可以在垂直于$\mathbf k$的平面内对$\mathbf{v}_{\perp}$进行旋转,特别的,将$\mathbf{v}_{\perp}$作为$x$轴,$\mathbf n \times \mathbf{v}_{\perp}$作为$y$轴即可,旋转后的结果为:

所以最后的结果为:

倒数第二个等号利用了如下事实:

观测转换

视图/相机变换

  • 什么是视图变换?
  • 考虑如何拍照
    • 找个好地方然后安排拍摄人(模型(model)变换)
    • 找到一个好的“角度”来放置相机(视图(view)变换)
    • Cheese!(投影(projection)变换)
    • 合起来称为MVP

为了介绍相机变换,首先定义相机,相机由如下三个量描述:

  • position $\vec e$
    • 相机向量;
  • look-at / gaze direction $\vec g$
    • 相机朝向;
  • up direction $\vec t$
    • 相机角度;

图示如下:

注意到如果相机和所有物体一起移动,“照片”将是相同的,所以我们总是将相机变换成

  • 在原点位置,up direction为$Y$,gaze direction为$-Z$;
  • 并与相机一起变换物体

图示:

假设上述变换为$M_{view}$,那么在数学上为:

  • 平移到原点;
  • 旋转$\vec g$到$-Z$;
  • 旋转$\vec t$到$Y$;
  • 旋转$(\vec g\times \vec t)$到$X$;

图示:

将变换分解为平移和旋转,即:

那么:

而$R_{v i e w}$是很难描述的,考虑其逆变换$R_{v i e w}^{-1}$,可以理解为将$X$轴旋转到$(\vec g\times \vec t)$,$Y$轴旋转到$\vec t$,$Z$轴旋转到$-\vec g$:

利用正交矩阵的逆为其转置,可得:

视图/相机变换小结:

  • 与相机一起变换物体;
  • 直到相机在原点,up在$Y$轴,look at $-Z$;
  • 后续变换的基础;

投影(projection)变换

计算机图形学中的投影:

  • 3D到2D;
  • 正交投影;
  • 透视投影;

透视投影可以带来近大远小的效果:

正交投影

正交投影一种简单的理解方式:

  • 相机位于原点,look $-Z$,up at $Y$(看起来很熟悉?);
  • 删除$Z$坐标;
  • 将生成的矩形平移并缩放为$[-1, 1]^2$;

一般情况下:

  • 我们希望将立方体$[l, r] \times[b, t] \times[{f}, {n}]$映射到规范立方体$[-1, 1]^3$;
  • 我们先将立方体平移;
  • 再将立方体缩放;

变换矩阵为:

补充:

  • 沿着$-Z$观察,使远近不直观因为此时($n > f$);
  • 仅供参考:这就是 OpenGL(图形 API)使用左手坐标系的原因;

透视投影

透视投影:

  • 最常见于计算机图形学、艺术、视觉系统;
  • 远处物体更小;
  • 平行线不平行,相交到单点;

在继续之前,回顾齐次坐标的性质:

  • $(x,y ,z ,1), (kx, ky, kz, k\neq 0), (xz, yz, z^2, z\neq 0)$在3D中都表示$(x, y, z)$;
  • 例如,$(1,0,0, 1)$和$(2, 0, 0, 2)$都表示$(1, 0, 0)$;

那么如何进行透视投影?

  • 首先将frustum“挤压”成一个长方体 ($n\to n, f\to f , M_{perp\to ortho}$);
  • 然后进行正交投影(利用已知的$M_{ortho}$);

为了找到变换,我们可以找到变换后的关系,即点$(x’, y’, z’)$和原始点$(x, y, z)$:

丛上图中,可以看到关系为:

在齐次坐标下,坐标之间的关系为:

所以$M_{perp\to ortho}$作用为:

因此不难看出:

现在的问题是求解第三行,这里可以利用两个信息:

  • 近平面上的任何点都不会改变;
  • 远平面上任何点的$z$都不会改变;

对于第一点,公式1中将$z$替换为$n$可得:

由于上式对于任意的$x, y$都成立,因此$M_{p e r s p \rightarrow o r t h o}^{(4 \times 4)} $的第三行为:

对应的方程为:

对于第二点,原平面上的特殊点$(0, 0, f)$,那么:

对应的方程为:

求解可得:

即:

因此,最终的变换为: