Transformation
2D Transforms
Transform in Scale
对于二维平面上的一个点$(x,y)$, 将向量变换成原来的$s$倍,只需要左乘缩放矩阵:
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} s& 0\0& s \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)
$$
非均匀缩放:如果对坐标轴上缩放不同比例,只需调整为
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} s_x& 0\0& s_y \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
关于$y$轴的镜像
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} -1& 0\0& 1 \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
Shear Matrix:
竖直方向上移动为0,水平方向的移动$0\to y=0, a\to y=1$;
$$
\left( \begin{array}{c} x’\y’ \end{array}\right) = \left( \begin{array}{c} 1& a\0& 1 \end{array}\right) \left( \begin{array}{c} x\y \end{array}\right)\
$$
效果如下
Transform: Rotate
旋转默认绕原点逆时针旋转
旋转矩阵如下:
$$
\boldsymbol R_\theta =\left( \begin{array}{c} \cos\theta & -\sin\theta \\sin\theta& \cos\theta \end{array}\right)
$$
不难观察到$\boldsymbol R_\theta^\top = \boldsymbol R_{-\theta}$,换句话说旋转矩阵是正交矩阵;
对于一般的旋转矩阵也有旋转矩阵的逆即为其转置;
旋转效果如下:
Liner Transforms
对于线性变换
$$
\begin{cases}
x’=ax+by\
y’=cx+dy
\end{cases}
$$
我们只需要左乘一个相同维度的矩阵$\boldsymbol M$
$$
\vec x’=\boldsymbol M \vec x, \boldsymbol M=\left(\begin{array}{c} a&b\c&d\end{array}\right)
$$
为进一步描述平移变换,只需要进一步加上平移量
$$
\vec x’ = \vec x+\vec t, \vec t = \left(\begin{array}{c} t_x\t_y\end{array}\right)
$$
为进一步描述仿射变换(Affine Transform)
$$
\vec x’=\boldsymbol M \vec x+\vec t
$$
但是这个就不属于线性变化的范畴了,为此我们引入齐次坐标,基于向量的平移不变性,增加一个维度;
一个理解是
vector + vector = vector
point - point = vector
point + vector = point
point + point = ?
在齐次坐标下,将三维点看作二维向量
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right)
{\rm \ is \ 2D\ point\ }
\left(\begin{array}{c}
x/w\
y/w\
1\end{array}\right),w\neq 0
$$
那么在齐次坐标的观点下,点+点的结果是线段的中点;
平移变换可以表示如下
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right) = \left(\begin{array}{c}
1&0&t_x\
0&1&t_y\
0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
1\end{array}\right)
$$
仿射变换可以表示如下
$$
\left(\begin{array}{c}
x’\
y’\
w’
\end{array}\right) = \left(\begin{array}{c}
a&b&t_x\
c&d&t_y\
0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
1\end{array}\right)
$$
Affine Transformation
在齐次坐标下,这些特殊的仿射变换可以左乘如下矩阵,表达如下:
缩放Scale
$$
\boldsymbol S(s_x,s_y)= \left(\begin{array}{c}
s_x&0&0\
0&s_y&0\
0&0&1
\end{array}\right)
$$
旋转Rotate
$$
\boldsymbol R(\theta) =
\left(\begin{array}{c}
\cos \theta&-\sin\theta&0\
\sin\theta&\cos\theta&0\
0&0&1
\end{array}\right)
$$
平移Translation
$$
\bold T (t_x,t_y) =
\left(\begin{array}{c}
1&0&t_x\
0&1&t_y\
0&0&1
\end{array}\right)
$$
Inverse Transform
在数学上,逆变换等价于左乘变换矩阵的逆矩阵;
Composite Transform
复杂的变换可以通过简单的变换相乘得到;
乘法的顺序很重要,因为矩阵乘法不满足交换律;
对于仿射变换矩阵$A_1,A_2,\cdots, $从右到左运用以下矩阵,根据结合律,可以先将所有矩阵合成为一个最终矩阵;
$$
\boldsymbol A_n\cdot \cdots \boldsymbol A_2 \cdot\boldsymbol A_1\cdot \left(\begin{array}{c}x\y\1\end{array}\right) = \boldsymbol M \vec v
$$
反过来也可以将复杂矩阵进行分解,下图是沿任意点旋转的过程
Transform in 3D
试图引入齐次坐标
3D Point = $(x,y,z,1)^\top$
3D vector = $(x, y, z, 0)^\top$
几乎和2D版本同理,仿射变换如下:
$$
\left(\begin{array}{c}
x’\
y’\
w’\
1
\end{array}\right) = \left(\begin{array}{c}
a&b&c&t_x\
d&e&f&t_y\
g&h&i&t_z\
0&0&0&1
\end{array}\right)
\left(\begin{array}{c}
x\
y\
z\
1\end{array}\right)
$$
具体来说,
缩放变换
$$
\boldsymbol S(s_x,s_y,s_z)= \left(\begin{array}{c}
s_x&0&0&0\
0&s_y&0&0\
0&0&s_z&0\
0&0&0&1
\end{array}\right)
$$
平移变换
$$
\boldsymbol T(t_x,t_y,t_z)=
\left(\begin{array}{c}
1&0&0&t_x\
0&1&0&t_y\
0&0&1&t_z\
0&0&0&1
\end{array}\right)
$$
旋转变换(分别从x,y,z轴旋转),注意轮换对称性
$$
\boldsymbol R_x(\theta) =
\left(\begin{array}{c}
1&0&0&0\
0&\cos\theta&-\sin\theta&0\
0&\sin\theta&\cos\theta&0\
0&0&0&1
\end{array}\right)\
\boldsymbol R_y(\theta) =
\left(\begin{array}{c}
\cos\theta&0&\sin\theta&0\
0&1&0&0\
-\sin\theta&0&\cos\theta&0\
0&0&0&1
\end{array}\right)\
\boldsymbol R_z(\theta) =
\left(\begin{array}{c}
\cos\theta&-\sin\theta&0&0\
\sin\theta&\cos\theta&0&0\
0&0&1&0\
0&0&0&1
\end{array}\right)
$$
对于任意旋转,写成三个欧拉角对应的绕轴旋转
$$
\boldsymbol R_{xyz}(\alpha, \beta,\gamma)=\boldsymbol R_x(\alpha)\boldsymbol R_y(\beta)\boldsymbol R_z(\gamma)
$$
对于一个旋转轴$\mathbf n$和一个旋转角$\alpha$,这条旋转轴默认过原点,以下是Rodrigues旋转公式
$$
\boldsymbol R(\mathbf{n}, \alpha) = \cos \alpha I + (1-\cos\alpha) \mathbf{n}\mathbf{n}^\top + \sin\alpha
\left(\begin{array}{c}
0&-n_z&n_y\
n_z&0&-n_x\
-n_y&n_x&0
\end{array}\right)
$$
对于将三维模型转化成二维图片,应该经过如下mvp变换
- model transformation
- view transformation
- projection transformation
视图变换
相机应该有如下属性,如下图所示
position $\vec e$
gaze direction $\hat g$
up direction $\hat t$
在观察相机和背景进行着相同的相对运动时,得出的视图可能完全一样,我们约定相机永远在原点,沿着z轴看,头顶为y轴,这是相机的标准位置;
将任意摆放的相机平移到标准位置,需要经历以下步骤,那么这些步骤相乘对应的逆矩阵就是视图矩阵$\boldsymbol M_{view}$;
- 将$\vec e$平移到原点
- 旋转$\hat t$和y轴正方向同向
- 旋转$(\hat g \times \hat t)$和x轴正方向同向
由此写出视图矩阵$\boldsymbol M_{view} = R_{view}T_{view}$
$$
T_{view} =
\left(\begin{array}{c}
1&0&0&-x_e\
0&1&0&-y_e\
0&0&1&-z_e\
0&0&0&1
\end{array}\right)
$$
思考$R_{view}$的逆,即将$(0,1,0,0)^\top$旋转到$\hat t$,将$(1,0,0,0)$旋转到$\hat g\times \hat t$,结合旋转矩阵的逆等于其转置,如下
$$
R_{view}^{-1} =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & x_{\hat t} & x_{-\hat g} & 0\
y_{\hat g\times \hat t } & y_{\hat t} & y_{-\hat g} & 0\
z_{\hat g\times \hat t } & z_{\hat t} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )\
R_{view} =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & y_{\hat g\times \hat t } &z_{\hat g\times \hat t } & 0\
x_{\hat t}& y_{\hat t} & z_{\hat t} & 0\
x_{-\hat g} & y_{-\hat g} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )
$$
相机和物品应该要运用相同的视图矩阵,所以模型变换和视图变换其实相同,也统称为魔模型视图变换;
$$
\boldsymbol M =
\left(\begin{array}{c}
x_{\hat g\times \hat t } & y_{\hat g\times \hat t } &z_{\hat g\times \hat t } & 0\
x_{\hat t}& y_{\hat t} & z_{\hat t} & 0\
x_{-\hat g} & y_{-\hat g} & z_{-\hat g} & 0\
0 & 0& 0 & 1
\end{array}\right )
\left(\begin{array}{c}
1&0&0&-x_e\
0&1&0&-y_e\
0&0&1&-z_e\
0&0&0&1
\end{array}\right)
$$
投影变换
投影变换分为
- 正交投影Orthographic projection:常用于工程制图,相机在无限远处
- 透视投影Perspective projection:常用于美术,有近大远小的成像原理
Orthographic Projection
一般来说,我们将空间中方体$[l,r]\times [b,t]\times [f,n]$,可以映射为标准立方体(canonical cube)$[-1,1]^3$,这需要先进行平移再缩放即可,如下:
$$
\boldsymbol M_{o} =
\left(\begin{array}{c}
\frac{2}{r-l}&0&0&0\
0&\frac{2}{t-b}&0&0\
0&0&\frac{2}{n-f}&0\
0&0&0&1
\end{array}\right)
\left(\begin{array}{c}
1&0&0&-\frac{r+l}{2}\
0&1&0&-\frac{t+b}{2}\
0&0&1&-\frac{n+f}{2}\
0&0&0&1
\end{array}\right)
$$
Perspective Projection
对于透视变换,我们划归成正交投影变换问题:也就是规定一个近平面Near clip plane和一个远平面Far clip plane,其中两个面中心被相机正对着,满足以下性质
- 运用矩阵后,近平面上点保持不动
- 运用矩阵后,远平面上的点分量z保持不变
- 运用矩阵后,原平面中心点保持不变
这样我们将两个面上的物品大小变得完全一样,可以直接运用正交投影变换,也就是
$$
\boldsymbol M_{p}=\boldsymbol M_{o} \boldsymbol M_{p\to o}
$$
以下是变换矩阵$\boldsymbol M_{p\to o}$的推导:
对于空间任意一个点$(x,y,z,1)^\top$,和透视点和近平面满足某种相似三角形的特性,假设这个点被映射到近平面上的点$(x’,y’,z’,1)^\top$
$$
x’=\frac{n}{z}x,y’=\frac{n}{z}y
$$
在齐次坐标的假设下,这个点等价于$(nx,ny,*,z)^\top$;
变换矩阵应该具有如此形式,才能满足$\boldsymbol M_{p\to o} (x,y,z,1)^\top = (nx,ny,*,z)^\top$
$$
\left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\
- & * & * & *\
0 & 0 & 1 & 0
\end{array}\right)
$$
结合近平面方程和远平面方程,我们有
$$
\left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\ - & * & * & *\
0 & 0 & 1 & 0
\end{array}\right)
\left(\begin{array}{c}
0\
0\
f\
1
\end{array}\right)=
\left(\begin{array}{c}
0\
0\
f^2\
f
\end{array}\right)\
\left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\
- & * & * & *\
0 & 0 & 1 & 0
\end{array}\right)
\left(\begin{array}{c}
x\
y\
n\
1
\end{array}\right)=
\left(\begin{array}{c}
nx\
ny\
n^2\
n
\end{array}\right)
$$
最终透视变换的矩阵如下:
$$
\boldsymbol M_{p}=\boldsymbol M_{o} \left(\begin{array}{c}
n & 0 & 0 & 0\
0 & n & 0 & 0\
0 & 0 & n+f & -nf\
0 & 0 & 1 & 0
\end{array}\right)
$$
思考:可以注意到,对于近平面和原平面之间的点,运用$M_{p\to o}$后$z$值变得更大也就是更靠近远平面了,数学上来说$n+f-\frac{nf}{z}>z,n< z< f$;