这一章将主要介绍使用3×3矩阵进行三维孔径啊下的线性变化(Linear Transformations)。线性变化是不包含位移的,包含了位移的变换称为仿射变换(Affine Transformation)。三维中的仿射变换不能使用3×3矩阵来实现。
5.1 旋转
5.1.1 在二维中的旋转
在二维空间中的旋转是基于一个点的。对于基于原点的二维旋转,只有一个变量即旋转角度θ,而且通常而言顺时针旋转为正方向,逆时针旋转为反方向。下图中基向量p和q如何围绕原点旋转,从而产生新的基向量p′和q′。
二维旋转矩阵如下:
R(θ)=[p′q′][cosθ−sinθsinθcosθ]
5.1.2 围绕主轴的三维旋转
在三维中,旋转发生在一个轴而不是一个点上,术语轴(Axis)呈现它更常见的定义:它是一条线。旋转并不一定是基本x,y或z轴之一。以下是基于三个基向量轴的旋转:
Rx(θ)=p′q′r′1000cosθ−sinθ0sinθcosθ
Ry(θ)=p′q′r′cosθ0sinθ010−sinθ0cosθ
Rz(θ)=p′q′r′cosθ−sinθ0sinθcosθ0001
下图依次从左往右是围绕x,y,z轴旋转示意图。
5.1.3 围绕任意轴的三维旋转
我们将θ定义为绕轴的旋转量,轴将由n^定义。我们将需要推导出矩阵R(n^,θ),使得将向量v乘以R(n^,θ)时,得到向量v′是将v旋转角度θ的以下结果:
v′=vR(n^,θ)
推到过程如下:
-
为了计算方便,基本思路是解决垂直于v′的平面中的问题,这是一个更简单的二维问题。所以我们将v拆分为两个向量v∣∣和v⊥,它们分别平行和垂直于n^,使得v=v∣∣+v⊥。通过单独旋转每个分量,可以将向量作为一个整体旋转。换句话来说v′=v∣∣′+v⊥′。由于v∣∣于n^平行,因此它不会受到围绕n^旋转的影响。换句话来说v∣∣′=v∣∣。所以需要做的就是计算v⊥′,然后得到v′=v∣∣+v⊥′,可以构造向量v∣∣、v⊥和中间向量w,如下图所示:
-
向量v∣∣是v的与n^平行的部分(v∣∣是投影到n^上的v的值),则有v∣∣=(v⋅n^)n^。
-
向量v⊥是v的与n^垂直的部分(v⊥是将v投影到垂直于n^的平面上的结果),由于v=v∣∣+v⊥,则有v⊥=v−v∣∣。
-
向量w是为了与向量v⊥构成一个平面。向量w垂直于v∣∣和v⊥,并且长度与v⊥相同。w可以通过围绕n^旋转v⊥为90∘来构造。则有w=n^×v⊥。
-
此时,w和v⊥构成了一个二维平面,使用作v⊥和w为基向量,根据线条旋转(第1.4.4章节中的单位线条旋转)可得:v⊥′=cosθv⊥+sinθw。
-
总结一下就能得出以下向量:
v∣∣v⊥wv⊥′v′=(v⋅n^)n^,=v−v∣∣=v−(v⋅n^)n^,=n^×v⊥=n^×(v−v∣∣)=n^×v−n^×v∣∣=n^×v−0=n^×v,=cosθv⊥+sinθw=cosθ(v−(v⋅n^)n^)+sinθ(n^×v)=v⊥′+v∣∣=cosθ(v−(v⋅n^)n^)+sinθ(n^×v)+(v⋅n^)n^
- 现在已经用v、n^和θ来表示v′,接下来计算转换后的基向量:
- 有p=[100],n^=[nxnynz],则
p′=cosθ(p−(p⋅n^)n^)+sinθ(n^×p)+(p⋅n^)n^=((cosθ(p−(p⋅n^)n^)+sinθ(n^×p)+(p⋅n^)n^)T)T=(cosθ(pT−(pT⋅n^T)n^T)+sinθ(n^T×pT)+(pT⋅n^T)n^T)T=(cosθ(100−100⋅nxnynz)+sinθ(nxnynz×100)+(100⋅nxnynz)nxnynz)T=(cosθ(100−nxnxnynz)+sinθ0nz−ny+nxnxnynz)T=(cosθ1−nx2−nxny−nxnz+sinθ0nz−ny+nx2nxnynxnz)T=(cosθ−nx2cosθ−nxnycosθ−nxnzcosθ+0nzsinθ−nysinθ+nx2nxnynxnz)T=cosθ−nx2cosθ+nx2−nxnycosθ+nzsinθ+nxny−nxnzcosθ−nysinθ+nxnzT=nx2(1−cosθ)+cosθnxny(1−cosθ)+nzsinθnxnz(1−cosθ)+nysinθT=[nx2(1−cosθ)+cosθnxny(1−cosθ)+nzsinθnxnz(1−cosθ)+nysinθ]
- 有q=[010],n^=[nxnynz],则
q′=nxny(1−cosθ)−nzsinθny2(1−cosθ)+cosθnynz(1−cosθ)+nxsinθT
- 有r=[001],n^=[nxnynz],则
r′=nxnz(1−cosθ)+nysinθnynz(1−cosθ)−nxsinθnz2(1−cosθ)+cosθT
- p′、q′和r′实际是行向量,也是基向量,我们用他们构造旋转矩阵可得:
R(n^,θ)=p′q′r′=nx2(1−cosθ)+cosθnxny(1−cosθ)−nzsinθnxnz(1−cosθ)+nysinθnxny(1−cosθ)+nzsinθny2(1−cosθ)+cosθnynz(1−cosθ)−nxsinθnxnz(1−cosθ)+nysinθnynz(1−cosθ)+nxsinθnz2(1−cosθ)+cosθ
5.2 缩放
缩放一个对象,使其按比例增大或缩小一个k的因子,如果所有轴的比例因子相等,则执行均匀缩放(Uniform Scale),反之为不均匀缩放。
- 如果|k|<1,则对象在这个方向上变得“更短”。
- 如果|k|>1,则对象在这个方向上变得“更长”。
- 如果k=0,那么将获得一个正交投影(Orthographic Projection)。
- 如果k<0,那么将获得一个反射的结果。
5.2.1 沿主轴缩放
最简单的缩放操作是沿每个轴应用单独的比例因子。
从直观上看,基向量p和q独立地受相应的比例因子的影响,如下表示:
p′=kxp=kx[10]=[kx0]q′=kyq=ky[01]=[0ky]
用这些基向量构造二维缩放矩阵S(kx,ky),可得围绕主轴缩放的二维矩阵如下表述:
S(kx,ky)=[p′q′]=[kx00ky]
而对于三维来说,添加第三个比例因子kz,得到如下围绕主轴的三维缩放矩阵:
S(kx,ky,kz)=p′q′r′=kx000ky000kz
如果任意向量乘以上述的三维矩阵,那么我们的每个分量都将按适当的比例因子缩放,表述如下:
[xyz]=kx000ky000kz=[kxxkyykzz]
5.2.2 任意方向的缩放
将n^定义为平行于缩放方向的单位向量,给定任意向量v,计算沿着n^缩放后的v′。
推导如下:
- 将v拆分为两个向量v∣∣和v⊥,它们分别平行和垂直于n^,使得v=v∣∣+v⊥。平行部分v∣∣是v在n^上的投影,则有v∣∣=(v⋅n^)n^。由于v⊥垂直于n^ ,它不受缩放操作的影响,因此v′=v∣∣′+v⊥′。
- 由于v∣∣平行于缩放方向,因此v∣∣′=kv∣∣。代入后则有:
vv∣∣v⊥′v∣∣′=v∣∣+v⊥,=(v⋅n^)n^=v⊥=v−v∣∣=v−(v⋅n^)n^,=kv∣∣=k(v⋅n^)n^,
- 则可以求得v′:
v′=v⊥′+v∣∣′=v−(v⋅n^)n^+k(v⋅n^)n^=v+(k−1)(v⋅n^)n^
- 现在我们可以获得缩放矩阵的几个基向量了:
- 有p=[100],n^=[nxnynz],则
p′=p+(k−1)(p⋅n^)n^=((p+(k−1)(p⋅n^)n^)T)T=(pT+(k−1)(pT⋅n^T)n^T)T=(100+(k−1)(100⋅nxnynz)nxnynz)T=(100+(k−1)(nxnxnynz))T=(100+(k−1)nx2(k−1)nxny(k−1)nxnz)T=1+(k−1)nx2(k−1)nxny(k−1)nxnzT=[1+(k−1)nx2(k−1)nxny(k−1)nxnz]
- 有q=[010],n^=[nxnynz],则
q′=(k−1)nxny1+(k−1)ny2(k−1)nynzT
- 有r=[001],n^=[nxnynz],则
r′=(k−1)nxnz(k−1)nynz1+(k−1)nz2T
- p′、q′和r′实际是行向量,也是基向量,我们用他们构造缩放矩阵可得:
S(n^,k)=p′q′r′=1+(k−1)nx2(k−1)nxny(k−1)nxnz(k−1)nxny1+(k−1)ny2(k−1)nynz(k−1)nxnz(k−1)nynz1+(k−1)nz2
5.3 正交投影
术语投影(Projection)指的是任何降维操作。实现投影的一种方法是在一个方向上使用零比例因子。这种所有点被扁平化或投影到垂直轴或平面上。这种类型的投影叫做正交投影(Orthographic Projection),也称为平行投影(Parallel Projection)。
5.3.1 投影到主轴或主平面上
我们通过垂直轴上使用零刻度值投影到主轴或主平面上。
如果投影到xy平面上,那么即沿着z轴缩放到0。即将n^=[001],k=0,代入到缩放矩阵中,则有:
S(n^,k)=1+(k−1)nx2(k−1)nxny(k−1)nxnz(k−1)nxny1+(k−1)ny2(k−1)nynz(k−1)nxnz(k−1)nynz1+(k−1)nz2Pxy=S([001],0)=100010000
同理,可获得:
PxzPyz=S([010],0)=100000001=S([100],0)=000010001
5.3.2 投影到任意线或平面上
如果投影到任意平面上,且向量n^垂直于该平面。那么投影实际上是相当于沿着向量n^进行缩放,且缩放系数k=0。将其代入沿着任意角度进行缩放的矩阵,即
R(n^)=S(n^,0)=1+(0−1)nx2(0−1)nxny(0−1)nxnz(0−1)nxny1+(0−1)ny2(0−1)nynz(0−1)nxnz(0−1)nynz1+(0−1)nz2=1−nx2−nxny−nxnz−nxny1−ny2−nynz−nxnz−nynz1−nz2
5.4 反射
反射(Reflection)也称为镜像(Mirroring),是一种围绕直线(在二维中)或平面(在三维中)“翻转”对象的变换。围绕二维中的轴反射对象如下图所示:
我们可以使用缩放的比例因子为-1来完成反射,即k=−1,则有围绕任意轴的反射矩阵如下所述:
R(n^)=S(n^,−1)=1+(−1−1)nx2(−1−1)nxny(−1−1)nxnz(−1−1)nxny1+(−1−1)ny2(−1−1)nynz(−1−1)nxnz(−1−1)nynz1+(−1−1)nz2=1−2nx2−2nxny−2nxnz−2nxny1−2ny2−2nynz−2nxnz−2nynz1−2nz2
注意:对象智能“反射”一次。再次反射它时,那么对象将被翻转回“右侧朝外”。
5.5 错切
错切/切变(Shearing)是一种"倾斜"坐标空间的变形,它将不均匀地拉伸坐标空间,不保留角度,但面积会保留。错切是一种很少使用的变换,它也被称为倾斜变形(Skew Transform)。基本思路是将一个坐标的倍数加到另一个坐标上。
如x′=x+sy,对应的矩阵为:
Hx(s)=[1s01]
矩阵中的s即对应计算过程0+s×1。从矩阵可以看出基本向量[10]并没有发生变化,基本向量[01]变为了[s1]。
Hx(s)表示x被y轴切变,即x轴的值受y轴的影响,如下图中所示:
同理,如果在三维坐标中,Hxy表示xy平面被z轴坐标影响。所有的三维空间切变矩阵如下所示:
Hxy(s,t)Hxz(s,t)Hyz(s,t)=10s01t001=1s00100t1=100s10t01
5.6 组合变换
因为几个变换矩阵的大小是相同的,所以多个变换矩阵可以被结合在一起。如在物体坐标系中的物体,需要转换到世界坐标系中,此时需要使用模型变换(Model Transform,表示为Mobj→wld),将物体从世界坐标系中转换到摄像机坐标系,需要使用视图变换(View Transform,表示为Mwld→cam)。它们的数学表述如下:
PwldPcam=pobjMobj→wld=pwldMwld→cam=(pobjMobj→wld)Mwld→cam
矩阵的乘法是满足结合律的,所以可以得到:
Pcam=(pobjMobj→wld)Mwld→cam=pobj(Mobj→wldMwld→cam)
可以连接顶点循环外的矩阵,并且在循环内只有一个矩阵乘法(有很多顶点),具体如下:
Mobj→cam=Mobj→wldMwld→camPcam=PobjMobj→cam
5.7 变换的分类
当讨论一般的变换时,可以使用同义词映射(Mapping)或函数(Function)。在一般意义上,映射只是一个接受输入并产生输出的规则。如将F将a映射至b,可以表示为F(a)=b(读作a等于b的F)。
如果映射F(a)是线性的,那么满足:
F(a+b)=F(a)+F(b)且F(ka)=kF(a)
线性变换的定义还有两个含义。
- 映射F(a)=aM(其中,M是任意方形矩阵)是一个线性变换,因为:
F(a+b)=(a+b)M=aM+bM=F(a)+F(b)且F(ka)=(ka)M=k(aM)=kF(a)
- 任何线性变换,输入是零向量,输出必然也是零向量。如果F(0)=a,a=0,则F不能是线性变换,因为F(k0)=a,所以F(k0)=kF(0)。
仿射变换(Affine)是线性变换,然后加上平移。因此,仿射变换集是该组线性变换的超集:任何线性变换都是仿射变换,但并非所有仿射变换都是线性变换。
形如v′=vM+b的任何变换都是仿射变换。
如果一个变换是可逆的,即存在一个相反的变换可以重置之前的变换,表达式如下:
F−1(F(a))=F(F−1(a))=a
因为位移操作必然是可逆的,所以仿射变换是否可逆的关键在于线性变换是否可逆。主要的线性变换,除了投影外都是可逆的,因为投影变换将一个维度的数值变为了零,即一个维度的数据消失了。
找出一个变换的相反操作,相当于找出这个变换矩阵的逆矩阵。如果一个矩阵没有逆矩阵,称这个矩阵为奇异矩阵(或退化矩阵,Singular Matrix)。可逆矩阵的行列式是非零的。
在非奇异矩阵中,零向量是唯一的输入向量,它被映射到输出空间中的两向量,所有其他向量都映射到其他的一些非零向量。而在奇异矩阵中,有一系列的输入向量都会导致输出为零向量,这些输入向量称为矩阵的零空间(Null Space),其被映射到零向量。在投影矩阵中,垂直于投影平面的所有向量都在零空间中,因为这些向量在投影后会变成一个点。
对于一个方阵,如果它的基础向量(因为本书用的是行向量,所以相当于每一行,如果用的是列向量则相当于每一列)是线性相关的,则这个矩阵是歧义矩阵,即不存在逆矩阵。
如何两个向量之间的角度再变换后的大小或方向上没有改变,则该变换就是保角变换。只有位移,旋转,和均匀缩放是保角变换。对于反射变换,虽然角度的绝对值不会发生改变,但是角度的方向发生了改变,因此也不能算是保角变换。所有的保角变换都是仿射变换且都是可逆的。
正交变换可以很容易的求出反变换,所以被使用的频率很高。正交变换保证变换前后,图像的长度,角度的绝对值,面积和体积不会发生改变。只有位移,旋转和反射是正交变换。所有的正交变换都是可逆的,且是仿射变换。
5.7.6 刚体变换(Rigid body Transformations)
刚体变换是指改变对象的位置和方向但不改变其形状的变换。保留所有角度、长度、面积和体积。平移和旋转都是刚体变换,但是反射不被认为是严格的刚体变换。
刚体变换也称为合适变换(Proper Transformation)。所有刚体变换都是正交变换、保教变换、可逆变换和仿射变换。
任何刚体变换矩阵的行列式均为1。
5.7.7 变换类型总结
引用:
- Dunn, F. and Parberry, I. (2011). 3D math primer for graphics and game development 2nd.