第5章 三维变换与投影 现实世界是三维的,三维物体的运动是通过三维变换实现的。光栅扫描显示器是二维 平面显示器,要在二维屏幕上绘制出三维场景就要通过投影变换来降低维数。本章主要介 绍三维变换、正交投影、斜投影与透视投影。 5.1 三维变换 5.1.1 三维变换矩阵 同二维变换类似,三维变换同样引入了齐次坐标,在四维空间内进行讨论。用(x,y,z, w)表示一个点(其中w=1),而不是用(x,y,z)。三维变换就可以表示为某一变换矩阵与物 体顶点集合的齐次坐标矩阵相乘的形式。三维变换矩阵是一个4×4的方阵。 M = a b c l d e f m g h i n p q r s é . êêêêê ù . úúúúú (5-1) 设M1= a b c d e f g h i é . êêêê ù . úúúú 为3×3的子矩阵,用于对物体进行比例、旋转、反射和错切变换; M2= l m n é . êêêê ù . úúúú 为3×1的子矩阵,用于对物体进行平移变换; M3= [p q r] 为1×3的子矩阵,用于对物体进行投影变换; M4= s[ ] 为1×1的子矩阵,用于对物体进行整体比例变换。 5.1.2 三维变换形式 物体的几何变换通常是以点变换为基础的。三维变换的基本方法是把变换矩阵作为一 个算子,作用到变换前物体顶点集合的齐次坐标矩阵上,得到变换后新的顶点集合的齐次坐 标矩阵。连接新的物体顶点,就可以绘制出变换后的三维物体模型。 设变换前物体顶点矩阵 P = x0 x1 … xn-1 y0 y1 … yn-1 z0 z1 … zn-1 1 1 … 1 é . êêêêê ù . úúúúú ·92· 变换后物体新的顶点矩阵为 P'= x'0 x'1 … x'n-1 y'0 y'1 … y'n-1 z'0 z'1 … z'n-1 1 1 … 1 é . êêêêê ù . úúúúú 三维变换矩阵为 M = a b c l d e f m g h i n p q r s é . êêêêê ù . úúúúú 则三维变换公式为P'=M ·P,可以写成 x'0 x'1 … x'n-1 y'0 y'1 … y'n-1 z'0 z'1 … z'n-1 1 1 … 1 é . êêêêê ù . úúúúú = a b c l d e f m g h i n p q r s é . êêêêê ù . úúúúú x0 x1 … xn-1 y0 y1 … yn-1 z0 z1 … zn-1 1 1 … 1 é . êêêêê ù . úúúúú (5-2) 5.2 三维基本变换 三维基本变换是指将P(x,y,z)点从一个坐标位置变换到另一个坐标位置P'(x',y',z') 的过程。三维基本变换和二维基本变换一样是相对于坐标系原点或坐标轴进行的几何变 换,包括平移、比例、旋转、反射和错切5种变换。因为三维变换矩阵的推导过程与二维变换 矩阵的推导过程类似,这里只给出结论。 5.2.1 平移变换 平移变换的坐标表示为 x'=x +Tx y'=y +Ty z'=z +Tz ì . í .. .. 因此,三维平移变换矩阵为 M = 1 0 0 Tx 0 1 0 Ty 0 0 1 Tz 0 0 0 1 é . êêêêê ù . úúúúú (5-3) 其中,Tx 、Ty 、Tz 是平移参数。 5.2.2 比例变换 比例变换的坐标表示为 x'=xSx y'=ySy z'=zSz ì . í .. .. ·93· 因此,三维比例变换矩阵为 M = Sx 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1 é . êêêêê ù . úúúúú (5-4) 其中,Sx 、Sy 、Sz 是比例系数。 5.2.3 旋转变换 三维旋转变换一般看作二维旋转变换的组合,可以分为绕x 轴旋转、绕y 轴旋转、绕z 轴旋转。绕坐标轴的旋转角用β 表示。β 正向的定义符合右手螺旋法则:大拇指指向旋转 轴正向,其余四指的转向为转角的正向。 1.绕x 轴旋转 绕x 轴旋转变换的坐标表示为 x'=x y'=ycosβ-zsinβ z'=ysinβ+zcosβ ì . í .. .. 因此,绕x 轴的三维旋转变换矩阵为 M = 1 0 0 0 0 cosβ -sinβ 0 0 sinβ cosβ 0 0 0 0 1 é . êêêêê ù . úúúúú (5-5) 其中,β 为正向旋转角。 2.绕y 轴旋转 同理可得,绕y 轴旋转变换的坐标表示为 x'=xcosβ+zsinβ y'=y z'=-xsinβ+zcosβ ì . í .. .. 因此,绕y 轴的三维旋转变换矩阵 M = cosβ 0 sinβ 0 0 1 0 0 -sinβ 0 cosβ 0 0 0 0 1 é . êêêêê ù . úúúúú (5-6) 其中,β 为正向旋转角。 3.绕z 轴旋转 同理可得,绕z 轴旋转变换的坐标表示为 x'=xcosβ-ysinβ y'=xsinβ+ycosβ z'=z ì . í .. .. 因此,绕z 轴的三维旋转变换矩阵为 ·94· M = cosβ -sinβ 0 0 sinβ cosβ 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-7) 其中,β 为正向旋转角。 5.2.4 反射变换 三维反射可以分为关于坐标轴的反射和关于坐标平面的反射两类。 1.关于x 轴的反射 关于x 轴反射变换的坐标表示为 x'=x y'=-y z'=-z ì . í .. .. 因此,关于x 轴的三维反射变换矩阵为 M = 1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-8) 2.关于y 轴的反射 关于y 轴反射变换的坐标表示为 x'=-x y'=y z'=-z ì . í .. .. 因此,关于y 轴的三维反射变换矩阵为 M = -1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-9) 3.关于z 轴的反射 关于z 轴反射变换的坐标表示为 x'=-x y'=-y z'=z ì . í .. .. 因此,关于z 轴的三维反射变换矩阵为 M = -1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-10) ·95· 4.关于xOy 平面的反射 关于xOy 平面反射变换的坐标表示为 x'=x y'=y z'=-z ì . í .. .. 因此,关于xOy 平面的三维反射变换矩阵为 M = 1 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-11) 5.关于yOz 平面的反射 关于yOz 平面反射变换的坐标表示为 x'=-x y'=y z'=z ì . í .. .. 因此,关于yOz 平面的三维反射变换矩阵为 M = -1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-12) 6.关于zOx 平面的反射 关于zOx 平面反射变换的坐标表示为 x'=x y'=-y z'=z ì . í .. .. 因此,关于zOx 平面的三维反射变换矩阵为 M = 1 0 0 0 0 -1 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-13) 5.2.5 错切变换 三维错切变换的坐标表示为 x'=x +by +cz y'=dx +y +fz z'=gx +hy +z ì . í .. .. 因此,三维错切变换矩阵为 M = 1 b c 0 d 1 f 0 g h 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-14) ·96· 三维错切变换中,一个坐标的变化受另外两个坐标变化的影响。如果变换矩阵第1行 中元素b 和c 不为0,则产生沿x 轴方向的错切;如果第2行中元素d 和f 不为0,则产生沿 y 轴方向的错切;如果第3行中元素g 和h 不为0,则产生沿z 轴方向的错切。 1.沿x 方向错切 此时,d=0,f=0,g=0,h=0。因此,沿x 方向错切变换矩阵为 M = 1 b c 0 0 1 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-15) 当b=0时,错切平面离开z 轴,沿x 方向移动cz 距离;当c=0时,错切平面离开y 轴, 沿x 方向移动by 距离。 2.沿y 方向错切 此时,b=0,c=0,g=0,h=0。因此,沿y 方向错切变换矩阵为 M = 1 0 0 0 d 1 f 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-16) 当d=0时,错切平面离开z 轴,沿y 方向移动fz 距离;当f=0时,错切平面离开x 轴,沿y 方向移动dx 距离。 3.沿z 方向错切 此时,b=0,c=0,d=0,f=0。因此,沿z 方向错切变换矩阵为 M = 1 0 0 0 0 1 0 0 g h 1 0 0 0 0 1 é . êêêêê ù . úúúúú(5-17) 当g=0时,错切平面离开y 轴,沿z 方向移动hy 距离;当h=0时,错切平面离开x 轴,沿z 方向移动gx 距离。 5.3 三维复合变换 三维基本变换是相对于坐标系原点或坐标轴进行的几何变换。同二维复合变换类似,三 维复合变换是指对图形进行一次以上的基本变换,总变换矩阵是每一步变换矩阵相乘的结果。 P'=M ·P =Mn ·Mn-1·…·M2·M1·P, 其中n >1 其中,M 为复合变换矩阵,M1、M2、…、Mn 为n 个单一的基本变换矩阵。 5.3.1 相对于任意一个参考点的三维变换 在三维基本变换中,旋转变换和比例变换是与参考点相关的。相对于任意一个参考点 的比例变换和旋转变换应表达为复合变换形式。变换方法是首先将参考点平移到坐标系原 点,相对于坐标系原点作比例变换或旋转变换,然后再进行反平移,将参考点平移回原位置。 ·97· 5.3.2 相对于任意一个参考方向的三维变换 相对于任意方向的变换方法是首先对任意方向做旋转变换,使任意方向与某个坐标轴 重合,然后对该坐标轴进行三维基本变换,最后做反向旋转变换,将任意方向还原回原来的 图5-1 绕空间向量旋转 方向。三维几何变换中需要进行两次旋转变换,才能使任 意方向与某一坐标轴重合。一般做法是先将任意方向旋 转到某个坐标平面内,然后再旋转到与该坐标平面内的某 个坐标轴重合。某个坐标轴可以是3个坐标轴中的任意 一个,其中z 轴是个不错的选择。 例5-1 任意向量n 用3个坐标轴上的方向余弦表示 为n=(cosαx ,cosαy ,cosαz),求空间中一点P (x,y,z)绕 n 逆时针方向旋转β 后的分步变换矩阵,如图5-1所示。 将n 分别绕x 轴、y 轴旋转适当角度与z 轴重合,有 多种方法可以实现二次旋转。这里采用将n 变换到yOz 平面,然后使用绕x 轴的旋转将n 变换到z 轴上的方法。 完成二次旋转后,再绕z 轴逆时针旋转β 角,最后再进行上述变换的逆变换,使n 回到原来 位置,如图5-2所示。 图5-2 相对于任意方向的三维变换步骤 (1)将n 绕y 轴顺时针方向旋转βy 后,与yOz 平面重合,变换矩阵为 M1 = cosβy 0 -sinβy 0 0 1 0 0 sinβy 0 cosβy 0 0 0 0 1 é . êêêêê ù . úúúúú (5-18) ·98· (2)将n 绕x 轴逆时针方向旋转βx 后,与z 轴重合,变换矩阵为 M2 = 1 0 0 0 0 cosβx -sinβx 0 0 sinβx cosβx 0 0 0 0 1 é . êêêêê ù . úúúúú (5-19) (3)将P(x,y,z)点绕z 轴逆时针方向旋转β 后,变换矩阵为 M3 = cosβ -sinβ 0 0 sinβ cosβ 0 0 0 0 1 0 0 0 0 1 é . êêêêê ù . úúúúú (5-20) (4)将n 绕x 轴顺时针旋转βx 后,变换矩阵为 M4 = 1 0 0 0 0 cosβx sinβx 0 0 -sinβx cosβx 0 0 0 0 1 é . êêêêê ù . úúúúú (5-21) (5)将n 绕y 轴逆时针方向旋转βy 后,变换矩阵为 M5 = cosβy 0 sinβy 0 0 1 0 0 -sinβy 0 cosβy 0 0 0 0 1 é . êêêêê ù . úúúúú (5-22) 图5-3 空间向量旋转角示意图 式(5-22)中,sinβx 、cosβx 、sinβy 、cosβy 为中间 变量。将n 投影到xOz 平面上,投影向量为u,u 与z 轴正向的夹角为βy 。将n 绕y 轴顺时针旋转 βy 后到yOz 平面上,得到向量..,.. 与z 轴正向的 夹角为βx ,如图5-3所示。不需要计算βx 和βy 的 值,只计算其正弦值与余弦值,就可以定义变换矩 阵M1、M2、M4 和M5。 n 在3个坐标轴上的投影分别为nx =cosαx 、 ny =cosα2、nz =cosα3。取z 轴上一单位向量k,将 其绕x 轴顺时针方向旋转βx 后,再绕y 轴逆时针 方向旋转βy 后,单位向量k 将与单位向量n 重合, 变换过程为 cosαx cosαy cosαz 1 é . êêêêê ù . úúúúú = cosβy 0 sinβy 0 0 1 0 0 -sinβy 0 cosβy 0 0 0 0 1 é . êêêêê ù . úúúúú 1 0 0 0 0 cosβx sinβx 0 0 -sinβx cosβx 0 0 0 0 1 é . êêêêê ù . úúúúú 0011 é . êêêêê ù . úúúúú = cosβxsinβy sinβx cosβxcosβy 1 é . êêêêê ù . úúúúú 即 cosβxsinβy =cosαx ,sinβx =cosαy ,cosαz =cosβxcosβy ·99· 可解得 cosβx = 1-sin2βx = 1-cos2αy = cos2αx +cos2αz sinβx =cosαy cosβx = cos2αx +cos2αz sinβy = cosαx cos2αx +cos2αz cosβy = cosαz cos2αx +cos2αz ì . í ..... .... . (5-23) 或者表示为 sinβx =ny cosβx = n2x +n2z sinβy = nx n2x +n2z cosβy = nz n2x +n2z ì . í ..... .... . (5-24) 将式(5-23)和式(5-24)代入式(5-18)、式(5-19)、式(5-21)和式(5-22)中,即可计算出 变换矩阵M1、M2、M4 和M5。相对于任意方向旋转的复合变换矩阵M =M5·M4·M3· M2·M1。立方体绕主对角线旋转的效果如图5-4所示。 说明:虽然称为任意方向,但实际上并不包含y 轴方向。在n=(0,1,0)上,出现了 cosβx =0,因而不能定义sinβy 、cosβy 。绕y 轴旋转时,应直接使用相关的旋转矩阵。 图5-4 立方体沿主对角线旋转 算法19:三维几何变换算法 5.4 平行投影 由于显示器屏幕只能显示二维图形,因此要输出三维物体,就要通过投影来降低维数。 投影就是从投影中心(centerofprojection,COP)发出射线,经过三维物体上的每一点后,与 投影面相交所形成的交点集合,因此把三维坐标转换为二维坐标的过程称为投影变换。根 据投影中心与投影面之间的距离的不同,投影可分为平行投影和透视投影。当投影中心到 ·100· 投影面的距离为有限值时,得到的投影称为透视投影;若此距离为无穷大,则投影称为平行 投影。正透视投影(简称透视投影)要求存在一条投影中心线垂直于投影面,且其他投影线 对称于投影中心线,否则为斜透视投影。平行投影分为正投影和斜投影。投影方向垂直于 投影面的平行投影称为正投影,投影方向不垂直于投影面的平行投影称为斜投影。正投影 的最大特点是无论物体距离视点(眼睛或摄像机)多远,投影后的物体尺寸保持不变。物体 的三视图就是按照正投影绘制的。投影分类如图5-5所示。 图5-5 投影的分类 5.4.1 正交投影 设物体上任意一点的三维坐标为P (x,y,z),投影后的三维坐标为P'(x',y',z'),则 正交投影方程 x'=x y'=y z'=0 ì . í .. .. 齐次坐标矩阵表示为 x' y' z' 1 é . êêêêê ù . úúúúú = x y01 é . êêêêê ù . úúúúú = 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 é . êêêêê ù . úúúúú x y z1 é . êêêêê ù . úúúúú 正交投影变换矩阵为 Morth = 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 é . êêêêê ù . úúúúú (5-25) 对图5-6 所示为立方体线框模型进行正交投影,假定投影面为xOy,投影坐标为 (x,y),只要简单地取立方体每个三维顶点坐标P(x,y,z)的x 分量和y 分量,用直线连接 各个二维点,就可以绘制出立方体在xOy 平面内的正交投影。 ·101·