《Fundamentals of Computer Graphics》第五版 第七章 变换矩阵

426 阅读5分钟

以下应用场景中涉及到的许多操作都可以用线性代数来处理:在 3D 场景中排列物体、用相机观察 3D 物体、在屏幕上成像。而旋转、平移、伸缩、投影等几何变换(geometric transformation)也可以使用矩阵乘法来实现。

2D 线性变换

伸缩(scaling)

沿坐标轴伸缩是最基本的变换,它可以改变向量的长度和方向:

scale(sx,sy)=[sx00sy]\mathrm{scale}(s_{x}, s_{y}) = \begin{bmatrix} s_{x} & 0 \\ 0 & s_{y} \end{bmatrix}

切变(shearing)

水平和垂直切变矩阵:

shear-x(s)=[1s01]shear-y(s)=[10s1]\text{shear-x}(s) = \begin{bmatrix} 1 & s \\ 0 & 1 \end{bmatrix} \quad \text{shear-y}(s) = \begin{bmatrix} 1 & 0 \\ s & 1 \end{bmatrix}

在物理学中,弹性介质有两种形变:正应变、切应变。

也可以用角度来描述切变的变化程度,沿 x 轴正方向切出 ϕ\phi 角的切变矩阵:

[1tanϕ01]\begin{bmatrix} 1 & \tan\phi \\ 0 & 1 \end{bmatrix}

沿 y 轴正方向切出 ϕ\phi 角的切变矩阵:

[10tanϕ1]\begin{bmatrix} 1 & 0 \\ \tan\phi & 1 \end{bmatrix}

旋转(rotation)

绕原点逆时针转 ϕ\phi 角的旋转矩阵:

rotate(ϕ)=[cosϕsinϕsinϕcosϕ]\mathrm{rotate}(\phi) = \begin{bmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{bmatrix}

ϕ=π\phi=\pi 可知,2D 中心反射就是旋转 180 度。

对旋转矩阵按行、列划分来理解矩阵与向量的乘法可知,旋转矩阵的列向量是基向量旋转后的结果,而行向量在旋转之后会变成基向量。

反射(reflection)

沿坐标轴反射:

reflect-y=[1001]reflect-x=[1001]\text{reflect-y} = \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \quad \text{reflect-x} = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}

可以看出,(镜面)反射是一种特殊的伸缩。

变换的合成与分解

连续多次变换可以用矩阵相乘来表示。由于矩阵乘法没有交换律,因此,多次变换的结果与顺序有关。

任何线性变换都可以用若干次旋转和伸缩来表示

正交矩阵不一定就是旋转。行列式为 11 的正交矩阵才是旋转,而行列式为 1-1 的正交矩阵是旋转和反射的复合。

对称矩阵的本征值分解

任何对称矩阵均可分解为:

A=RSRT\mathbf{A} = \mathbf{R}\mathbf{S}\mathbf{R}^{T}

通过选择本征向量的方向可以让 R=1|\mathbf{R}|=1,此时 R=[v1 v2]\mathbf{R}=[\vec{v}_{1}\ \vec{v}_{2}] 是一个旋转矩阵,S=diag(λ1,λ2)\mathbf{S}=\mathrm{diag}(\lambda_{1},\lambda_{2}) 是一个伸缩矩阵。由上式可知,线性变换 A\mathbf{A} 可以由以下变换依序合成:

  1. RT\mathbf{R}^{T} 旋转,将 v1\vec{v}_{1}v2\vec{v}_{2} 旋转到 x、y 轴;
  2. S\mathbf{S} 伸缩,沿 x、y 轴伸缩 λ1\lambda_{1}λ2\lambda_{2} 倍;
  3. R\mathbf{R} 旋转,将 x、y 轴旋转到 v1\vec{v}_{1}v2\vec{v}_{2}

本征值分解将对称矩阵的 3 个自由度转换为 1 个转角和 2 个伸缩倍数。

可以看出,对称矩阵其实就是沿本征向量方向的伸缩变换。反过来,沿顺时针 ϕ\phi 角及其垂直方向伸缩 λ1\lambda_{1}λ2\lambda_{2} 倍的线性变换为:

[cosϕsinϕsinϕcosϕ][λ100λ2][cosϕsinϕsinϕcosϕ]=[λ1cos2ϕ+λ2sin2ϕ(λ2λ1)cosϕsinϕ(λ2λ1)cosϕsinϕλ2cos2ϕ+λ1sin2ϕ]\begin{aligned} & \begin{bmatrix} \cos\phi & \sin\phi \\ -\sin\phi & \cos\phi \end{bmatrix} \begin{bmatrix} \lambda_{1} & 0 \\ 0 & \lambda_{2} \end{bmatrix} \begin{bmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{bmatrix} \\ &\qquad\qquad= \begin{bmatrix} \lambda_{1}\cos^{2}\phi + \lambda_{2}\sin^{2}\phi & (\lambda_{2} - \lambda_{1})\cos\phi\sin\phi \\ (\lambda_{2} - \lambda_{1})\cos\phi\sin\phi & \lambda_{2}\cos^{2}\phi + \lambda_{1}\sin^{2}\phi \end{bmatrix} \end{aligned}

奇异值分解

任何非对称矩阵均可以分解为:

A=USVT\mathbf{A} = \mathbf{U}\mathbf{S}\mathbf{V}^{T}

通过选择奇异向量的方向可以让 U=V=1|\mathbf{U}|=|\mathbf{V}|=1,此时 U=[u1 u2]\mathbf{U}=[\vec{u}_{1}\ \vec{u}_{2}]V=[v1 v2]\mathbf{V}=[\vec{v}_{1}\ \vec{v}_{2}] 均为旋转矩阵,伸缩矩阵 S=diag(σ1,σ2)\mathbf{S}=\mathrm{diag}(\sigma_{1},\sigma_{2}) 不再保证非负。而上式表明,线性变换 A\mathbf{A} 可以由以下变换依序合成:

  1. VT\mathbf{V}^{T} 旋转,将 v1\vec{v}_{1}v2\vec{v}_{2} 旋转到 x、y 轴;
  2. S\mathbf{S} 伸缩,沿 x、y 轴伸缩 σ1\sigma_{1}σ2\sigma_{2} 倍;
  3. U\mathbf{U} 旋转,将 x、y 轴旋转到 u1\vec{u}_{1}u2\vec{u}_{2}

奇异值分解将非对称矩阵的 4 个自由度转换为 2 个转角和 2 个伸缩倍数。

因此,非对称矩阵就是沿奇异向量方向伸缩,并通过旋转将左、右奇异向量的方向对齐。而反射变换已经被整合到伸缩变换中。

旋转变换的 Paeth 分解

Alan W. Paeth 在 1986 年提出了一种将旋转分解为切变的方法:

[cosϕsinϕsinϕcosϕ]=[1tanϕ201][10sinϕ1][1tanϕ201]\begin{bmatrix} \cos\phi & -\sin\phi \\ \sin\phi & \cos\phi \end{bmatrix} = \begin{bmatrix} 1 & -\tan\frac{\phi}{2} \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ \sin\phi & 1 \end{bmatrix} \begin{bmatrix} 1 & -\tan\frac{\phi}{2} \\ 0 & 1 \end{bmatrix}

容易看出,Paeth 分解适用于任何非 180 度旋转。

这种分解对栅格旋转很有用,因为对于图像而言,切变是一种高效的栅格操作。切变会产生锯齿状图案,但不会产生空隙,比如沿 x 轴的切变:

[1s01][ij]=[i+sjj]\begin{bmatrix} 1 & s \\ 0 & 1 \end{bmatrix} \begin{bmatrix} i \\ j \end{bmatrix} = \begin{bmatrix} i + sj \\ j \end{bmatrix}

当横坐标中的 sjsj 四舍五入时,绝对值较小的 ss 会产生纵向锯齿(jagginess),绝对值较大的 ss 会产生横向锯齿;由于同一行的舍入值相同,因此不会产生空隙。

3D 线性变换

沿坐标轴伸缩:

scale(sx,sy,sz)=[sx000sy000sz]\mathrm{scale}(s_{x}, s_{y}, s_{z}) = \begin{bmatrix} s_{x} & 0 & 0 \\ 0 & s_{y} & 0 \\ 0 & 0 & s_{z} \end{bmatrix}

绕坐标轴旋转:

{rotate-x(ϕ)=[1000cosϕsinϕ0sinϕcosϕ]rotate-y(ϕ)=[cosϕ0sinϕ010sinϕ0cosϕ]rotate-z(ϕ)=[cosϕsinϕ0sinϕcosϕ0001]\left\{ \begin{aligned} \text{rotate-x}(\phi) &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos\phi & -\sin\phi \\ 0 & \sin\phi & \cos\phi \end{bmatrix} \\ \text{rotate-y}(\phi) &= \begin{bmatrix} \cos\phi & 0 & \sin\phi \\ 0 & 1 & 0 \\ -\sin\phi & 0 & \cos\phi \end{bmatrix} \\ \text{rotate-z}(\phi) &= \begin{bmatrix} \cos\phi & -\sin\phi & 0 \\ \sin\phi & \cos\phi & 0 \\ 0 & 0 & 1 \end{bmatrix} \end{aligned} \right.

轴反射就是绕轴旋转 180 度。

关于原点的中心反射:

reflect-o=[100010001]\text{reflect-o} = \begin{bmatrix} -1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & -1 \end{bmatrix}

根据行列式的正负号可知,3D 中心反射不是旋转。

关于坐标平面的镜面反射:

{reflect-yoz=[100010001]reflect-zox=[100010001]reflect-xoy=[100010001]\left\{ \begin{aligned} \text{reflect-yoz} &= \begin{bmatrix} -1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \\ \text{reflect-zox} &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & -1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \\ \text{reflect-xoy} &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} \end{aligned} \right.

3D 镜面反射可以表示为中心反射和旋转(轴反射)的合成。

沿坐标轴切变:

{shear-x(dy,dz)=[1dydz010001]shear-y(dx,dz)=[100dx1dz001]shear-z(dx,dy)=[100010dxdy1]\left\{ \begin{aligned} \text{shear-x}(d_{y}, d_{z}) &= \begin{bmatrix} 1 & d_{y} & d_{z} \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \\ \text{shear-y}(d_{x}, d_{z}) &= \begin{bmatrix} 1 & 0 & 0 \\ d_{x} & 1 & d_{z} \\ 0 & 0 & 1 \end{bmatrix} \\ \text{shear-z}(d_{x}, d_{y}) &= \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ d_{x} & d_{y} & 1 \end{bmatrix} \end{aligned} \right.

和 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 给出了行列式为 11 的可逆矩阵的一种分解方式:

[a11a12a13a21a22a23a31a32a33]=[1b12b1301b23001][100c2110c31c321][1d12d1301d23001]{c210, c31=a31, c32=a31+a13cc21,d12=a32a31a31+a13cc21a31, d23=c21+a12ca13c,d13=a12cc21a31+c21+a12cc21a13c+a33a31,b23=a21c21a31, b13=a11a31+a31+c21a23ca31a13c,b12=a31+a13c+c21a23cc21a13c\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} = \begin{bmatrix} 1 & b_{12} & b_{13} \\ 0 & 1 & b_{23} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ c_{21} & 1 & 0 \\ c_{31} & c_{32} & 1 \end{bmatrix} \begin{bmatrix} 1 & d_{12} & d_{13} \\ 0 & 1 & d_{23} \\ 0 & 0 & 1 \end{bmatrix} \\ \left\{ \begin{aligned} &c_{21}\neq 0,\ c_{31} = a_{31},\ c_{32} = \frac{a_{31} + a_{13}^{c}}{c_{21}}, \\ &d_{12} = \frac{a_{32}}{a_{31}} - \frac{a_{31} + a_{13}^{c}}{c_{21}a_{31}},\ d_{23} = -\frac{c_{21} + a_{12}^{c}}{a_{13}^{c}}, \\ &d_{13} = \frac{a_{12}^{c}}{c_{21}a_{31}} + \frac{c_{21} + a_{12}^{c}}{c_{21}a_{13}^{c}} + \frac{a_{33}}{a_{31}}, \\ &b_{23} = \frac{a_{21} - c_{21}}{a_{31}},\ b_{13} = \frac{a_{11}}{a_{31}} + \frac{a_{31} + c_{21}a_{23}^{c}}{a_{31}a_{13}^{c}}, \\ &b_{12} = - \frac{a_{31} + a_{13}^{c} + c_{21}a_{23}^{c}}{c_{21}a_{13}^{c}} \end{aligned} \right.

这里已经修正了原始论文中的正负号错误。

又因为:

[1s12s1301s23001]=shear-x(s12,s13s12s23)shear-y(0,s23)[100s2110s31s321]=shear-z(s31s21s32,s32)shear-y(s21,0)\begin{aligned} &\begin{bmatrix} 1 & s_{12} & s_{13} \\ 0 & 1 & s_{23} \\ 0 & 0 & 1 \end{bmatrix} = \text{shear-x}(s_{12}, s_{13} - s_{12}s_{23})\text{shear-y}(0, s_{23}) \\ &\begin{bmatrix} 1 & 0 & 0 \\ s_{21} & 1 & 0 \\ s_{31} & s_{32} & 1 \end{bmatrix} = \text{shear-z}(s_{31} - s_{21}s_{32}, s_{32})\text{shear-y}(s_{21}, 0) \end{aligned}

因此,任何 3D 旋转都可以看作沿坐标轴切变的复合。

任意 3D 旋转

由于“旋转矩阵的列向量是基向量旋转后的结果,行向量在旋转之后会变成基向量”,因此绕向量 a\vec{a} 旋转 ϕ\phi 角的旋转矩阵为:

rotate(a,ϕ)=[u v w][cosϕsinϕ0sinϕcosϕ0001][uTvTwT]\mathrm{rotate}(\vec{a}, \phi) = [\vec{u}\ \vec{v}\ \vec{w}] \begin{bmatrix} \cos\phi & -\sin\phi & 0 \\ \sin\phi & \cos\phi & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \vec{u}^{T} \\ \vec{v}^{T} \\ \vec{w}^{T} \end{bmatrix}

其中,u\vec{u}v\vec{v}w\vec{w} 是一组右手正交基,w\vec{w}a\vec{a} 方向相同。根据上式,可以给出罗德里格斯旋转公式(Rodrigues' rotation formula)的一种证明。由矩阵乘法定义,可以计算:

rotate(a,ϕ)=wwT+cosϕ(uuT+vvT)+sinϕ(vuTuvT)\mathrm{rotate}(\vec{a}, \phi) = \vec{w}\vec{w}^{T} + \cos\phi\cdot(\vec{u}\vec{u}^{T} + \vec{v}\vec{v}^{T}) + \sin\phi\cdot(\vec{v}\vec{u}^{T} - \vec{u}\vec{v}^{T})

分别将矩阵 uuT+vvT\vec{u}\vec{u}^{T}+\vec{v}\vec{v}^{T}vuTuvT\vec{v}\vec{u}^{T}-\vec{u}\vec{v}^{T} 作用到任意向量上,结合向量点乘和叉乘可以发现,矩阵 uuT+vvT\vec{u}\vec{u}^{T}+\vec{v}\vec{v}^{T} 的作用是计算 w\vec{w} 垂直方向的分量,矩阵 vuTuvT\vec{v}\vec{u}^{T}-\vec{u}\vec{v}^{T} 的作用就是 w\vec{w} 左叉乘:

uuT+vvT=IwwTvuTuvT=w=[0w3w2w30w1w2w10]\begin{aligned} \vec{u}\vec{u}^{T}+\vec{v}\vec{v}^{T} &= \mathbf{I} - \vec{w}\vec{w}^{T} \\ \vec{v}\vec{u}^{T}-\vec{u}\vec{v}^{T} &= \mathbf{w^{*}} = \begin{bmatrix} 0 & -w_{3} & w_{2} \\ w_{3} & 0 & -w_{1} \\ -w_{2} & w_{1} & 0 \end{bmatrix} \\ \end{aligned}

其中,w\mathbf{w^{*}} 是向量 w\vec{w} 所对应的叉乘矩阵。由此可得:

rotate(a,ϕ)=wwT+cosϕ(IwwT)+sinϕw=cosϕI+(1cosϕ)wwT+sinϕw\begin{aligned} \mathrm{rotate}(\vec{a}, \phi) &= \vec{w}\vec{w}^{T} + \cos\phi\cdot(\mathbf{I} - \vec{w}\vec{w}^{T}) + \sin\phi\cdot\mathbf{w^{*}} \\ &= \cos\phi\cdot\mathbf{I} + (1 - \cos\phi)\vec{w}\vec{w}^{T} + \sin\phi\cdot\mathbf{w^{*}} \end{aligned}

上式就是罗德里格斯旋转公式

已知一个旋转矩阵 R\mathbf{R},计算本征向量可以得到转轴方向 w\vec{w}(相应的本征值为 11),据此对该矩阵做相似变换 [u v w]TR[u v w][\vec{u}\ \vec{v}\ \vec{w}]^{T}\mathbf{R}[\vec{u}\ \vec{v}\ \vec{w}] 将转轴转向 z 轴,即可得到旋转矩阵的转轴-转角形式。

法向量变换

当整个曲面进行线性变换 M\mathbf{M} 时,即曲面上每一点做线性变换 M\mathbf{M},曲面切向量 t\vec{t} 和法向量 n\vec{n} 服从的变换有所不同。由于切向量是点的偏移向量之差的极限,因此切向量的变换和点的一样 tM=Mt\vec{t}_{\mathbf{M}}=\mathbf{M}\vec{t}。由于法向量 n\vec{n} 与任意切向量 t\vec{t} 垂直,因此:

0=nTt=nTM1Mt=[(M1)Tn]TtM0 = \vec{n}^{T}\vec{t} = \vec{n}^{T}\mathbf{M}^{-1}\mathbf{M}\vec{t} = [(\mathbf{M}^{-1})^{T}\vec{n}]^{T}\vec{t}_{\mathbf{M}}

这里假定线性变换 M\mathbf{M} 可逆。

根据上式可知,法向量服从变换 nM=(M1)Tn\vec{n}_{\mathbf{M}}=(\mathbf{M}^{-1})^{T}\vec{n}。如果不关心法向量的长度,可以取:

nM=Nn=[m11cm12cm13cm21cm22cm23cm31cm32cm33c]n\vec{n}_{\mathbf{M}} = \mathbf{N}\vec{n} = \begin{bmatrix} m_{11}^{c} & m_{12}^{c} & m_{13}^{c} \\ m_{21}^{c} & m_{22}^{c} & m_{23}^{c} \\ m_{31}^{c} & m_{32}^{c} & m_{33}^{c} \end{bmatrix} \vec{n}

平移(Translation)和仿射变换(Affine Transformation)

线性变换保持原点不变,因此无法实现平移。将可逆线性变换和平移变换放在一起,以此扩张出来的所有变换均称为仿射变换(affine transformation)。实际上,任一仿射变换均等价于:先做可逆线性变换,再做平移

不可逆线性变换会产生退化,比如:直线变成点,平面变成直线。

以变换复合为乘法,所有仿射变换可以构成一个(group),即:

  1. 仿射变换的复合仍为仿射变换;
  2. 变换复合满足结合律;
  3. 恒等变换是仿射变换;
  4. 仿射变换可逆,且逆变换仍为仿射变换。

此外,由于平移不改变向量,因此向量的仿射变换仍是线性变换,所以仿射变换还具有以下性质:

  1. 保持平直性(straightness),即直线做仿射变换后仍为直线;
  2. 保持平行性(parallelism),即平行线做仿射变换后仍平行。
  3. 保持平行线段的长度之比;

使用齐次坐标(homogeneous coordinate)可以很方便地表示仿射变换:

齐次坐标源于射影几何。在射影几何中,点用齐次坐标表示,即,只关心坐标分量间的比值,不关心具体放大了多少倍。当使用齐次坐标时,射影几何中的直线方程也是齐次的。

在计算机图形学中,一般会对齐次坐标的最后一个分量进行约定。当约定最后一个分量为 11 时,所关心的正是射影空间扩张前的欧式空间上的仿射坐标。

[At 01]\begin{bmatrix} \mathbf{A} & \vec{t}\ \\ \mathbf{0} & 1 \end{bmatrix}

其中,A\mathbf{A} 是可逆线性变换,t\vec{t} 是平移变换的偏移向量。点的齐次坐标形式如下:

[x1]\begin{bmatrix} \vec{x} \\ 1 \end{bmatrix}

其中,x\vec{x} 是点的偏移向量。使用齐次坐标,仿射变换对向量的作用可以直接表示为矩阵乘法。

由于平移不改变向量,因此向量不可能采用点的齐次坐标来表示。注意到,向量来自于两点之差,因此可用如下齐次坐标来表示向量:

[v0]\begin{bmatrix} \vec{v} \\ 0 \end{bmatrix}

向量的齐次坐标可以借助射影几何中的无穷远点来理解。

其中,v\vec{v} 是向量的非齐次部分,即向量坐标的有效部分。

齐次坐标的最后一个分量可用来分辨点和向量,因此通常需要存储;而齐次坐标下矩阵的最后一行通常不需要存储,只需在矩阵相乘时做特殊处理即可。

齐次坐标是图形硬件中渲染器设计和操作的基础。

实际上,点、向量、仿射变换等元素在变换对点、向量的作用以及变换复合等运算下构成了一个代数系统,齐次坐标就是这个代数系统在高一个维度的线性空间中的表示。

对于齐次坐标,有如下结论:x,M[xT,1]T=M[xT,1]TM=M\forall\vec{x},\mathbf{M}[\vec{x}^{T},1]^{T}=\mathbf{M'}[\vec{x}^{T},1]^{T}\Rightarrow\mathbf{M}=\mathbf{M'}

图形学中经常需要一种将矩形 [xl,xh]×[yl,yh][x_{l},x_{h}]\times[y_{l},y_{h}] 变成 [xl,xh]×[yl,yh][x_{l}',x_{h}']\times[y_{l}',y_{h}'] 的线性变换,这称为窗口变换(windowing transformation),它的矩阵表示如下:

[10xl01yl001][xhxlxhxl000yhylyhyl0001][10xl01yl001]=[xhxlxhxl0xlxhxhxlxhxl0yhylyhylylyhyhylyhyl001]\begin{aligned} &\begin{bmatrix} 1 & 0 & x_{l}' \\ 0 & 1 & y_{l}' \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \frac{x_{h}' - x_{l}'}{x_{h} - x_{l}} & 0 & 0 \\ 0 & \frac{y_{h}' - y_{l}'}{y_{h} - y_{l}} & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & -x_{l} \\ 0 & 1 & -y_{l} \\ 0 & 0 & 1 \end{bmatrix} \\ =& \begin{bmatrix} \frac{x_{h}' - x_{l}'}{x_{h} - x_{l}} & 0 & \frac{x_{l}'x_{h} - x_{h}'x_{l}}{x_{h} - x_{l}} \\ 0 & \frac{y_{h}' - y_{l}'}{y_{h} - y_{l}} & \frac{y_{l}'y_{h} - y_{h}'y_{l}}{y_{h} - y_{l}} \\ 0 & 0 & 1 \end{bmatrix} \end{aligned}

将长方体 [xl,xh]×[yl,yh]×[zl,zh][x_{l},x_{h}]\times[y_{l},y_{h}]\times[z_{l},z_{h}] 变换为 [xl,xh]×[yl,yh]×[zl,zh][x_{l}',x_{h}']\times[y_{l}',y_{h}']\times[z_{l}',z_{h}'] 的 3D 窗口变换矩阵为:

[xhxlxhxl00xlxhxhxlxhxl0yhylyhyl0ylyhyhylyhyl00zhzlzhzlzlzhzhzlzhzl0001]\begin{bmatrix} \frac{x_{h}' - x_{l}'}{x_{h} - x_{l}} & 0 & 0 & \frac{x_{l}'x_{h} - x_{h}'x_{l}}{x_{h} - x_{l}} \\ 0 & \frac{y_{h}' - y_{l}'}{y_{h} - y_{l}} & 0 & \frac{y_{l}'y_{h} - y_{h}'y_{l}}{y_{h} - y_{l}} \\ 0 & 0 & \frac{z_{h}' - z_{l}'}{z_{h} - z_{l}} & \frac{z_{l}'z_{h} - z_{h}'z_{l}}{z_{h} - z_{l}} \\ 0 & 0 & 0 & 1 \end{bmatrix}

只由旋转和平移复合而成的仿射变换称为刚体变换(rigid-body transformation)。也就是说,这里的刚体变换不仅保持距离,而且保持手性

变换矩阵的逆既可以用代数方式计算,也可以用几何方式计算。SVD 也可用于计算逆矩阵:

M=R1scale(σ1,σ2,σ3)R2M1=R2Tscale(1/σ1,1/σ2,1/σ3)R1T\mathbf{M} = \mathbf{R}_{1}\mathrm{scale}(\sigma_{1}, \sigma_{2}, \sigma_{3})\mathbf{R}_{2} \\ \Rightarrow \mathbf{M}^{-1} = \mathbf{R}_{2}^{T}\mathrm{scale}(1/\sigma_{1}, 1/\sigma_{2}, 1/\sigma_{3})\mathbf{R}_{1}^{T}

坐标变换

坐标系(coordinate system)或坐标标架(coordinate frame)由原点和一组向量基构成。在所有的坐标系中,规范坐标系(canonical coordinate system)最特殊,它用来描述所有其它坐标系,因此也称为全局坐标系(global coordinate system)或世界坐标系(world coordinate system)。规范坐标系是所有其它坐标系的参照系,它的原点和向量基无需显式存储,而其它坐标系的原点和向量基均可以在规范坐标系中表示出来,并在计算机中显式存储。

除非特殊说明,图形学中使用的向量基一般都是正交基。

平面上点 p\vec{p} 在任一坐标系 {e;u,v}\{\vec{e};\vec{u},\vec{v}\} 和规范坐标系 {o;x,y}\{\vec{o};\vec{x},\vec{y}\} 之间的坐标变换:

pxy=[uxyvxyexy001]puv\vec{p}_{xy} = \begin{bmatrix} \vec{u}_{xy} & \vec{v}_{xy} & \vec{e}_{xy} \\ 0 & 0 & 1 \end{bmatrix} \vec{p}_{uv}

所涉及的坐标变换矩阵称为 {e;u,v}\{\vec{e};\vec{u},\vec{v}\} 标架的标架-规范矩阵(frame-to-canonical matrix),其逆矩阵称为规范-标架矩阵(canonical-to-frame matrix):

puv=[uxyvxyexy001]1pxy=[xuvyuvouv001]pxy\vec{p}_{uv} = \begin{bmatrix} \vec{u}_{xy} & \vec{v}_{xy} & \vec{e}_{xy} \\ 0 & 0 & 1 \end{bmatrix}^{-1} \vec{p}_{xy} = \begin{bmatrix} \vec{x}_{uv} & \vec{y}_{uv} & \vec{o}_{uv} \\ 0 & 0 & 1 \end{bmatrix} \vec{p}_{xy}

3D 情形类似:

pxyz=[uxyzvxyzwxyzexyz0001]puvw\vec{p}_{xyz} = \begin{bmatrix} \vec{u}_{xyz} & \vec{v}_{xyz} & \vec{w}_{xyz} & \vec{e}_{xyz} \\ 0 & 0 & 0 & 1 \end{bmatrix} \vec{p}_{uvw}