本文为闫令琪老师GAMES101-现代图形学入门基础课程的个人笔记。需要一定的线性代数基础,可以参考网友推荐线性代数的本质.
图形学简单总结一
仿射变换
可能有的同学熟悉,这里的四种操作都是PhotoShop中Ctrl + T 的变形操作。以平面图形(二维)举例,屏幕中的每一个像素点都有一个
(
x
,
y
)
(x,y)
(x,y)坐标的位置信息,以下给就是在变形时计算一点坐标的通用矩阵格式。
[
a
11
a
12
a
21
a
22
]
[
x
y
]
=
[
a
11
x
+
a
12
y
a
21
x
+
a
22
y
]
\begin{bmatrix} a_{11}&a_{12}\\ a_{21}&a_{22} \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}= \begin{bmatrix}a_{11}x+a_{12}y\\ a_{21}x+a_{22}y \end{bmatrix}
[a11a21a12a22][xy]=[a11x+a12ya21x+a22y]
缩放(scaling)
[
s
1
0
0
s
2
]
[
x
y
]
=
[
s
1
x
s
2
y
]
\begin{bmatrix} s_1&0\\ 0&s_2 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}= \begin{bmatrix}s_1x\\ s_2y \end{bmatrix}
[s100s2][xy]=[s1xs2y]
记缩放矩阵
scale
(
s
1
,
s
2
)
=
[
s
1
0
0
s
2
]
\operatorname{scale}(s_1,s_2) = \begin{bmatrix} s_1&0\\ 0&s_2 \end{bmatrix}
scale(s1,s2)=[s100s2]
特征是只有主对角线元素,效果是使原本
(
x
,
y
)
(x,y)
(x,y)坐标各变为
(
s
1
,
s
2
)
(s_1,s_2)
(s1,s2)倍,一些不同的翻译可能是拉伸。
剪切(shearing)
shear-x
(
s
)
=
[
1
s
0
1
]
shear-y
(
s
)
=
[
1
0
s
1
]
\operatorname{shear-x}(s)=\begin{bmatrix}1&s\\0&1\end{bmatrix}\\ \operatorname{shear-y}(s)=\begin{bmatrix}1&0\\s&1\end{bmatrix}
shear-x(s)=[10s1]shear-y(s)=[1s01]
这里记下矩阵格式,具体推导建议看闫老师视频。一种理解是:基的重定义
旋转(rotation)
约定以原点为中心,逆时针旋转
ϕ
\phi
ϕ角度的旋转矩阵
rotate
(
ϕ
)
=
[
cos
ϕ
−
sin
ϕ
sin
ϕ
cos
ϕ
]
\operatorname{rotate}(\phi)=\begin{bmatrix}\cos\phi&-\sin\phi\\\sin\phi&\cos\phi\end{bmatrix}
rotate(ϕ)=[cosϕsinϕ−sinϕcosϕ]
这个矩阵是如何得出的呢?首先设某点
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1)的极坐标表示为
(
r
cos
α
,
r
sin
α
)
(r\cos\alpha,r\sin\alpha)
(rcosα,rsinα)。
其旋转
β
\beta
β度后的新坐标
x
2
=
r
cos
(
α
+
β
)
y
2
=
r
sin
(
α
+
β
)
(1)
\begin{array}{l}x_2=r\cos(\alpha+\beta)\\[2ex]y_2=r\sin(\alpha+\beta)\end{array}\tag1
x2=rcos(α+β)y2=rsin(α+β)(1)
可以进一步分解为
r
cos
(
α
+
β
)
=
r
cos
α
cos
β
−
r
sin
α
sin
β
=
x
1
cos
β
−
y
1
sin
β
r
sin
(
α
+
β
)
=
r
cos
α
sin
β
+
r
sin
α
cos
β
=
x
1
sin
β
+
y
1
cos
β
(2)
\begin{array}{l}r\cos(\alpha+\beta)=r\cos\alpha\cos\beta-r\sin\alpha\sin\beta=x_1\cos\beta-y_1\sin\beta\\[2ex]r\sin(\alpha+\beta)=r\cos\alpha\sin\beta+r\sin\alpha\cos\beta=x_1\sin\beta+y_1\cos\beta\end{array}\tag2
rcos(α+β)=rcosαcosβ−rsinαsinβ=x1cosβ−y1sinβrsin(α+β)=rcosαsinβ+rsinαcosβ=x1sinβ+y1cosβ(2)
将方程
(
1
)
(
2
)
(1)(2)
(1)(2)写成矩阵形式就是
[
cos
ϕ
−
sin
ϕ
sin
ϕ
cos
ϕ
]
[
x
1
y
1
]
=
[
x
2
y
2
]
\begin{bmatrix}\cos\phi&-\sin\phi\\\sin\phi&\cos\phi\end{bmatrix}\begin{bmatrix}x_1\\y_1\end{bmatrix}=\begin{bmatrix}x_2\\y_2\end{bmatrix}
[cosϕsinϕ−sinϕcosϕ][x1y1]=[x2y2]
显而易见,旋转矩阵都是正交矩阵
以上三种变换统称为线性变换,其共同特征是可以写成一个变换矩阵乘坐标矩阵得到新坐标的形式。在某种意义上也可以看作是对单位向量(基向量)的 重定义。
平移(translation)
平移通过矩阵加法实现
[
t
1
t
2
]
+
[
x
1
y
1
]
=
[
x
2
y
2
]
\begin{bmatrix}t_1\\t_2\end{bmatrix}+\begin{bmatrix}x_1\\y_1\end{bmatrix}=\begin{bmatrix}x_2\\y_2\end{bmatrix}
[t1t2]+[x1y1]=[x2y2]
t
1
,
t
2
t_1,t_2
t1,t2就是水平和竖直位移量。
齐次坐标(homogeneous coordinate)
例如,当图形的旋转中心不在坐标原点时,应该先通过平移使旋转中心和原点重合,再进行旋转,最后再平移回起始位置。
这种操作先后经过了矩阵乘法、矩阵加法、矩阵乘法。那么,能否仅通过矩阵乘操作来实现线性变换和平移的统一?
解决方法是在原始二维坐标系基础上增加齐次坐标维度
[
x
y
]
→
[
x
y
1
]
\begin{bmatrix}x\\y\end{bmatrix}\rarr\begin{bmatrix}x\\y\\1\end{bmatrix}
[xy]→
xy1
如上例子点的最后一维记1,而向量的最后一维记0。
此时矩阵加法就可以写成矩阵乘法的格式:
[
1
0
t
1
0
1
t
2
0
0
1
]
[
x
1
y
1
1
]
=
[
x
2
y
2
1
]
\begin{bmatrix}1&0&t_1\\0&1&t_2\\0&0&1\end{bmatrix}\begin{bmatrix}x_1\\y_1\\1\end{bmatrix}=\begin{bmatrix}x_2\\y_2\\1\end{bmatrix}
100010t1t21
x1y11
=
x2y21
进一步,依据矩阵乘法的结合性,可以将左侧各个仿射变换的矩阵优先结合,得到如下格式的矩阵同时表示线性变换和平移。
[
a
11
a
12
t
1
a
21
a
22
t
2
0
0
1
]
[
x
1
y
1
1
]
=
[
a
11
x
1
+
a
12
y
1
+
t
1
a
21
x
1
+
a
22
y
1
+
t
2
1
]
\begin{bmatrix}a_{11}&a_{12}&t_1\\a_{21}&a_{22}&t_2\\0&0&1\end{bmatrix}\begin{bmatrix}x_1\\y_1\\1\end{bmatrix}=\begin{bmatrix} a_{11}x_1+a_{12}y_1+t1\\a_{21 }x_1+a_{22}y_1+t2\\1\end{bmatrix}
a11a210a12a220t1t21
x1y11
=
a11x1+a12y1+t1a21x1+a22y1+t21
注意:这种写法下线性变换总是先于平移进行的。
齐次坐标的单位化
在齐次坐标中形如 [ x y w ] \begin{bmatrix}x\\y\\w\end{bmatrix} xyw 的二维点,可以单位化为 [ x / w y / w 1 ] ( w ≠ 0 ) \begin{bmatrix}x/w\\y/w\\1\end{bmatrix}(w\ne0) x/wy/w1 (w=0)
三维情况下的仿射变换
三位情况下的缩放,剪切,平移仅仅需要增加一个维度即可,但旋转的改变比较大。
对于三维空间的旋转,可以将其分解为绕三个坐标轴进行的独立旋转(pitch)(roll)(yaw),具体过程见罗德里格斯旋转公式。
下面给出三个坐标轴的旋转矩阵(非齐次坐标形式)
rotate-x(ϕ)
[
1
0
0
0
cos
(
ϕ
)
−
sin
(
ϕ
)
0
sin
(
ϕ
)
cos
(
ϕ
)
]
rotate-z(ϕ)
[
cos
(
ϕ
)
−
sin
(
ϕ
)
0
sin
(
ϕ
)
cos
(
ϕ
)
0
0
0
1
]
rotate-y(ϕ)
[
cos
(
ϕ
)
0
sin
(
ϕ
)
0
1
0
−
sin
(
ϕ
)
0
cos
(
ϕ
)
]
\operatorname{rotate-x(\phi)}\begin{bmatrix}1&0&0\\0&\cos(\phi)&-\sin(\phi)\\0&\sin(\phi)&\cos(\phi)\end{bmatrix}\\[2ex]\operatorname{rotate-z(\phi)}\begin{bmatrix}\cos(\phi)&-\sin(\phi)&0\\\sin(\phi)&\cos(\phi)&0\\0&0&1\end{bmatrix}\\[2ex]\operatorname{rotate-y(\phi)}\begin{bmatrix}\cos(\phi)&0&\sin(\phi)\\0&1&0\\-\sin(\phi)&0&\cos(\phi)\end{bmatrix}
rotate-x(ϕ)
1000cos(ϕ)sin(ϕ)0−sin(ϕ)cos(ϕ)
rotate-z(ϕ)
cos(ϕ)sin(ϕ)0−sin(ϕ)cos(ϕ)0001
rotate-y(ϕ)
cos(ϕ)0−sin(ϕ)010sin(ϕ)0cos(ϕ)
可以注意到绕 x , z x,z x,z轴旋转时与二维变化不大,仅仅是引入了新一维度,并通过置1使之不变。但绕 y y y轴旋转时主对角线元素逆号,这是因为 x × y = z , y × z = x , z × x = y = − ( x × z ) x\times y=z,y\times z=x,z\times x=y=-(x\times z) x×y=z,y×z=x,z×x=y=−(x×z)。从 y y y轴正向看去 x → z x\rarr z x→z才是正角度 ϕ \phi ϕ,而 z × x = y z\times x=y z×x=y实际进行的逆时针旋转了 − ϕ -\phi −ϕ度。方向 x y z xyz xyz顺序排,所以要加个负号。
三维空间的旋转矩阵依然是正交矩阵,其可以通过转置求得逆矩阵。也因此,在求绕空间中任意轴
n
⃗
\vec{n}
n的旋转时,也可以通过左乘逆矩阵的方法,将其化作绕单位轴的旋转。