理解仿射变换
参考
前言
最近看了一些unity shader相关的教程,发现unity中的变换矩阵全部都用的是四维矩阵,而不是三维矩阵,进一步查资料发现,在3D图形渲染领域中,涉及到矩阵变换的地方,基本都用的是四维矩阵,那么既然是三维线性空间的变换,为什么要用四维矩阵呢?
仿射变换
实际上,使用四维矩阵是为了计算仿射变换,那么什么是仿射变换呢?
仿射变换,简单来说,就是线性变换和平移两者的结合,即,仿射变换=线性变换+平移
为什么要引入仿射变换
我们知道,线性变换在变换前后,向量的起点始终位于坐标系原点,不会变化,因此线性变换基本上只能表示向量缩放和旋转两种操作,如果我们想表达一个点或一个向量的平移,是无法用线性变换来表示的。
举个例子,对于向量\(\vec{a}\) $$\vec{a}= \begin{bmatrix} 1\cr 2\cr \end{bmatrix} $$ 我们想将其向x轴方向平移1个单位,向y轴方向平移2个单位,得到向量\(\vec{b}\),即 $$\vec{b}=\vec{a} + \begin{bmatrix} 1\cr 2\cr \end{bmatrix} $$
如果用线性变换的方法去表示这个操作,最终得到的是 $$\vec{b}= \begin{bmatrix} 2\cr 4\cr \end{bmatrix} $$
那么显然,从向量 \(\vec{a}\) 变到向量 \(\vec{b}\) 后,\(\vec{b}\) 的起点还是在坐标原点,实际上是对 \(\vec{a}\) 做了一个旋转+拉伸,并不能体现出平移操作。
仿射变换的表示方法
为了表示向量的平移操作,我们将仿射变换表示为以下形式 \(\(\vec{c}= A\vec{a} + \vec{b}\)\) $$\vec{b}= \begin{bmatrix} t_x\cr t_y\cr \end{bmatrix} $$ 其中,\(A\) 代表对向量 \(\vec{a}\) 所做的线性变换,\(\vec{b}\) 代表平移量,即,将 \(\vec{a}\) 向x轴方向移动 \(t_x\) 个单位,向y轴方向移动 \(t_y\)个单位,\(\vec{c}\) 是最终得到的向量
为了方便仿射变换的运算,将仿射变换也表示成矩阵运算,我们可以给向量加一个维度,将其表示为以下形式,新增的维度称为齐次坐标
可以看到,经过计算后 \(\vec{c}\) 仍然等于 \(A\vec{a} + \vec{b}\),但是计算的形式却变为了和线性变换一样的矩阵运算形式
当向量 \(\vec{a}\) 新增的一维为0时,仿射变换就退化为了线性变换,即
此时,\(\vec{c}= A\vec{a}\)