计算机图形学中的矩阵变化(games101)
1. 二维矩阵线性变换
从二维矩阵变化开始谈起
缩放矩阵(
S
c
a
l
e
M
a
t
r
i
x
Scale Matrix
ScaleMatrix)
[
x
′
y
′
]
=
[
s
0
0
s
]
[
x
y
]
\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}s & 0 \\ 0 & s\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right]
[x′y′]=[s00s][xy]
切变矩阵(
S
h
e
a
r
M
a
t
r
i
x
Shear Matrix
ShearMatrix)
[
x
′
y
′
]
=
[
1
a
0
1
]
[
x
y
]
\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}1 & a \\ 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right]
[x′y′]=[10a1][xy]
旋转矩阵(
R
o
t
a
t
i
o
n
M
a
t
r
i
x
Rotation Matrix
RotationMatrix)
R
θ
=
[
cos
θ
−
sin
θ
sin
θ
cos
θ
]
\mathbf{R}_{\theta}=\left[\begin{array}{cc}\cos \theta & -\sin \theta \\ \sin \theta & \cos \theta\end{array}\right]
Rθ=[cosθsinθ−sinθcosθ]
以上变换都能写成这种形式
x
′
=
a
x
+
b
y
y
′
=
c
x
+
d
y
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
x
′
=
M
x
\begin{aligned} x^{\prime} &=a x+b y \\ y^{\prime} &=c x+d y \\\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right] &=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right] \\ \mathbf{x}^{\prime} &=\mathbf{M} \mathbf{x} \end{aligned}
x′y′[x′y′]x′=ax+by=cx+dy=[acbd][xy]=Mx
称为线性变换
2. 二维矩阵平移变换
这边需要考虑为什么要引入齐次坐标,答案是因为平移变换,目的很明确想要统一坐标转换矩阵
平移矩阵表现形式为
[
x
′
y
′
]
=
[
a
b
c
d
]
[
x
y
]
+
[
t
x
t
y
]
\left[\begin{array}{l}x^{\prime} \\ y^{\prime}\end{array}\right]=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]\left[\begin{array}{l}x \\ y\end{array}\right]+\left[\begin{array}{c}t_{x} \\ t_{y}\end{array}\right]
[x′y′]=[acbd][xy]+[txty]
在做平移矩阵变换时二维矩阵没办法直接满足,平移矩阵前半部分表示为线性变换,后半部分表示为平移变换。
3. 其次坐标表示下的二维变换
为了统一变换,使用齐次坐标,得到平移矩阵为:
(
x
′
y
′
w
′
)
=
(
1
0
t
x
0
1
t
y
0
0
1
)
⋅
(
x
y
1
)
=
(
x
+
t
x
y
+
t
y
1
)
\left(\begin{array}{c}x^{\prime} \\ y^{\prime} \\ w^{\prime}\end{array}\right)=\left(\begin{array}{ccc}1 & 0 & t_{x} \\ 0 & 1 & t_{y} \\ 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right)=\left(\begin{array}{c}x+t_{x} \\ y+t_{y} \\ 1\end{array}\right)
⎝⎛x′y′w′⎠⎞=⎝⎛100010txty1⎠⎞⋅⎝⎛xy1⎠⎞=⎝⎛x+txy+ty1⎠⎞
在统一一个名词仿射变换(affine)=线性变换+平移变换,使用齐次坐标仿射变换均可以用如下矩阵表示
(
x
′
y
′
1
)
=
(
a
b
t
x
c
d
t
y
0
0
1
)
⋅
(
x
y
1
)
\left(\begin{array}{l}x^{\prime} \\ y^{\prime} \\ 1\end{array}\right)=\left(\begin{array}{ccc}a & b & t_{x} \\ c & d & t_{y} \\ 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ 1\end{array}\right)
⎝⎛x′y′1⎠⎞=⎝⎛ac0bd0txty1⎠⎞⋅⎝⎛xy1⎠⎞
齐次坐标表示的缩放矩阵
S
(
s
x
,
s
y
)
=
(
s
x
0
0
0
s
y
0
0
0
1
)
\mathbf{S}\left(s_{x}, s_{y}\right)=\left(\begin{array}{ccc}s_{x} & 0 & 0 \\ 0 & s_{y} & 0 \\ 0 & 0 & 1\end{array}\right)
S(sx,sy)=⎝⎛sx000sy0001⎠⎞
齐次坐标表示的旋转矩阵
R
(
α
)
=
(
cos
α
−
sin
α
0
sin
α
cos
α
0
0
0
1
)
\mathbf{R}(\alpha)=\left(\begin{array}{ccc}\cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1\end{array}\right)
R(α)=⎝⎛cosαsinα0−sinαcosα0001⎠⎞
齐次坐标表示的平移矩阵
T
(
t
x
,
t
y
)
=
(
1
0
t
x
0
1
t
y
0
0
1
)
\mathbf{T}\left(t_{x}, t_{y}\right)=\left(\begin{array}{ccc}1 & 0 & t_{x} \\ 0 & 1 & t_{y} \\ 0 & 0 & 1\end{array}\right)
T(tx,ty)=⎝⎛100010txty1⎠⎞
矩阵的逆变换
M
−
1
\mathbf{M}^{-1}
M−1
先旋转(默认绕着原点旋转)然后平移
T
(
1
,
0
)
⋅
R
45
[
x
y
1
]
=
[
1
0
1
0
1
0
0
0
1
]
[
cos
4
5
∘
−
sin
4
5
∘
0
sin
4
5
∘
cos
4
5
∘
0
0
0
1
]
[
x
y
1
]
T_{(1,0)} \cdot R_{45}\left[\begin{array}{l}x \\ y \\ 1\end{array}\right]=\left[\begin{array}{lll}1 & 0 & 1 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{ccc}\cos 45^{\circ} & -\sin 45^{\circ} & 0 \\ \sin 45^{\circ} & \cos 45^{\circ} & 0 \\ 0 & 0 & 1\end{array}\right]\left[\begin{array}{l}x \\ y \\ 1\end{array}\right]
T(1,0)⋅R45⎣⎡xy1⎦⎤=⎣⎡100010101⎦⎤⎣⎡cos45∘sin45∘0−sin45∘cos45∘0001⎦⎤⎣⎡xy1⎦⎤
4. 其次坐标表示下的三维变换
同理对于三维的 变换可以用4*4的其次坐标来表示:
(
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{array}{l}x^{\prime} \\ y^{\prime} \\ z^{\prime} \\ 1\end{array}\right)=\left(\begin{array}{llll}a & b & c & t_{x} \\ d & e & f & t_{y} \\ g & h & i & t_{z} \\ 0 & 0 & 0 & 1\end{array}\right) \cdot\left(\begin{array}{l}x \\ y \\ z \\ 1\end{array}\right)
⎝⎜⎜⎛x′y′z′1⎠⎟⎟⎞=⎝⎜⎜⎛adg0beh0cfi0txtytz1⎠⎟⎟⎞⋅⎝⎜⎜⎛xyz1⎠⎟⎟⎞
同样还是线性变换先做(旋转缩放)在进行平移操作