一、摄像机变换 / 视图变换

MVP 变换

Untitled

定义摄像机位置 $\boldsymbol e$ 、朝向和向上方向 $\hat {\boldsymbol g}, \hat {\boldsymbol t}$ 。

作为一般的视图变换结果,需要将世界的摄像机移动到 $\boldsymbol e = \boldsymbol O, \ \ \hat {\boldsymbol g} = -\hat {\boldsymbol z}, \hat {\boldsymbol t} = \hat {\boldsymbol y}$ 的位置,也就是说作 $\boldsymbol M_{view} = \boldsymbol R_{view} \ \boldsymbol T_{view}$ 变换世界中的所有东西,使得摄像机落到如上位置并且不影响摄像机和其他物体的相对关系。

Untitled

显然首先平移到原点:

$$ \boldsymbol T_{view} = \boldsymbol T(-\boldsymbol e) $$

接下来需要做这样的移动: $\hat {\boldsymbol g} \rightarrow -\hat {\boldsymbol z}, \hat {\boldsymbol t} \rightarrow \hat {\boldsymbol y}, (\hat {\boldsymbol g} \times \hat {\boldsymbol t}) \rightarrow \hat {\boldsymbol x}$ 。是不是很难啊,但是请考虑它的逆矩阵,也就是 $\hat {\boldsymbol x} \rightarrow (\hat {\boldsymbol g} \times \hat {\boldsymbol t}), \hat {\boldsymbol y} \rightarrow \hat {\boldsymbol t}, \hat {\boldsymbol z} \rightarrow -\hat {\boldsymbol g}$ 。根据旋转运算是线性运算,它完全可以根据对 $\hat {\boldsymbol x}, \hat {\boldsymbol y}, \hat {\boldsymbol z}$ 单独的变换而写成:

$$ \boldsymbol R_{view}^{-1} = \begin{pmatrix} \hat {\boldsymbol g} \times \hat {\boldsymbol t} & \hat {\boldsymbol t} & -\hat {\boldsymbol g} & \boldsymbol 0 \\ 0 & 0 & 0 & 1 \end{pmatrix} $$

旋转矩阵是正交矩阵。所以:

$$ \boldsymbol R_{view} = (\boldsymbol R_{view}^{-1})^{\rm T} = \begin{pmatrix} (\hat {\boldsymbol g} \times \hat {\boldsymbol t})^{\rm T} & 0 \\ \hat {\boldsymbol t}^{\rm T} & 0 \\ -\hat {\boldsymbol g}^{\rm T} & 0 \\ \boldsymbol 0^{\rm T} & 1 \end{pmatrix} $$

即得。

二、投影变换

Untitled

二、正交投影

假设摄像机在原点,$\hat {\boldsymbol g} = -\hat {\boldsymbol z}, \hat {\boldsymbol t} = \hat {\boldsymbol y}$,那么把物体的 $z$ 坐标全扔掉就行了。最后还要把画面结果映射到 $[-1, 1]^2$,以便后面的操作。

Untitled

记得 Far/Near Clipping ,所以要定义任意与坐标轴正交的立方体(View Volumn)范围 $[l, r] * [b, t] * [f, n]$,我们要将其映射到 “the canonical cube” 即 $[-1, 1]^3$ 。