图形学总结一:使用矩阵进行仿射变换

本文为闫令琪老师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)倍,一些不同的翻译可能是拉伸
Alt

剪切(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(ϕ)0sin(ϕ)cos(ϕ) rotate-z(ϕ) cos(ϕ)sin(ϕ)0sin(ϕ)cos(ϕ)0001 rotate-y(ϕ) cos(ϕ)0sin(ϕ)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=zy×z=xz×x=y=(x×z)。从 y y y轴正向看去 x → z x\rarr z xz才是正角度 ϕ \phi ϕ,而 z × x = y z\times x=y z×x=y实际进行的逆时针旋转了 − ϕ -\phi ϕ度。方向 x y z xyz xyz顺序排,所以要加个负号。

三维空间的旋转矩阵依然是正交矩阵,其可以通过转置求得逆矩阵也因此,在求绕空间中任意轴 n ⃗ \vec{n} n 的旋转时,也可以通过左乘逆矩阵的方法,将其化作绕单位轴的旋转。

矩阵分解

特征分解

奇异值分解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值