视频&图片来源:【B站】GAMES101-现代计算机图形学入门-闫令琪
目录
1. 线性变换
1.1 缩放
1.1.1 均匀缩放
x
′
=
s
x
,
y
′
=
s
y
x^{'}=sx,y^{'}=sy
x′=sx,y′=sy
矩阵形式表示:
[
x
′
y
′
]
=
[
s
0
0
s
]
[
x
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}s&0\\0&s\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]
[x′y′]=[s00s][xy],其中,
[
s
0
0
s
]
\left[\begin{matrix}s&0\\0&s\\\end{matrix}\right]
[s00s]称为缩放矩阵。
1.1.2 非均匀缩放
矩阵形式表示:
[
x
′
y
′
]
=
[
s
x
0
0
s
y
]
[
x
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}s_x&0\\0&s_y\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]
[x′y′]=[sx00sy][xy]
1.2 反射
1.2.1 水平反射
x
′
=
−
x
,
y
′
=
y
x^{'}=-x,y^{'}=y
x′=−x,y′=y
矩阵形式表示:
[
x
′
y
′
]
=
[
−
1
0
0
1
]
[
x
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}-1&0\\0&1\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]
[x′y′]=[−1001][xy]
1.3 切变
矩阵形式表示:
[
x
′
y
′
]
=
[
1
a
0
1
]
[
x
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}1&a\\0&1\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]
[x′y′]=[10a1][xy]
要点:
- 在 y = 0 y=0 y=0时,水平位移为0;在 y = 1 y=1 y=1时,水平位移为 a a a
- 竖直位移恒为0。
1.4 旋转
旋转矩阵:
R
θ
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
R_\theta=\left[\begin{matrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{matrix}\right]
Rθ=[cosθsinθ−sinθcosθ]
1.5 总结
针对
x
x
x和
y
y
y的变换:
x
′
=
a
x
+
b
y
,
y
′
=
c
x
+
d
y
x^{'}=ax+by,y^{'}=cx+dy
x′=ax+by,y′=cx+dy
写成矩阵形式:
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}a&b\\c&d\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]
[x′y′]=[acbd][xy]
总的来说:
X
′
=
M
X
\Chi^{'}=M\Chi
X′=MX,其中,
M
M
M为变换矩阵
2. 齐次坐标
2.1 非线性变换
2.1.1 引入:一种非线性变换—平移
平移是一种非线性变换:
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
+
[
t
x
t
y
]
\left[\begin{matrix}x^{'}\\y^{'}\end{matrix}\right]=\left[\begin{matrix}a&b\\c&d\\\end{matrix}\right]\left[\begin{matrix}x\\y\end{matrix}\right]+\left[\begin{matrix}t_x\\t_y\end{matrix}\right]
[x′y′]=[acbd][xy]+[txty]
我们希望将平移也能以线性变换的形式进行处理。
处理方法(以2D为例):进行维度上的拓展。
- 点 = ( x , y , 1 ) T =(x,y,1)^T =(x,y,1)T
- 向量 = ( x , y , 0 ) T =(x,y,0)^T =(x,y,0)T
于是,平移变换的矩阵表示可以为: ( x ′ y ′ w ′ ) = ( 1 0 t x 0 1 t y 0 0 1 ) ⋅ ( x y z ) = ( x + t x y + t y 1 ) \left(\begin{matrix}x^{'}\\y^{'}\\w^{'}\end{matrix}\right)=\left(\begin{matrix}1&0&t_x\\0&1&t_y\\0&0&1\end{matrix}\right)\cdot\left(\begin{matrix}x\\y\\z\end{matrix}\right)=\left(\begin{matrix}x+t_x\\y+t_y\\1\end{matrix}\right) ⎝⎛x′y′w′⎠⎞=⎝⎛100010txty1⎠⎞⋅⎝⎛xyz⎠⎞=⎝⎛x+txy+ty1⎠⎞
这样做的依据:
- 向量具有平移不变性,平移方向不变。
- 扩充的定义: ( x y w ) \left(\begin{matrix}x\\y\\w\end{matrix}\right) ⎝⎛xyw⎠⎞是2D点 ( x / w y / w 1 ) \left(\begin{matrix}x/w \\ y/w \\1\end{matrix}\right) ⎝⎛x/wy/w1⎠⎞, w ≠ 0 w\not=0 w=0
辅助理解:当 w w w的坐标为0或者1,有效的操作有:
- 向量+向量=向量
- 点-点=向量
- 点+向量=点
- 点+点=这两个点的中点
2.1.2 仿射变换
一般表示:
(
x
′
y
′
)
=
(
a
b
c
d
)
(
x
y
)
+
(
t
x
t
y
)
\left(\begin{matrix}x^{'}\\y^{'}\end{matrix}\right)=\left(\begin{matrix}a&b\\c&d\\\end{matrix}\right)\left(\begin{matrix}x\\y\end{matrix}\right)+\left(\begin{matrix}t_x\\t_y\end{matrix}\right)
(x′y′)=(acbd)(xy)+(txty)
使用齐次坐标表示:
(
x
′
y
′
1
)
=
(
a
b
t
x
c
d
t
y
0
0
1
)
⋅
(
x
y
1
)
\left(\begin{matrix}x^{'}\\y^{'}\\1\end{matrix}\right)=\left(\begin{matrix}a&b&t_x\\c&d&t_y\\0&0&1\end{matrix}\right)\cdot\left(\begin{matrix}x\\y\\1\end{matrix}\right)
⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⋅⎝⎛xy1⎠⎞
- 缩放矩阵: S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) S(s_x,s_y)=\left(\begin{matrix}s_x&0&0\\0&s_y&0\\0&0&1\end{matrix}\right) S(sx,sy)=⎝⎛sx000sy0001⎠⎞
- 旋转矩阵: R ( α ) = ( cos α − sin α 0 sin α cos α 0 0 0 1 ) R(\alpha)=\left(\begin{matrix}\cos\alpha&-\sin\alpha&0\\\sin\alpha&\cos\alpha&0\\0&0&1\end{matrix}\right) R(α)=⎝⎛cosαsinα0−sinαcosα0001⎠⎞
- 平移矩阵: T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) T(t_x,t_y)=\left(\begin{matrix}1&0&t_x\\0&1&t_y\\0&0&1\end{matrix}\right) T(tx,ty)=⎝⎛100010txty1⎠⎞
2.1.3 变换的组合
- 复杂变换可以通过一系列简单变换得到
- 变换的顺序不同结果不同,从右到左逐个应用(原理:矩阵乘法)
e.g. 先逆时针旋转45°,再水平平移一个单位
T
(
1
,
0
)
⋅
R
45
[
x
y
1
]
=
(
1
0
1
0
1
0
0
0
1
)
(
cos
45
°
−
sin
45
°
0
sin
45
°
cos
45
°
0
0
0
1
)
[
x
y
1
]
T_{(1,0)}\cdot R_{45}\left[\begin{matrix}x\\y\\1\end{matrix}\right]=\left(\begin{matrix}1&0&1\\0&1&0\\0&0&1\end{matrix}\right)\left(\begin{matrix}\cos45\degree&-\sin45\degree&0\\\sin45\degree&\cos45\degree&0\\0&0&1\end{matrix}\right)\left[\begin{matrix}x\\y\\1\end{matrix}\right]
T(1,0)⋅R45⎣⎡xy1⎦⎤=⎝⎛100010101⎠⎞⎝⎛cos45°sin45°0−sin45°cos45°0001⎠⎞⎣⎡xy1⎦⎤
2.2 逆变换
3. 三维变换
- 3D点 = ( x , y , z , 1 ) T =(x,y,z,1)^T =(x,y,z,1)T
- 3D向量 = ( x , y , z , 0 ) T =(x,y,z,0)^T =(x,y,z,0)T
- 扩充的定义: ( x y z w ) \left(\begin{matrix}x\\y\\z\\w\end{matrix}\right) ⎝⎜⎜⎛xyzw⎠⎟⎟⎞是3D点 ( x / w y / w z / w ) \left(\begin{matrix}x/w \\ y/w \\z/w\end{matrix}\right) ⎝⎛x/wy/wz/w⎠⎞, w ≠ 0 w\not=0 w=0
- 齐次坐标变换矩阵: ( x ′ y ′ z ′ 1 ) = ( a b c t x d e f t y g h i t z 0 0 0 1 ) ⋅ ( x y z 1 ) \left(\begin{matrix}x^{'}\\y^{'}\\z^{'}\\1\end{matrix}\right)=\left(\begin{matrix}a&b&c&t_x\\d&e&f&t_y\\g&h&i&t_z\\0&0&0&1\end{matrix}\right)\cdot\left(\begin{matrix}x\\y\\z\\1\end{matrix}\right) ⎝⎜⎜⎛x′y′z′1⎠⎟⎟⎞=⎝⎜⎜⎛adg0beh0cfi0txtytz1⎠⎟⎟⎞⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞