10.6 计算机图形学

计算机图形学(Computer graphics)是处理图像,而图像可以到处移动,显示的比例也会变化,三维的物体只能投影到二维的平面上。这些关键操作都是用矩阵来完成的,但是这些矩阵的结构比较独特。
三维空间的图像变换是由 4×44\times44×4 的矩阵完成的,而不是 3×33\times33×3 的矩阵。原因是下面四个关键操作有一个无法使用 3×33\times33×3 的矩阵来完成。下面是四个关键操作:平移 Translation将原点平移到另一个点 P0=(x0,y0,z0)缩放 Rescaling沿着各坐标轴方向的缩放系数为 c 或分别为 c1,c2,c3旋转 Rotation绕经过原点的轴或者经过 P0 的轴旋转投影 Projection投影到经过原点的平面或经过点P0 的平面上\begin{array}{rl}\pmb{平移\,\textrm{Translation}}&\pmb{将原点平移到另一个点}\,P_0=(x_0,y_0,z_0)\\\pmb{缩放\,\textrm{Rescaling}}&\pmb{沿着各坐标轴方向的缩放系数为}\,c\,\pmb{或分别为}\,c_1,c_2,c_3\\\pmb{旋转\,\textrm{Rotation}}&\pmb{绕经过原点的轴或者经过\,P_0\,的轴旋转}\\\pmb{投影\,\textrm{Projection}}&\pmb{投影到经过原点的平面或经过点 P_0\,的平面上}\end{array}平移Translation缩放Rescaling旋转Rotation投影Projection将原点平移到另一个点P0=(x0,y0,z0)沿着各坐标轴方向的缩放系数为c或分别为c1,c2,c3绕经过原点的轴或者经过P0的轴旋转投影到经过原点的平面或经过点P0的平面上

一、平移

平移是最简单的,只需要将每个点加上 (x0,y0,z0)(x_0,y_0,z_0)(x0,y0,z0) 即可,但是这个操作不是线性的!任何 3×33\times33×3 的矩阵都不可能移动原点。因此我们将原点的坐标修改为坐标 (0,0,0,1)(0,0,0,1)(0,0,0,1). 这就是为什么要使用 4×44\times44×4 的矩阵。点 (x,y,z)(x,y,z)(x,y,z) 的 “齐次坐标(homogeneous coordinates)” 是 (x,y,z,1)(x,y,z,1)(x,y,z,1).
将整个三维空间沿着向量 v0\boldsymbol v_0v0 平移,原点移动到 (x0,y0,z0)(x_0,y_0,z_0)(x0,y0,z0),就是在空间 R3\textrm {\pmb R}^3R3 中的每个点 v\boldsymbol vv 都加上向量 v0=(x0,y0,z0)\boldsymbol v_0 =(x_0,y_0,z_0)v0=(x0,y0,z0). 我们使用齐次坐标,用 4×44\times44×4 的矩阵 TTT 将整个空间平移 v0\boldsymbol v_0v0

平移矩阵 Translation matrixT=[100001000010x0y0z01]\pmb{平移矩阵\,\textrm{Translation matrix}}\kern 20ptT=\begin{bmatrix}1&0&0&0\\0&1&0&0\\0&0&1&0\\x_0&y_0&z_0&1\end{bmatrix}平移矩阵Translation matrixT=100x0010y0001z00001

重点:计算机图形学使用的是行向量。我们使用行向量左乘矩阵而不是矩阵左乘列向量。这里可以快速检验 [0001]T=[x0y0z01]\begin{bmatrix}0&0&0&1\end{bmatrix}T=\begin{bmatrix}x_0&y_0&z_0&1\end{bmatrix}[0001]T=[x0y0z01].
要将点 (0,0,0)(0,0,0)(0,0,0)(x,y,z)(x,y,z)(x,y,z) 平移 v0\boldsymbol v_0v0,需要将它们变成齐次坐标 (0,0,0,1)(0,0,0,1)(0,0,0,1)(x,y,z,1)(x,y,z,1)(x,y,z,1),然后左乘矩阵 TTT. 行向量左乘 TTT 的结果是行向量。每个 v\boldsymbol vv 平移到 v+v0\boldsymbol v+\boldsymbol v_0v+v0 都可以这样表示:[xyz1]T=[x+x0y+y0z+z01]\begin{bmatrix}x&y&z&1\end{bmatrix}T=\begin{bmatrix}x+x_0&y+y_0&z+z_0&1\end{bmatrix}[xyz1]T=[x+x0y+y0z+z01].
这个输出就是 v\boldsymbol vv 平移到的位置,即 v+v0\boldsymbol v+\boldsymbol v_0v+v0. 现在我们使用矩阵完成了平移,而这在 R3\textrm {\pmb R}^3R3 中是不可能完成的。

二、缩放

为了使得图像适合页面的大小,我们一般会修改它的高和宽,如复印机可以将图像缩小到原来的 90%90\%90%. 在线性代数中,我们右乘上 0.90.90.9 倍的单位矩阵。对于一个平面,这个矩阵通常是 2×22\times22×2 的,而空间中是 3×33\times33×3 的。在计算机图形学中,我们使用齐次坐标,因此这个矩阵会大一阶(one size larger):

平面上缩放:S=[0.90.91]空间中缩放:S=[c0000c0000c00001]\pmb{平面上缩放:S=\begin{bmatrix}0.9\\&0.9\\&&1\end{bmatrix}}\kern 20pt\pmb{空间中缩放:S=\begin{bmatrix}c&0&0&0\\0&c&0&0\\0&0&c&0\\0&0&0&1\end{bmatrix}}平面上缩放:S=0.90.91空间中缩放:S=c0000c0000c00001

重点:SSS 并不是 cIcIcI,它的左下角有一个元素 111[xy1]\begin{bmatrix}x&y&1\end{bmatrix}[xy1] 左乘 SSS 在就是改点在齐次坐标下缩放后的坐标。原点的位置并不会改变,因为 [001]S=[001]\begin{bmatrix}0&0&1\end{bmatrix}S=\begin{bmatrix}0&0&1\end{bmatrix}[001]S=[001].
如果我们将空间中的缩放矩阵左下角的 111 改成 ccc,会得到一个很奇怪的结果。此时 [xyz1]S\begin{bmatrix}x&y&z&1\end{bmatrix}S[xyz1]S 所得到的缩放结果 (cx,cy,cz,c)(cx,cy,cz,c)(cx,cy,cz,c)(x,y,z,1)(x,y,z,1)(x,y,z,1) 是同一个点R3\textrm {\pmb R}^3R3 中的原点的齐次坐标是 (0,0,0,1)(0,0,0,1)(0,0,0,1) 或者说是 (0,0,0,c)(0,0,0,c)(0,0,0,c),其中 ccc 是任意非零数,它们都是一样的。这就是 “齐次” 的含义!
不同的方向上可以有不同的缩放比例。如将一整页的图像调整为半页显示,我们将其沿着 yyy 轴方向变为原来的 12\dfrac{1}{2}21,为了左右留些空白,将其沿着 xxx 轴的方向变为原来的 34\dfrac{3}{4}43。则这个缩放矩阵是一个对角矩阵,但是不是 2×22\times22×2 的,平面缩放矩阵是一个 3×33\times33×3 的,而空间缩放矩阵是 4×44\times44×4 的:缩放矩阵 Scaling matrixS=[34121],S=[c1c2c31]\pmb{缩放矩阵\,\textrm{Scaling matrix}}\kern 15ptS=\begin{bmatrix}\dfrac{3}{4}\\&\dfrac{1}{2}\\&&1\end{bmatrix},\kern 15ptS=\begin{bmatrix}c_1\\&c_2\\&&c_3\\&&&1\end{bmatrix}缩放矩阵Scaling matrixS=43211,S=c1c2c31后一个矩阵 SSS 通过正数 c1,c2,c3c_1,c_2,c_3c1,c2,c3 表示分别沿着 x,y,zx,y,zx,y,z 方向的缩放系数。所有的这些矩阵都会有一个额外的列,并且其最后一个元素都为 111.

总结:缩放矩阵 SSS 和平移矩阵 TTT 的阶数相同,它们可以相乘,vTS\boldsymbol vTSvTS 表示先对 v\boldsymbol vv 进行平移,然后缩放;而要先缩放在平移,则用 vST\boldsymbol vSTvST 来表示。这两种操作的结果是不同的!
R3\pmb{\textrm R}^3R3 中的点 (x,y,z)(x,y,z)(x,y,z) 在射影空间 P3\textrm{\pmb P}^3P3 中的齐次坐标是 (x,y,z,1)(x,y,z,1)(x,y,z,1),这个 “射影空间 (projective space)” 与 R4\textrm{\pmb R}^4R4 是不一样的,它仍然是一个三维空间。因为 (cx,cy,cz,c)(cx,cy,cz,c)(cx,cy,cz,c)(x,y,z,1)(x,y,z,1)(x,y,z,1) 是同一个点,射影空间 P3\pmb{\textrm P}^3P3 中的点实际上是 R4\textrm {\pmb R}^4R4 中经过原点的直线。
计算机图形学使用仿射变换(affine transformation) 来变换图像,它是一种线性和平移的组合变换。仿射变换矩阵 TTT 是一个有特殊第 444 列的 4×44\times44×4 的矩阵:A=[a11a12a130a21a22a230a31a32a330a41a42a431]=[T(1,0,0)0T(0,1,0)0T(0,0,1)0T(0,0,0)1]A=\begin{bmatrix}a_{11}&a_{12}&a_{13}&0\\a_{21}&a_{22}&a_{23}&0\\a_{31}&a_{32}&a_{33}&0\\a_{41}&a_{42}&a_{43}&1\end{bmatrix}=\begin{bmatrix}T(1,0,0)&0\\T(0,1,0)&0\\T(0,0,1)&0\\T(0,0,0)&1\end{bmatrix}A=a11a21a31a41a12a22a32a42a13a23a33a430001=T(1,0,0)T(0,1,0)T(0,0,1)T(0,0,0)0001通常 3×33\times33×3 的矩阵会有三个输出,但是这里的 AAA 有四个输出。通常的输出来自于输入 (1,0,0),(0,1,0)(1,0,0),(0,1,0)(1,0,0),(0,1,0)(0,0,1)(0,0,1)(0,0,1),当变换是线性的时,这三个输出就足够了。当变换是仿射,这个矩阵也会包含原点 (0,0,0)(0,0,0)(0,0,0) 的输出,然后我们会知道进行了平移。即仿射变换要包含线性变换加上原点的变换:xT(i)+yT(j)+zT(k)+T(0)xT(\boldsymbol i)+yT(\boldsymbol j)+zT(\boldsymbol k)+T(\boldsymbol 0)xT(i)+yT(j)+zT(k)+T(0),因为此时原点变换后会改变坐标。

三、旋转

R2\textrm{\pmb R}^2R2R3\pmb{\textrm R}^3R3 中的旋转是由正交矩阵 QQQ 来完成的,它们的行列式为 +1+1+1(如果行列式为 −1-11,则会多一个额外的镜面反射。)如果使用齐次坐标,这个矩阵会多一列。

旋转平面 Plane rotationQ=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]变为R=[cos⁡θ−sin⁡θ0sin⁡θcos⁡θ0001]\pmb{旋转平面\,\textrm{Plane rotation}}\kern 10ptQ=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\kern 7pt\cos\theta\end{bmatrix}\kern 5pt变为\kern 5pt\color{blue}R=\begin{bmatrix}\cos\theta&-\sin\theta&0\\\sin\theta&\kern 7pt\cos\theta&0\\0&0&1\end{bmatrix}旋转平面Plane rotationQ=[cosθsinθsinθcosθ]变为R=cosθsinθ0sinθcosθ0001

这个矩阵将平面绕着原点逆时针旋转 θ\thetaθ. 我们如何将平面绕不同的点(如(4,5)(4,5)(4,5))旋转呢? 从这个答案里我们可以发现齐次坐标的美妙之处。(4,5)(4,5)(4,5) 平移到原点 (0,0)(0,0)(0,0),然后逆时针旋转 θ\thetaθ,再将 (0,0)(0,0)(0,0) 平移到 (4,5)(4,5)(4,5)vT_RT+=[xy1][100010−4−51][cos⁡θ−sin⁡θ0sin⁡θcos⁡θ0001][100010451]\boldsymbol vT_\_RT_{+}=\begin{bmatrix}x&y&1\end{bmatrix}\begin{bmatrix}\kern 7pt1&\kern 7pt0&0\\\kern 7pt0&\kern 7pt1&0\\-4&-5&1\end{bmatrix}\begin{bmatrix}\cos\theta&-\sin\theta&0\\\sin\theta&\kern 7pt\cos\theta&0\\0&0&1\end{bmatrix}\begin{bmatrix}1&0&0\\0&1&0\\4&5&1\end{bmatrix}vT_RT+=[xy1]104015001cosθsinθ0sinθcosθ0001104015001这里关键是每次应用一个矩阵:v\boldsymbol vv 平移到 vT_\boldsymbol v T_\_vT_,然后旋转到 vT_R\boldsymbol vT_\_RvT_R,最后再平移回 vT_RT+\boldsymbol vT_\_RT_+vT_RT+,因为每个点 [xy1]\begin{bmatrix}x&y&1\end{bmatrix}[xy1] 都是行向量,所以 T_T_\_T_ 先作用,这样旋转中心 (4,5)(4,5)(4,5) —— 齐次坐标为 (4,5,1)(4,5,1)(4,5,1) 会先平移到 (0,0,1)(0,0,1)(0,0,1);旋转不会改变这个原点;最后 T+T_+T+ 会将原点平移回 (4,5,1)(4,5,1)(4,5,1),这样就完成了绕点 (4,5)(4,5)(4,5) 的旋转。例如,若要点 (4,6,1)(4,6,1)(4,6,1)(4,5,1)(4,5,1)(4,5,1) 旋转,我们先将 (4,6,1)(4,6,1)(4,6,1) 平移至 (0,1,1)(0,1,1)(0,1,1),然后绕原点旋转 θ\thetaθ 角度后再平移回去。
在三维空间中,每个旋转矩阵 QQQ 是绕着一个旋转轴旋转的,这个旋转轴不会移动,它是 QQQ 的特征值 λ=1\lambda=1λ=1 时对应的特征向量所在的直线。假设旋转轴是 zzz 轴,则旋转矩阵 QQQ 中的元素 111 将不会改变 zzz 分量,RRR 中额外的 111 不会改变原点:Q=[cos⁡θ−sin⁡θ0sin⁡θcos⁡θ0001]和R=[0Q000001]Q=\begin{bmatrix}\cos\theta&-\sin\theta&0\\\sin\theta&\kern 7pt\cos\theta&0\\0&0&1\end{bmatrix}\kern 10pt和\kern 10ptR=\begin{bmatrix}&&&0\\&Q&&0\\&&&0\\0&0&0&1\end{bmatrix}Q=cosθsinθ0sinθcosθ0001R=0Q000001现在假设旋转轴是单位向量 a=(a1,a2,a3)\boldsymbol a=(a_1,a_2,a_3)a=(a1,a2,a3) 所在的直线,则上述旋转矩阵 RRR 中的 QQQ 有三部分组成(罗德里格斯公式 Rodrigues’ rotation formula):Q=(cos⁡θ)I+(1−cos⁡θ)[a12a1a2a1a3a1a2a22a2a3a1a3a2a3a33]−sin⁡θ[0a3−a2−a30a1a2−a10](10.6.1)Q=(\cos\theta)I+(1-\cos\theta)\begin{bmatrix}a_1^2&a_1a_2&a_1a_3\\a_1a_2&a_2^2&a_2a_3\\a_1a_3&a_2a_3&a_3^3\end{bmatrix}-\sin\theta\begin{bmatrix}\kern 7pt0&\kern 7pta_3&-a_2\\-a_3&0&\kern 7pta_1\\\kern 7pta_2&-a_1&\kern 7pt0\end{bmatrix}\kern 15pt(10.6.1)Q=(cosθ)I+(1cosθ)a12a1a2a1a3a1a2a22a2a3a1a3a2a3a33sinθ0a3a2a30a1a2a10(10.6.1)a\boldsymbol aa 是行向量,中间的矩阵是 aTa\boldsymbol a^T\boldsymbol aaTa,若一个向量 b\boldsymbol bb 乘上最右边的矩阵,则结果为 a×b\boldsymbol a×\boldsymbol ba×b 。由于 aQ=a\boldsymbol aQ=\boldsymbol aaQ=a,所以旋转轴不会移动。当 a=(0,0,1)\boldsymbol a=(0,0,1)a=(0,0,1) 时,旋转轴就是 zzz 轴,此时的 QQQ 就会变成前面的那个 QQQ —— 绕 zzz 轴旋转的旋转矩阵 QQQ.
线性变换矩阵 QQQ 总是在矩阵 RRR 的左上角,它的下面都是 000,这是因为旋转不会改变原点;如果这些元素不为零,这个变换就是仿射变换,此时原点会移动。

四、投影

在线性代数学习中,大部分的平面都会经过原点,然而实际生活中却不会。经过原点的平面是向量空间,其它的是仿射空间,仿射空间是由向量空间平移得到的。
我们要将一个三维向量投影到一个平面上。先考虑经过原点的平面,它的单位法向量是 n\boldsymbol nn,这里将 n\boldsymbol nn 表示为一个列向量,那么这个平面上的所有向量都满足 nTv=0\boldsymbol n^T\boldsymbol v=0nTv=0. 投影到这个平面上的矩阵是 I−nnTI-nn^TInnT. 要投影一个向量到这个平面,只需要用这个投影矩阵左乘这个向量即可,法向量 n\boldsymbol nn 的投影是零向量,平面内的向量 v\boldsymbol vv 的投影就是它们本身:(I−nnT)n=n−n(nTn)=0,(I−nnT)v=v−n(nTv)=v(I-\boldsymbol n\boldsymbol n^T)\boldsymbol n=\boldsymbol n-\boldsymbol n(\boldsymbol n^T\boldsymbol n)=\boldsymbol 0,\kern 15pt(I-\boldsymbol n\boldsymbol n^T)\boldsymbol v=\boldsymbol v-\boldsymbol n(\boldsymbol n^T\boldsymbol v)=\boldsymbol v(InnT)n=nn(nTn)=0,(InnT)v=vn(nTv)=v使用齐次坐标的话,这个投影矩阵会变成一个 4×44\times44×4 的矩阵(但是原点不会移动):

投影到平面nTv=0P=[I−nnT001]\pmb{投影到平面}\kern 10pt\boldsymbol n^T\boldsymbol v=0\kern 15ptP=\begin{bmatrix}I-\boldsymbol n\boldsymbol n^T&0\\0&1\end{bmatrix}投影到平面nTv=0P=[InnT001]

现在要投影到一个不经过原点的平面 nT(v−v0)=0\boldsymbol n^T(\boldsymbol v-\boldsymbol v_0)=0nT(vv0)=0 上,v0\boldsymbol v_0v0 是这个平面上的一个点。这是一个仿射空间,类似于非齐次方程 Av=bA\boldsymbol v=\boldsymbol bAv=b 这样两边都不为零的解。将一个特解 v0\boldsymbol v_0v0 加上对应齐次方程的零空间上可以得到这个平面。
投影到这个仿射空间上有三步,使用 T_T_\_T_v0\boldsymbol v_0v0 平移到原点,然后沿着法向量 n\boldsymbol nn 的方向投影,最后再平移回原先的行向量 v0\boldsymbol v_0v0投影到仿射空间T_PT+=[I0−v01][I−nnT001][I0v01]\pmb{投影到仿射空间}\kern 15ptT_\_PT_+=\begin{bmatrix}I&0\\-\boldsymbol v_0&1\end{bmatrix}\begin{bmatrix}I-\boldsymbol n\boldsymbol n^T&0\\0&1\end{bmatrix}\begin{bmatrix}I&0\\\boldsymbol v_0&1\end{bmatrix}投影到仿射空间T_PT+=[Iv001][InnT001][Iv001]很明显 T_T_\_T_T+T_+T+ 互为逆矩阵:平移和平移回去。类似于消元矩阵。
还有一个反射矩阵,也称为镜像矩阵(mirror matrix). 这个是计算机图像学需要的第五类矩阵。反射时每个点移动的距离是投影的两倍——反射是穿过反射平面到达另一边。因此将投影矩阵 I−nnTI-\boldsymbol n\boldsymbol n^TInnT 改为 I−2nnTI-2\boldsymbol n\boldsymbol n^TI2nnT 就是镜像矩阵了。
上述的矩阵 PPP 给出了 “平行” 投影,所有的点都是平行法向量 n\boldsymbol nn 移动的,直到到达投影平面。计算机图形学中的另一种投影是 “透视(perspective)” 投影。这个更流行一些,因为它能够使得物体看起来近大远小。使用透视法,越靠近观察者的部分看起来越大,此时,投影直线不再是保持与 n\boldsymbol nn 平行了(也不互相平行),它们会朝向眼睛——投影中心。这就是我们为什么能够在二维图片上感受到纵深的原因。

计算机图形学的基本问题是先选择场景和视点,理想情况下,屏幕上的图像就是观察者看到的看到的样子。最简单的图像只给每个非常小的图像单元——称为像素(pixel) 分配一个比特(bit),它是亮或者暗的状态,这样可以形成一个黑白的图像而且不存在阴影,这种情况下我们显然是很少使用的。实际上,我们一般为红色、绿色和蓝色三种颜色各分配 28=2562^8=25628=256 的着色级别,这样每个像素至少需要 8×38\times38×3 比特,然后再乘上像素数量,就会发现需要很大的存储空间!
当前应用广泛的显示器是一种借助于薄膜晶体管驱动的有源矩阵液晶显示器,它主要是以电流刺激液晶分子产生点、线、面配合背部灯管构成画面。图像的质量是由像素数量和每个像素的比特数控制。计算机图形学领域的经典教材是 Computer Graphics: Principles and Practice,由 Hughes, Van Dam, McGuire, Skylar, Foley, Feiner 和 Akeley著(第三版,Addison-Wesley 出版社2014年出版)。还有 Ronald Goldman 和 Tony DeRose 的笔记也是很好的参考。

五、主要内容总结

  1. 计算机图像学需要平移操作 T(v)=v+v0T(\boldsymbol v)=\boldsymbol v+\boldsymbol v_0T(v)=v+v0,也需要线性操作 T(v)=AvT(\boldsymbol v)=A\boldsymbol vT(v)=Av.
  2. Rn\textrm{\pmb R}^nRn 中的平移可以使用齐次坐标用 n+1n+1n+1 阶的方阵来完成。
  3. R3\textrm {\pmb R}^3R3 中,当所有的矩阵的最后一列元素为 0,0,0,10,0,0,10,0,0,1 时,会使得 [xyz1]\begin{bmatrix}x&y&z&1\end{bmatrix}[xyz1] 中额外的分量 111 保持不变。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值