二维情况下的转换
1 缩放变换
形象理解就是图像在x方向和y方向上放大或者缩小。
代数形式:
{
x
′
=
k
x
x
y
′
=
k
y
y
\begin{cases} x' = k_x x \\ y' = k_y y \end{cases}
{x′=kxxy′=kyy
矩阵形式:
(
x
′
y
′
)
=
(
k
x
0
0
k
y
)
(
x
y
)
\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} k_x & 0 \\ 0 & k_y \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}
(x′y′)=(kx00ky)(xy)
当
k
x
=
k
y
k_x = k_y
kx=ky 时,是均匀缩放,两个方向同等比例地缩放。
当 k x = − 1 , k y = 1 k_x = -1, k_y = 1 kx=−1,ky=1 ,是镜像变换,类似整个二维平面的图像以y轴为对称轴对称过去一样。
2 切变
平行力作用在物体上的形变
矩阵形式:
(
x
′
y
′
)
=
(
k
x
a
0
k
y
)
(
x
y
)
=
(
k
x
x
+
a
y
k
y
y
)
\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} k_x & a \\ 0 & k_y \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} k_x x + ay \\ k_y y \end{pmatrix}
(x′y′)=(kx0aky)(xy)=(kxx+aykyy)
x方向上位置坐标整体向右平移。
3 旋转
旋转是指绕着 原点 逆时针旋转
θ
\theta
θ 的变换。
旋转矩阵如下:
R = ( c o s θ − s i n θ s i n θ c o s θ ) R = \begin{pmatrix} cos \theta & -sin\theta \\ sin \theta & cos \theta \end{pmatrix} R=(cosθsinθ−sinθcosθ)
( x ′ y ′ ) = ( c o s θ − s i n θ s i n θ c o s θ ) ( x y ) \begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} cos \theta & -sin\theta \\ sin \theta & cos \theta \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} (x′y′)=(cosθsinθ−sinθcosθ)(xy)
旋转矩阵是正交阵(转置矩阵等于逆矩阵 R T = R − 1 R^T = R^{-1} RT=R−1)
正交矩阵性质:
- 转置等于逆,绕某个轴旋转 θ \theta θ 的旋转矩阵的逆,就是绕同一轴旋转 − θ -\theta −θ
- 保持向量长度:作用于任何向量时,向量长度不变
- 列向量(行向量)正交且单位化
4 线性变换
线性变换的理解:参考 https://segmentfault.com/a/1190000041138293
线性映射是由向量空间
V
→
W
V\rightarrow W
V→W 的映射,而线性变换是线性映射的一个特例,是由线性空间
V
V
V 到其自身的映射。
通俗理解线性变换就是 坐标轴经过 旋转,伸缩 等操作,原坐标轴上的点一同随着变化,然后这些点会在一个新的位置。
(
x
′
y
′
)
=
(
a
b
c
d
)
(
x
y
)
=
(
a
x
+
b
y
c
y
+
d
y
)
\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} ax + by \\ cy + dy \end{pmatrix}
(x′y′)=(acbd)(xy)=(ax+bycy+dy)
其中
(
a
,
c
)
,
(
b
,
d
)
(a,c),(b,d)
(a,c),(b,d) 是新的坐标系下的基方向上的向量。
线性变换的特点:
- 变换前是直线,变换后依然是直线
- 原点保持固定不动
举个例子:
原坐标轴x轴和y轴,两个基为
i
=
(
1
,
0
)
,
j
=
(
0
,
1
)
i=(1,0), j=(0,1)
i=(1,0),j=(0,1) ,这个轴上的某个向量为
A
→
=
(
3
,
2
)
T
=
3
i
+
2
j
\overrightarrow A = (3,2)^T = 3i+2j
A=(3,2)T=3i+2j
现在坐标轴有一个线性变换,新的基为
i
′
=
(
1
,
−
2
)
,
j
′
=
(
3
,
0
)
i'=(1,-2), j'=(3,0)
i′=(1,−2),j′=(3,0) ,此时得到的新的向量,但是它相对于基的关系还是不变的,即
A
→
′
=
3
i
′
+
2
j
′
\overrightarrow A' = 3i' + 2j'
A′=3i′+2j′
新的 A → ′ \overrightarrow A' A′ 在原坐标系(基)下的坐标可以通过矩阵乘法求得:
A → ′ = ( 1 3 − 2 0 ) ( 3 2 ) \overrightarrow A' = \begin{pmatrix} 1 & 3 \\ -2 & 0 \end{pmatrix} \begin{pmatrix} 3 \\ 2 \end{pmatrix} A′=(1−230)(32)
也就是说这个线性变换矩阵是由新的基向量(说基可能不准确,因为基要求模长为1)组成的列向量。
二维线性变换不涉及到平移变换,即二维下的仿射变换不是线性变换。
5 齐次坐标变换
平移变换无法用单独的矩阵相乘的形式表示,因此引入齐次坐标,增加一维。
二维坐标一般被表示为 ( x , y , w ) (x,y,w) (x,y,w) ,w是一个非零的缩放因子,一般情况下取w=1
平移矩阵:平移(tx, ty)的齐次变换矩阵
T = ( 1 0 t x 0 1 t y 0 0 1 ) ( x ′ y ′ 1 ) = ( 1 0 t x 0 1 t y 0 0 1 ) ( x y 1 ) T = \begin{pmatrix} 1 & 0 & tx \\ 0 & 1 & ty \\ 0 & 0 & 1 \end{pmatrix} \\ \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & tx \\ 0 & 1 & ty \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} T= 100010txty1 x′y′1 = 100010txty1 xy1
6 仿射变换
一个向量空间进行一次线性变换并接上一个平移,变换到另一个向量空间。
(
x
′
y
′
1
)
=
(
a
b
t
x
c
d
t
y
0
0
1
)
(
x
y
1
)
\begin{pmatrix} x' \\ y' \\ 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}
x′y′1
=
ac0bd0txty1
xy1
7 组合变换
可以通过矩阵相乘,将多种变换组合在一起,只需将齐次坐标与最终的变换矩阵相乘即可。注意矩阵是从右向左计算的,矩阵是左乘。
可以将一个变换分解:让矩阵按照某一点进行旋转(先将旋转点平移到原点,然后再平移回去)
三维情况下的转换
1 线性齐次变换
变换矩阵如下:
T
=
(
x
1
x
2
x
3
0
y
1
y
2
y
3
0
z
1
z
2
z
3
0
0
0
0
1
)
T= \begin{pmatrix} x_{1} & x_2 & x_{3} & 0 \\\ y_{1} & y_2 & y_{3} & 0 \\\ z_{1} & z_2 & z_{3} & 0 \\\ 0 & 0 & 0 & 1 \end{pmatrix}
T=
x1 y1 z1 0x2y2z20x3y3z300001
(
x
1
,
y
1
,
z
1
)
,
(
x
2
,
y
2
,
z
2
)
,
(
x
3
,
y
3
,
z
3
)
(x_1,y_1,z_1),(x_2,y_2, z_2),(x_3,y_3,z_3)
(x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 是新的基向量,即要变换到的坐标系。
将点坐标左乘一个线性变换矩阵,通俗讲就是将原坐标系下的点通过旋转伸长等操作(转到新的坐标系下),求在新坐标系下点的坐标,这个坐标是相对于原坐标系而言的。
同时还可以附加平移操作,新的变换矩阵就是
T = ( x 1 x 2 x 3 t x y 1 y 2 y 3 t y z 1 z 2 z 3 t z 0 0 0 1 ) T= \begin{pmatrix} x_{1} & x_2 & x_{3} & t_x \\\ y_{1} & y_2 & y_{3} & t_y \\\ z_{1} & z_2 & z_{3} & t_z \\\ 0 & 0 & 0 & 1 \end{pmatrix} T= x1 y1 z1 0x2y2z20x3y3z30txtytz1
2 旋转变换
任何一个3D旋转都可以表示成绕x轴,y轴,z轴旋转的组合
R x y z ( α , β , γ ) = R x ( α ) R y ( β ) R z ( γ ) R_{xyz}(\alpha, \beta, \gamma) = R_x(\alpha)R_y(\beta)R_z(\gamma) Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)
α β γ \alpha \beta \gamma αβγ 分别代表物体绕x、y、z旋转的角度,它们也被称为欧拉角