Lec03 变换
文章目录
为什么学习变换
- 模型变换(Modeling):Translation/Rotation/Scaling
- 视图变换(Viewing):3D-to-2D projection
2D变换
线性变换(Linear Transforms)
线性变化 = 同维度矩阵
[ x ′ y ′ ] = [ a b c d ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} a&b\\ c&d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′]=[acbd][xy]
x ′ = M x \bold{x^{\prime}}=\bold{M}\bold{x} x′=Mx
-
缩放(Scale): [ x ′ y ′ ] = [ s x 0 0 s y ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} s_x&0\\ 0&s_y \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′]=[sx00sy][xy](记作 S s x , s y S_{s_x,s_y} Ssx,sy)
-
反射(Reflection): [ x ′ y ′ ] = [ − 1 0 0 1 ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} -1&0\\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′]=[−1001][xy](以y轴为对称轴)
-
切变(Shear): [ x ′ y ′ ] = [ 1 a 0 1 ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} 1&a\\ 0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′]=[10a1][xy]
(千层饼被推了一下:越往上变化越多)
-
旋转(Rotate): [ x ′ y ′ ] = [ cos θ − sin θ sin θ cos θ ] [ x y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} \cos\theta&-\sin\theta\\ \sin\theta&\cos\theta \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} [x′y′]=[cosθsinθ−sinθcosθ][xy](记作 R ( α ) R(\alpha) R(α))
特殊点:
这里的旋转,默认绕原点逆时针(CCW)旋转
非线性变换
平移(Translation): x ′ = x + t x x^{\prime}=x+t_x x′=x+tx, y ′ = y + t y y^{\prime}=y+t_y y′=y+ty(记作 T t x , t y T_{t_x,t_y} Ttx,ty)无法写成矩阵形式!!所以平移不是线性变换。
Is there a unified way to represent all transformations?
齐次坐标(Homogeneous Coodinate)
上述问题的解决方案就是齐次坐标!
加入第三个坐标(w-coodinate):
- 2D point = ( x , y , 1 ) ⊤ (x,y,1)^{\top} (x,y,1)⊤
- 2D vector = ( x , y , 0 ) ⊤ (x,y,0)^{\top} (x,y,0)⊤
平移变换的矩阵形式:
[
x
′
y
′
w
′
]
=
[
1
0
t
x
0
1
t
y
0
0
1
]
[
x
y
w
]
=
[
x
+
t
x
y
+
t
y
w
]
\begin{bmatrix} x^{\prime}\\y^{\prime}\\w^{\prime} \end{bmatrix}= \begin{bmatrix} 1&0&t_x\\ 0&1&t_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\w \end{bmatrix}= \begin{bmatrix} x+t_x\\y+t_y\\w \end{bmatrix}
⎣⎡x′y′w′⎦⎤=⎣⎡100010txty1⎦⎤⎣⎡xyw⎦⎤=⎣⎡x+txy+tyw⎦⎤
解释:对于点,平移后坐标改变,故
w
w
w为1,保持
t
x
,
t
y
t_x,t_y
tx,ty的效用;而对于向量,由于具有平移不变性,所以
w
w
w为0,消除了
t
x
,
t
y
t_x,t_y
tx,ty的效用。
0和1背后的深层次原因:
-
vector ± \pm ± vector = vector
-
point ± \pm ± vector = point
-
point - point = vector
-
point + point = middle point (w adds up to 2)
因为在齐次坐标系中, [ x y w ] i s t h e 2 D p o i n t [ x / w y / w 1 ] , w ≠ 0 \begin{bmatrix} x\\y\\w \end{bmatrix} {\rm is\ the\ 2D\ point} \begin{bmatrix} x/w\\y/w\\1 \end{bmatrix},w\neq0 ⎣⎡xyw⎦⎤is the 2D point⎣⎡x/wy/w1⎦⎤,w=0
仿射变换(Affine Transformation)
仿射映射 = 先线性映射 + 后平移
[ x ′ y ′ ] = [ a b c d ] [ x y ] + [ t x t y ] \begin{bmatrix} x^{\prime}\\y^{\prime} \end{bmatrix}= \begin{bmatrix} a&b\\ c&d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}+ \begin{bmatrix} t_x\\t_y \end{bmatrix} [x′y′]=[acbd][xy]+[txty]
用齐次坐标表示(囊括了所有变换):
[
x
′
y
′
1
]
=
[
a
b
t
x
c
d
t
y
0
0
1
]
[
x
y
1
]
\begin{bmatrix} x^{\prime}\\y^{\prime}\\1 \end{bmatrix}= \begin{bmatrix} a&b&t_x\\ c&d&t_y\\ 0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}
⎣⎡x′y′1⎦⎤=⎣⎡ac0bd0txty1⎦⎤⎣⎡xy1⎦⎤
变换操作
-
逆变换(Inverse transformation): M − 1 M^{-1} M−1
-
组合变换(Composite transformation):注意顺序!后执行的变换矩阵放在最前端,也即:变换矩阵是从右往左执行的。
当然,我们也可以提前把多个矩阵相乘,得到一个组合变换矩阵。
-
变换分解(Decomposing complex transforms):
例:如何将物体绕给定的一点 c \bold{c} c旋转?
变换矩阵: T ( c ) ⋅ R ( α ) ⋅ T ( − c ) \bold{T(c)}\cdot\bold{R(\alpha)}\cdot\bold{T(-c)} T(c)⋅R(α)⋅T(−c)