3.变换

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\) 旋转,可以拆成三步:

  1. 将 \(\mathbf c\) 平移到原点。
  2. 绕原点旋转。
  3. 平移回原位置。

矩阵形式为:

\[
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

赏

×

喜欢就点赞,疼爱就打赏