以下应用场景中涉及到的许多操作都可以用线性代数来处理:在 3D 场景中排列物体、用相机观察 3D 物体、在屏幕上成像。而旋转、平移、伸缩、投影等几何变换(geometric transformation)也可以使用矩阵乘法来实现。
2D 线性变换
伸缩(scaling)
沿坐标轴伸缩是最基本的变换,它可以改变向量的长度和方向:
scale(sx,sy)=[sx00sy]
切变(shearing)
水平和垂直切变矩阵:
shear-x(s)=[10s1]shear-y(s)=[1s01]
在物理学中,弹性介质有两种形变:正应变、切应变。
也可以用角度来描述切变的变化程度,沿 x 轴正方向切出 ϕ 角的切变矩阵:
[10tanϕ1]
沿 y 轴正方向切出 ϕ 角的切变矩阵:
[1tanϕ01]
旋转(rotation)
绕原点逆时针转 ϕ 角的旋转矩阵:
rotate(ϕ)=[cosϕsinϕ−sinϕcosϕ]
取 ϕ=π 可知,2D 中心反射就是旋转 180 度。
对旋转矩阵按行、列划分来理解矩阵与向量的乘法可知,旋转矩阵的列向量是基向量旋转后的结果,而行向量在旋转之后会变成基向量。
反射(reflection)
沿坐标轴反射:
reflect-y=[−1001]reflect-x=[100−1]
可以看出,(镜面)反射是一种特殊的伸缩。
变换的合成与分解
连续多次变换可以用矩阵相乘来表示。由于矩阵乘法没有交换律,因此,多次变换的结果与顺序有关。
任何线性变换都可以用若干次旋转和伸缩来表示。
正交矩阵不一定就是旋转。行列式为 1 的正交矩阵才是旋转,而行列式为 −1 的正交矩阵是旋转和反射的复合。
对称矩阵的本征值分解
任何对称矩阵均可分解为:
A=RSRT
通过选择本征向量的方向可以让 ∣R∣=1,此时 R=[v1 v2] 是一个旋转矩阵,S=diag(λ1,λ2) 是一个伸缩矩阵。由上式可知,线性变换 A 可以由以下变换依序合成:
- RT 旋转,将 v1、v2 旋转到 x、y 轴;
- S 伸缩,沿 x、y 轴伸缩 λ1、λ2 倍;
- R 旋转,将 x、y 轴旋转到 v1、v2。
本征值分解将对称矩阵的 3 个自由度转换为 1 个转角和 2 个伸缩倍数。
可以看出,对称矩阵其实就是沿本征向量方向的伸缩变换。反过来,沿顺时针 ϕ 角及其垂直方向伸缩 λ1、λ2 倍的线性变换为:
[cosϕ−sinϕsinϕcosϕ][λ100λ2][cosϕsinϕ−sinϕcosϕ]=[λ1cos2ϕ+λ2sin2ϕ(λ2−λ1)cosϕsinϕ(λ2−λ1)cosϕsinϕλ2cos2ϕ+λ1sin2ϕ]
奇异值分解
任何非对称矩阵均可以分解为:
A=USVT
通过选择奇异向量的方向可以让 ∣U∣=∣V∣=1,此时 U=[u1 u2]、V=[v1 v2] 均为旋转矩阵,伸缩矩阵 S=diag(σ1,σ2) 不再保证非负。而上式表明,线性变换 A 可以由以下变换依序合成:
- VT 旋转,将 v1、v2 旋转到 x、y 轴;
- S 伸缩,沿 x、y 轴伸缩 σ1、σ2 倍;
- U 旋转,将 x、y 轴旋转到 u1、u2。
奇异值分解将非对称矩阵的 4 个自由度转换为 2 个转角和 2 个伸缩倍数。
因此,非对称矩阵就是沿奇异向量方向伸缩,并通过旋转将左、右奇异向量的方向对齐。而反射变换已经被整合到伸缩变换中。
旋转变换的 Paeth 分解
Alan W. Paeth 在 1986 年提出了一种将旋转分解为切变的方法:
[cosϕsinϕ−sinϕcosϕ]=[10−tan2ϕ1][1sinϕ01][10−tan2ϕ1]
容易看出,Paeth 分解适用于任何非 180 度旋转。
这种分解对栅格旋转很有用,因为对于图像而言,切变是一种高效的栅格操作。切变会产生锯齿状图案,但不会产生空隙,比如沿 x 轴的切变:
[10s1][ij]=[i+sjj]
当横坐标中的 sj 四舍五入时,绝对值较小的 s 会产生纵向锯齿(jagginess),绝对值较大的 s 会产生横向锯齿;由于同一行的舍入值相同,因此不会产生空隙。
3D 线性变换
沿坐标轴伸缩:
scale(sx,sy,sz)=sx000sy000sz
绕坐标轴旋转:
⎩⎨⎧rotate-x(ϕ)rotate-y(ϕ)rotate-z(ϕ)=1000cosϕsinϕ0−sinϕcosϕ=cosϕ0−sinϕ010sinϕ0cosϕ=cosϕsinϕ0−sinϕcosϕ0001
轴反射就是绕轴旋转 180 度。
关于原点的中心反射:
reflect-o=−1000−1000−1
根据行列式的正负号可知,3D 中心反射不是旋转。
关于坐标平面的镜面反射:
⎩⎨⎧reflect-yozreflect-zoxreflect-xoy=−100010001=1000−10001=10001000−1
3D 镜面反射可以表示为中心反射和旋转(轴反射)的合成。
沿坐标轴切变:
⎩⎨⎧shear-x(dy,dz)shear-y(dx,dz)shear-z(dx,dy)=100dy10dz01=1dx00100dz1=10dx01dy001
和 2D 线性变换一样,任何 3D 线性变换都可以通过 SVD 分解为“旋转-伸缩-旋转”的依序复合;根据本征值分解可知,3D 对称矩阵就是沿本征向量方向的伸缩变换。
SVD 将 3D 非对称矩阵的 9 个自由度转换为 2 个转轴方向、2 个转角和 3 个伸缩倍数。本征值分解将 3D 对称矩阵的 6 个自由度转换为 1 个转轴方向、1 个转角和 3 个伸缩倍数。
与 2D 情形类似,任何 3D 旋转都可以表示为切变的复合。实际上,Craig M. Wittenbrink 和 Arun K. Somani 在 1993 年使用 Mathematica 给出了行列式为 1 的可逆矩阵的一种分解方式:
a11a21a31a12a22a32a13a23a33=100b1210b13b2311c21c3101c32001100d1210d13d231⎩⎨⎧c21=0, c31=a31, c32=c21a31+a13c,d12=a31a32−c21a31a31+a13c, d23=−a13cc21+a12c,d13=c21a31a12c+c21a13cc21+a12c+a31a33,b23=a31a21−c21, b13=a31a11+a31a13ca31+c21a23c,b12=−c21a13ca31+a13c+c21a23c
这里已经修正了原始论文中的正负号错误。
又因为:
100s1210s13s231=shear-x(s12,s13−s12s23)shear-y(0,s23)1s21s3101s32001=shear-z(s31−s21s32,s32)shear-y(s21,0)
因此,任何 3D 旋转都可以看作沿坐标轴切变的复合。
任意 3D 旋转
由于“旋转矩阵的列向量是基向量旋转后的结果,行向量在旋转之后会变成基向量”,因此绕向量 a 旋转 ϕ 角的旋转矩阵为:
rotate(a,ϕ)=[u v w]cosϕsinϕ0−sinϕcosϕ0001uTvTwT
其中,u、v、w 是一组右手正交基,w 与 a 方向相同。根据上式,可以给出罗德里格斯旋转公式(Rodrigues' rotation formula)的一种证明。由矩阵乘法定义,可以计算:
rotate(a,ϕ)=wwT+cosϕ⋅(uuT+vvT)+sinϕ⋅(vuT−uvT)
分别将矩阵 uuT+vvT 和 vuT−uvT 作用到任意向量上,结合向量点乘和叉乘可以发现,矩阵 uuT+vvT 的作用是计算 w 垂直方向的分量,矩阵 vuT−uvT 的作用就是 w 左叉乘:
uuT+vvTvuT−uvT=I−wwT=w∗=0w3−w2−w30w1w2−w10
其中,w∗ 是向量 w 所对应的叉乘矩阵。由此可得:
rotate(a,ϕ)=wwT+cosϕ⋅(I−wwT)+sinϕ⋅w∗=cosϕ⋅I+(1−cosϕ)wwT+sinϕ⋅w∗
上式就是罗德里格斯旋转公式。
已知一个旋转矩阵 R,计算本征向量可以得到转轴方向 w(相应的本征值为 1),据此对该矩阵做相似变换 [u v w]TR[u v w] 将转轴转向 z 轴,即可得到旋转矩阵的转轴-转角形式。
法向量变换
当整个曲面进行线性变换 M 时,即曲面上每一点做线性变换 M,曲面切向量 t 和法向量 n 服从的变换有所不同。由于切向量是点的偏移向量之差的极限,因此切向量的变换和点的一样 tM=Mt。由于法向量 n 与任意切向量 t 垂直,因此:
0=nTt=nTM−1Mt=[(M−1)Tn]TtM
这里假定线性变换 M 可逆。
根据上式可知,法向量服从变换 nM=(M−1)Tn。如果不关心法向量的长度,可以取:
nM=Nn=m11cm21cm31cm12cm22cm32cm13cm23cm33cn
平移(Translation)和仿射变换(Affine Transformation)
线性变换保持原点不变,因此无法实现平移。将可逆线性变换和平移变换放在一起,以此扩张出来的所有变换均称为仿射变换(affine transformation)。实际上,任一仿射变换均等价于:先做可逆线性变换,再做平移。
不可逆线性变换会产生退化,比如:直线变成点,平面变成直线。
以变换复合为乘法,所有仿射变换可以构成一个群(group),即:
- 仿射变换的复合仍为仿射变换;
- 变换复合满足结合律;
- 恒等变换是仿射变换;
- 仿射变换可逆,且逆变换仍为仿射变换。
此外,由于平移不改变向量,因此向量的仿射变换仍是线性变换,所以仿射变换还具有以下性质:
- 保持平直性(straightness),即直线做仿射变换后仍为直线;
- 保持平行性(parallelism),即平行线做仿射变换后仍平行。
- 保持平行线段的长度之比;
使用齐次坐标(homogeneous coordinate)可以很方便地表示仿射变换:
齐次坐标源于射影几何。在射影几何中,点用齐次坐标表示,即,只关心坐标分量间的比值,不关心具体放大了多少倍。当使用齐次坐标时,射影几何中的直线方程也是齐次的。
在计算机图形学中,一般会对齐次坐标的最后一个分量进行约定。当约定最后一个分量为 1 时,所关心的正是射影空间扩张前的欧式空间上的仿射坐标。
[A0t 1]
其中,A 是可逆线性变换,t 是平移变换的偏移向量。点的齐次坐标形式如下:
[x1]
其中,x 是点的偏移向量。使用齐次坐标,仿射变换对向量的作用可以直接表示为矩阵乘法。
由于平移不改变向量,因此向量不可能采用点的齐次坐标来表示。注意到,向量来自于两点之差,因此可用如下齐次坐标来表示向量:
[v0]
向量的齐次坐标可以借助射影几何中的无穷远点来理解。
其中,v 是向量的非齐次部分,即向量坐标的有效部分。
齐次坐标的最后一个分量可用来分辨点和向量,因此通常需要存储;而齐次坐标下矩阵的最后一行通常不需要存储,只需在矩阵相乘时做特殊处理即可。
齐次坐标是图形硬件中渲染器设计和操作的基础。
实际上,点、向量、仿射变换等元素在变换对点、向量的作用以及变换复合等运算下构成了一个代数系统,齐次坐标就是这个代数系统在高一个维度的线性空间中的表示。
对于齐次坐标,有如下结论:∀x,M[xT,1]T=M′[xT,1]T⇒M=M′
图形学中经常需要一种将矩形 [xl,xh]×[yl,yh] 变成 [xl′,xh′]×[yl′,yh′] 的线性变换,这称为窗口变换(windowing transformation),它的矩阵表示如下:
=100010xl′yl′1xh−xlxh′−xl′000yh−ylyh′−yl′0001100010−xl−yl1xh−xlxh′−xl′000yh−ylyh′−yl′0xh−xlxl′xh−xh′xlyh−ylyl′yh−yh′yl1
将长方体 [xl,xh]×[yl,yh]×[zl,zh] 变换为 [xl′,xh′]×[yl′,yh′]×[zl′,zh′] 的 3D 窗口变换矩阵为:
xh−xlxh′−xl′0000yh−ylyh′−yl′0000zh−zlzh′−zl′0xh−xlxl′xh−xh′xlyh−ylyl′yh−yh′ylzh−zlzl′zh−zh′zl1
只由旋转和平移复合而成的仿射变换称为刚体变换(rigid-body transformation)。也就是说,这里的刚体变换不仅保持距离,而且保持手性。
变换矩阵的逆既可以用代数方式计算,也可以用几何方式计算。SVD 也可用于计算逆矩阵:
M=R1scale(σ1,σ2,σ3)R2⇒M−1=R2Tscale(1/σ1,1/σ2,1/σ3)R1T
坐标变换
坐标系(coordinate system)或坐标标架(coordinate frame)由原点和一组向量基构成。在所有的坐标系中,规范坐标系(canonical coordinate system)最特殊,它用来描述所有其它坐标系,因此也称为全局坐标系(global coordinate system)或世界坐标系(world coordinate system)。规范坐标系是所有其它坐标系的参照系,它的原点和向量基无需显式存储,而其它坐标系的原点和向量基均可以在规范坐标系中表示出来,并在计算机中显式存储。
除非特殊说明,图形学中使用的向量基一般都是正交基。
平面上点 p 在任一坐标系 {e;u,v} 和规范坐标系 {o;x,y} 之间的坐标变换:
pxy=[uxy0vxy0exy1]puv
所涉及的坐标变换矩阵称为 {e;u,v} 标架的标架-规范矩阵(frame-to-canonical matrix),其逆矩阵称为规范-标架矩阵(canonical-to-frame matrix):
puv=[uxy0vxy0exy1]−1pxy=[xuv0yuv0ouv1]pxy
3D 情形类似:
pxyz=[uxyz0vxyz0wxyz0exyz1]puvw