2D线性变换
我们可以使用一个
通过这种简单的公式可以实现许多实用的变换,包括缩放、切变、旋转、镜像等
缩放
缩放是最简单的变换操作,只需要沿着坐标轴乘以指定的倍数即可,构造一个 的方阵,即:
通过这个矩阵就能将指定坐标缩放至任意倍大小
$$
\begin{gathered}
\end{gathered}
$$
例如,将图片
当
切变
切变是一种特殊的平移,即其中一条边平行于坐标轴进行平移(将矩形变为的平行四边形)。随着远离原点,偏移量也会随之增大。水平或垂直切变矩阵:
切变也可以理解成只考虑一个坐标轴的旋转,通过旋转角度的
例如,沿着水平方向向右切变
沿着垂直方向向上切变
旋转
假设,我们要将向量
因为向量 是由向量 旋转角度 得到,所以向量大小不变。使用三角恒等式展开得到:
再通过 与 将公式简化一下:
构造二维线性变换矩阵:
例如,使用将一个图像旋转 ,需要构造矩阵:
$$
\begin{gathered}
\end{gathered}
$$
镜像
将图像以坐标轴为对称轴进行反射,只需要将除对称轴之外的其他坐标全都取相反数即可
复合运算
通常我们会需要对一个图像进行多次变换,例如,先将图像缩放一次,再进行旋转一次
通过乘法结合律,可以将结果合并为:
由此可知,我们能将两个操作合并为一个最终的变换矩阵:
假设,我们需要将一个图像在垂直方向上缩小一倍,然后再旋转 ,计算得出最终的变换矩阵:
$$
\begin{gathered}
\end{gathered}
$$
特别注意:矩阵
的计算顺序是右侧优先,即先计算缩放 ,再计算旋转 。这个顺序非常重要,因为矩阵并不满足交换律,不同的运算顺序会产生不同的结果!!
3D线性变换
3D变换只是在2D的基础上拓展一个
3D旋转会比2D复杂得多,但是我们依然可以在2D的基础上加上一个
对于
3D切变与2D类似,沿着其中一条轴线平移即可:
任意向量旋转
与2D旋转相同,3D旋转矩阵也是一个正交矩阵,这意味矩阵的三行分别是三个相互正交的单位向量:
假设,三个单位矩阵分别为 和 ,由于相互正交:
若我们将旋转矩阵左乘单位矩阵 ,将得到:
观察结果矩阵,发现其与单位阵之间的关系:
$$
\begin{gathered}
R_{uvw}\textbf{u}=
= \textbf{x}
\end{gathered}
$$
相似的,我们还能得到
因为旋转矩阵 是正交矩阵,所以它的逆矩阵就是 ,通过该逆矩阵也能实现反操作
$$
\begin{gathered}
R_{uvw}^T\textbf{y}=
= \textbf{v}
\end{gathered}
$$
平移
我们前面都是通过一个矩阵
通过这种方式,我们只能够实现缩放和旋转,却无法进行平移操作。其实,想要实现平移操作只需要给每个点增加一个偏移量即可:
单独定义一个这样的平移操作确实可以实现效果,但我们更希望能够与前面一样只使用一个矩阵
这里需要引入齐次坐标的概念,将点 拓展一个维度,写成新的三维向量 ,矩阵 也拓展一个维度:
使用修改过后的三维矩阵,就能够实现二维平面的线性变化(包括缩放、旋转和平移)
$$
\begin{gathered}
\end{gathered}
如 果 在 进 行 线 性 变 换 时 , 不 希 望 图 像 产 生 平 移 , 只 需 要 将 向 量 的 拓 展 维 度 设 置 为 即 可 :
\begin{gathered}
\end{gathered}
$$
这样左上角
由于齐次坐标的拓展维度只会是 或 ,我们可以通过该值判断位置坐标或方向向量
在三维空间实现平移操作也是一样的使用齐次坐标,拓展一个维度即可:
$$
\begin{gathered}
\end{gathered}
$$
参考资料
- 齐次坐标
- 《Fundamentals of Computer Graphics》 Chapter 6 Transaction Matrices