3.变换
3.1 概述
变换(Transformation)用于描述物体、相机或坐标在空间中的变化。
核心思路是把几何变换和矩阵运算联系起来,最终用统一的矩阵形式描述物体在空间中的变化。
3.2 为什么要学习变换
变换主要有两类用途:
- 建模(Modeling):通过平移、旋转、缩放等操作改变物体的位置、姿态和大小。
- 观察(Viewing):描述相机和投影过程,把三维世界转换为二维图像。

从三维世界到二维图像的过程称为投影(Projection),也是后续观察变换的重要基础。
3.3 二维变换
缩放(Scale)
二维点 \((x,y)\) 分别沿 \(x\)、\(y\) 方向缩放 \(s_x\)、\(s_y\) 后:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}
\end{pmatrix} =
\begin{pmatrix}
s_x&0\\
0&s_y
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
\]

当 \(s_x=s_y\) 时是均匀缩放(Uniform Scale);两者不同时是非均匀缩放(Non-Uniform Scale)。

反射(Reflection)

例如关于 \(y\) 轴镜像,只改变 \(x\) 坐标的符号:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}
\end{pmatrix} =
\begin{pmatrix}
-1&0\\
0&1
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
\]
剪切(Shear)

图中的水平剪切保持 \(y\) 不变,\(x\) 的偏移量随 \(y\) 增大:
\[
x’=x+ay,\qquad y’=y
\]
因此矩阵为:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}
\end{pmatrix} =
\begin{pmatrix}
1&a\\
0&1
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
\]
旋转(Rotation)

默认讨论绕原点逆时针旋转 \(\theta\):
设旋转矩阵为:
\[
R(\theta)=
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\]
旋转矩阵不需要死记,可以直接从两个二维基向量推出来。
先看 \(x\) 轴方向的单位向量:
\[
\begin{pmatrix}
1\\
0
\end{pmatrix}
\]
逆时针旋转 \(\theta\) 后,向量长度仍然为 \(1\),根据三角函数关系,它的新坐标为:
\[
\begin{pmatrix}
\cos\theta\\
\sin\theta
\end{pmatrix}
\]
另一方面:
\[
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\begin{pmatrix}
1\\
0
\end{pmatrix} =
\begin{pmatrix}
A\\
C
\end{pmatrix}
\]
因此:
\[
A=\cos\theta,\qquad C=\sin\theta
\]
也就是说,旋转矩阵的第一列,就是 \((1,0)^T\) 旋转后的结果。
再看 \(y\) 轴方向的单位向量:
\[
\begin{pmatrix}
0\\
1
\end{pmatrix}
\]
逆时针旋转 \(\theta\) 后,其方向相当于 \(\frac{\pi}{2}+\theta\),因此:
\[
\begin{pmatrix}
\cos(\frac{\pi}{2}+\theta)\\
\sin(\frac{\pi}{2}+\theta)
\end{pmatrix} =
\begin{pmatrix}
-\sin\theta\\
\cos\theta
\end{pmatrix}
\]
同时:
\[
\begin{pmatrix}
A&B\\
C&D
\end{pmatrix}
\begin{pmatrix}
0\\
1
\end{pmatrix} =
\begin{pmatrix}
B\\
D
\end{pmatrix}
\]
所以:
\[
B=-\sin\theta,\qquad D=\cos\theta
\]
最终得到二维旋转矩阵:
\[
R(\theta)=
\begin{pmatrix}
\cos\theta&-\sin\theta\\
\sin\theta&\cos\theta
\end{pmatrix}
\]
核心就是看两个基向量旋转后去了哪里,它们的结果分别组成旋转矩阵的第一列和第二列。
线性变换(Linear Transformation)

缩放、反射、剪切和旋转都可以统一写成:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}
\end{pmatrix} =
\begin{pmatrix}
a&b\\
c&d
\end{pmatrix}
\begin{pmatrix}
x\\
y
\end{pmatrix}
\]
即:
\[
\mathbf{x}’=M\mathbf{x}
\]
能够写成同维矩阵乘向量形式的这些变换,都属于线性变换。
3.4 齐次坐标(Homogeneous Coordinates)
为什么需要齐次坐标

平移和前面的线性变换不同:
\[
x’=x+t_x,\qquad y’=y+t_y
\]
这里多出了常量 \(t_x\)、\(t_y\),无法仅使用普通的 \(2\times2\) 矩阵乘法表示。

也就是说,平移不是二维空间中的线性变换。为了把平移也统一成矩阵乘法,引入齐次坐标。
点与向量的齐次表示

二维坐标增加一个 \(w\) 分量:
- 点(Point):\((x,y,1)^T\)
- 向量(Vector):\((x,y,0)^T\)
于是平移可以写成:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}\\
1
\end{pmatrix} =
\begin{pmatrix}
1&0&t_x\\
0&1&t_y\\
0&0&1
\end{pmatrix}
\begin{pmatrix}
x\\
y\\
1
\end{pmatrix} =
\begin{pmatrix}
x+t_x\\
y+t_y\\
1
\end{pmatrix}
\]
对于二维向量 \(\vec v=(v_x,v_y)^T\),齐次坐标表示为:
\[
\begin{pmatrix}
v_x\\
v_y\\
0
\end{pmatrix}
\]
使用同一个平移矩阵:
\[
\begin{pmatrix}
v_x^{\prime}\\
v_y^{\prime}\\
0
\end{pmatrix} =
\begin{pmatrix}
1&0&t_x\\
0&1&t_y\\
0&0&1
\end{pmatrix}
\begin{pmatrix}
v_x\\
v_y\\
0
\end{pmatrix} =
\begin{pmatrix}
v_x\\
v_y\\
0
\end{pmatrix}
\]
因为:
\[
v_x’=v_x+t_x\cdot0=v_x
\]
\[
v_y’=v_y+t_y\cdot0=v_y
\]
所以,平移不会改变向量。
向量的 \(w=0\),因此平移矩阵不会改变向量。这也符合向量只有方向和长度,没有绝对位置的含义。

齐次坐标下:
- 向量 + 向量 = 向量
- 点 - 点 = 向量
- 点 + 向量 = 点
对于 \((x,y,w)^T\),只要 \(w\neq0\),都可以整体除以 \(w\),规范化为:
\[
\begin{pmatrix}
x/w\\
y/w\\
1
\end{pmatrix}
\]
两个点直接相加会得到 \(w=2\),重新归一化后对应两个点的中点。
仿射变换(Affine Transformation)


仿射变换 = 线性变换 + 平移。
二维仿射变换统一写成:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}\\
1
\end{pmatrix} =
\begin{pmatrix}
a&b&t_x\\
c&d&t_y\\
0&0&1
\end{pmatrix}
\begin{pmatrix}
x\\
y\\
1
\end{pmatrix}
\]
左上角的 \(2\times2\) 部分描述线性变换,最后一列描述平移。
逆变换(Inverse Transform)

如果矩阵 \(M\) 表示一个可逆变换,那么 \(M^{-1}\) 表示它的逆变换:
\[
M^{-1}M=I
\]
几何意义很直接:先做 \(M\),再做 \(M^{-1}\),物体会回到原来的状态。
3.5 组合变换(Composing Transforms)
变换顺序

多个简单变换可以组合成复杂变换,但顺序不能随意交换。
例如先旋转再平移,与先平移再旋转,最终结果通常不同:
\[
R\,T\neq T\,R
\]

使用列向量并把矩阵乘在左侧时,矩阵按从右到左的顺序作用。
例如:
\[
\mathbf{p}’=T_{(1,0)}R_{45^\circ}\mathbf{p}
\]
表示先对 \(\mathbf p\) 旋转 \(45^\circ\),再沿 \(x\) 方向平移一个单位。
组合多个变换

连续进行 \(A_1,A_2,\cdots,A_n\):
\[
\mathbf{p}’=A_n\cdots A_2A_1\mathbf{p}
\]
矩阵乘法满足结合律,因此可以先把多个变换矩阵相乘,得到一个组合矩阵,再用于后续计算。
复杂的变换分解

比如我们想绕任意点 \(\mathbf c\) 旋转,可以拆成三步:
- 将 \(\mathbf c\) 平移到原点。
- 绕原点旋转。
- 平移回原位置。
矩阵形式为:
\[
T(\mathbf c)\,R(\theta)\,T(-\mathbf c)
\]
最右边的 \(T(-\mathbf c)\) 最先执行。
3.6 三维变换

二维齐次坐标可以直接推广到三维:
- 三维点:\((x,y,z,1)^T\)
- 三维向量:\((x,y,z,0)^T\)

三维仿射变换使用 \(4\times4\) 矩阵:
\[
\begin{pmatrix}
x^{\prime}\\
y^{\prime}\\
z^{\prime}\\
1
\end{pmatrix} =
\begin{pmatrix}
a&b&c&t_x\\
d&e&f&t_y\\
g&h&i&t_z\\
0&0&0&1
\end{pmatrix}
\begin{pmatrix}
x\\
y\\
z\\
1
\end{pmatrix}
\]
其中:
- 左上角 \(3\times3\) 矩阵表示三维线性变换。
- 最后一列 \((t_x,t_y,t_z)^T\) 表示平移。
- 最后一行保持 \((0,0,0,1)\)。
直接展开可以看出,这种矩阵表示的是先做线性变换,再做平移。
3.7 总结
- 线性变换可以统一表示为矩阵乘向量,缩放、反射、剪切和旋转都属于这一类。
- 平移不是普通线性变换,齐次坐标通过增加一个维度,将平移也统一进矩阵表示。
- 仿射变换 = 线性变换 + 平移。
- 变换顺序很重要,使用列向量时矩阵从右向左执行。
- 二维仿射变换使用 \(3\times3\) 齐次矩阵,三维仿射变换使用 \(4\times4\) 齐次矩阵。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com