第六章 三维图形变换

6.1 三维图形几何变换

6.1.1 几何变换概述

三维基本几何变换皆是相对于坐标原点和坐标轴进行的几何变换。与二维变换类似,引入齐次坐标表示,即三维空间中某点的变换可以表示成点的齐次坐标与四阶的三维变换矩阵相乘。

  • p=[xyz1]=[xyz1][abcpdefqghirlmns]p' = \left[ \begin{matrix} x^* & y^* & z^* & 1\end{matrix}\right] =\left[ \begin{matrix} x & y & z & 1 \end{matrix}\right]· \left[ \begin{matrix} a&b&c&p\\d&e&f&q\\g&h&i&r\\l&m&n&s \end{matrix} \right]

计算机图形学完整笔记(六):三维图形变换

6.1.2 平移变换
  • [xyz1]=[xyz1]Tt=[xyz1][100001000010TxTyTz1]=[x+Txy+Tyz+Tz1]\left[ \begin{matrix} x' & y' & z' & 1\end{matrix}\right]=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right]·T_t=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right] · \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\T_x&T_y&T_z&1 \end{matrix} \right] = \left[ \begin{matrix} x+T_x & y+T_y & z+T_z & 1\end{matrix}\right]
6.1.3 比例变换
  • 局部比例变换:[xyz1]=[xyz1]Ts=[xyz1][a0000e0000i00001]=[axeyiz1]\left[ \begin{matrix} x' & y' & z' & 1\end{matrix}\right]=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right]·T_s=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right] ·\left[ \begin{matrix} a&0&0&0\\0&e&0&0\\0&0&i&0\\0&0&0&1 \end{matrix} \right] = \left[ \begin{matrix} ax&ey&iz & 1\end{matrix}\right]
  • 整体比例变换:[xyz1]=[xyz1]Ts=[xyz1][100001000010000s]=[xyzs]\left[ \begin{matrix} x' & y' & z' & 1\end{matrix}\right]=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right]·T_s=\left[ \begin{matrix} x & y & z & 1\end{matrix}\right] ·\left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&s \end{matrix} \right] = \left[ \begin{matrix} x&y&z & s\end{matrix}\right]
6.1.4 旋转变换

三维立体的旋转变换是指给定的三维立体绕三维空间某个指定的坐标轴旋转 $ \theta$ 角度。旋转后,立体的空间位置将发生变化,但形状不变。

  • 右手定则:右手大拇指指向旋转轴的正向,其余四指指向旋转角的正向

计算机图形学完整笔记(六):三维图形变换

  • 绕 z 轴旋转:[xyz1][cosθsinθ00sinθcosθ0000100001]=[xcosθysinθxsinθ+ycosθz1]\left[ \begin{matrix} x & y&z & 1 \end{matrix}\right]· \left[ \begin{matrix} cos\theta & sin\theta &0&0\\-sin\theta&cos\theta & 0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x ·cos\theta-y ·sin\theta & x ·sin\theta + y ·cos\theta &z&1\end{matrix}\right]

  • 绕 x 轴旋转:[xyz1][10000cosθsinθ00sinθcosθ00001]=[xycosθzsinθysinθ+zcosθ1]\left[ \begin{matrix} x & y&z & 1 \end{matrix}\right]· \left[ \begin{matrix} 1&0&0&0\\ 0&cos\theta & sin\theta &0\\0&-sin\theta&cos\theta & 0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x & y·cos\theta-z ·sin\theta & y ·sin\theta + z ·cos\theta &1\end{matrix}\right]

  • 绕 y 轴旋转:[xyz1][cosθ0sinθ00100sinθ0cosθ00001]=[xsinθ+xcosθyzcosθxsinθ1]\left[ \begin{matrix} x & y&z & 1 \end{matrix}\right]· \left[ \begin{matrix} cos\theta &0& -sin\theta &0\\0&1&0&0\\ sin\theta&0&cos\theta &0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x·sin\theta+x·cos\theta & y & z·cos\theta-x·sin\theta & 1 \end{matrix}\right]

  • 绕任意轴旋转

    • 先将轴移动到坐标原点,再将轴旋转到坐标轴上
    • 进行几何变换
    • 将轴反旋转,再反平移到原来位置
6.1.5 对称变换
  • 关于坐标平面的对称
    • 关于 x0yx0y 平面对称:T=[1000010000100001]T = \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&-1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x y z  1][x'\ y'\ z'\ 1]=[x\ y \ -z\ \ 1]
    • 关于 y0zy0z 平面对称:T=[1000010000100001]T = \left[ \begin{matrix} -1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x y z 1][x'\ y'\ z'\ 1]=[-x\ y \ z\ 1]
    • 关于 z0xz0x 平面对称:T=[1000010000100001]T = \left[ \begin{matrix} 1&0&0&0\\0&-1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x y  z 1][x'\ y'\ z'\ 1]=[x\ -y \ \ z \ 1]
  • 关于坐标轴的对称
    • 关于 xx 轴对称:T=[1000010000100001]T = \left[ \begin{matrix} 1&0&0&0\\0&-1&0&0\\0&0&-1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x  y z  1][x'\ y'\ z'\ 1]=[x\ \ -y \ -z\ \ 1]
    • 关于 xx 轴对称:T=[1000010000100001]T = \left[ \begin{matrix} -1&0&0&0\\0&1&0&0\\0&0&-1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x  y z  1][x'\ y'\ z'\ 1]=[-x\ \ y \ -z\ \ 1]
    • 关于 zz 轴对称:T=[1000010000100001]T = \left[ \begin{matrix} -1&0&0&0\\0&-1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right][x y z 1]=[x y  z  1][x'\ y'\ z'\ 1]=[-x\ -y \ \ z\ \ 1]

6.2 投影变换分类

投影变换:解决三维输出到二维

  • 投影法分类(区别在于投影中心到投影面之间的距离是有/无限的):

计算机图形学完整笔记(六):三维图形变换

  • 透视投影法(中心投影法),比如建筑透视
    • 生成真实感视图但不保持相关比例
  • 平行投影法
    • 正投影法,比如工程样图
    • 斜投影法
    • 保持物体的有关比例不变,物体的各个面的精确视图由平行投影而得,没有给出三维物体外表的真实性表示

6.3 平行投影 (三视图、轴测图)

6.3.1 平行投影概述
  • 特点
    • 物体各个面的精确视图又平行投影而得
    • 没有给出三维物体外表的真实性但保持比例

计算机图形学完整笔记(六):三维图形变换

6.3.2 三视图

计算机图形学完整笔记(六):三维图形变换

  • 主视图变换矩阵
    • T=[1000000000100001]T = \left[ \begin{matrix} 1&0&0&0\\0&0&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right],投影在 x0zx0z 面,直接将 yy00 .
  • 俯视图变换矩阵
    • T=[10000010000000z01]T = \left[ \begin{matrix} 1&0&0&0\\0&0&-1&0\\0&0&0&0\\0&0&-z_0&1 \end{matrix} \right],下述为推导过程
      • 投影在 x0yx0y 面,直接置 z=0z=0T=[1000010000000001]T = \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&0&0\\0&0&0&1 \end{matrix} \right]
      • 为了使俯视图与主视图都画在一个平面内,就要使 HH 面绕 xx 轴顺时针转90°,进入 x0zx0zT=[10000cos(90)sin(90)00sin(90)cos(90)00001]=[1000001001000001]T = \left[ \begin{matrix} 1&0&0&0\\0&cos(-90^ \circ)&sin(-90^ \circ)&0\\0&-sin(-90^ \circ)&cos(-90^ \circ)&0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} 1&0&0&0\\0&0&-1&0\\0&1&0&0\\0&0&0&1 \end{matrix} \right]
      • 为了使主视图和俯视图有一定的间距,还要使 HH 面沿 zz 方向平移一段距离 z0-z_0T=[10000100001000z01]T = \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&-z_0 &1 \end{matrix} \right]
  • 侧视图变换矩阵
    • T=[000010000010x0001]T = \left[ \begin{matrix} 0&0&0&0\\-1&0&0&0\\0&0&1&0\\-x_0&0&0&1 \end{matrix} \right],下述为推导过程
      • 投影在 y0zy0z面,直接置 x=0x=0T=[0000010000100001]T = \left[ \begin{matrix} 0&0&0&0\\0&1&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right]
      • 为了使侧视图与主视图也在一个平面内,就要使 WW 面绕 zz 轴正转90°,进入 x0zx0zT=[cos(90)sin(90)00sin(90)cos(90)0000100001]=[0100100000100001]T = \left[ \begin{matrix} cos(-90^ \circ)&sin(-90^ \circ)&0&0\\-sin(-90^ \circ)&cos(-90^ \circ)&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} 0&1&0&0\\-1&0&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right]
      • 为使主视图和侧视图有一定的间距,还要使 WW 面沿负 xx 方向平移一段距离 x0-x_0T=[100001000010x0001]T = \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&0\\-x_0&0&0 &1 \end{matrix} \right]
  • 主视图: [xyz1]=[x0z1]\left[ \begin{matrix} x' & y'&z' & 1 \end{matrix}\right] = \left[ \begin{matrix} x & 0&z & 1 \end{matrix}\right]
  • 俯视图: [xyz1]=[x0(y+z0)1]\left[ \begin{matrix} x' & y'&z' & 1 \end{matrix}\right] = \left[ \begin{matrix} x & 0&-(y+z_0 ) & 1 \end{matrix}\right]
  • 侧视图: [xyz1]=[(y+x0)0z1]\left[ \begin{matrix} x' & y'&z' & 1 \end{matrix}\right] = \left[ \begin{matrix} -(y+x_0) & 0&z & 1 \end{matrix}\right]
  • 三个视图中的 yy’ 均为 00,表明三个视图均落在 x0zx0z 面上
6.3.3 正轴侧
  • 等轴侧:当投影面与三个坐标轴之间的夹角都相等
  • 正二测:当投影面与两个坐标轴之间的夹角相等
  • 正三测:当投影面与三个坐标轴之间的夹角都不相等

计算机图形学完整笔记(六):三维图形变换

计算机图形学完整笔记(六):三维图形变换

  • 正轴侧变换矩阵:

    • VV 面为轴测投影面 (三视图中的 x0zx0z 面),先将物体绕 ZZ 轴转 γγ 角,接着绕 XX 轴转 α 角,最后向 VV 面投影

    计算机图形学完整笔记(六):三维图形变换

    • T=TZTXTV=[cosγsinγ00sinγcosγ0000100001][10000cosαsinα00sinαcosα00001][1000000000100001]=[cosγ0sinγsinα0sinγ0cosγsinα000cosα00001]T_正 = T_Z ·T_X·T_V = \left[ \begin{matrix} cos\gamma & sin\gamma & 0&0\\-sin\gamma & cos\gamma & 0& 0 \\ 0&0&1&0\\0&0&0&1 \end{matrix} \right] · \left[ \begin{matrix} 1&0&0&0\\0&cos\alpha&-sin\alpha&0\\0&sin\alpha&cos\alpha&0\\0&0&0&1 \end{matrix} \right] · \left[ \begin{matrix} 1&0&0&0\\0&0&0&0\\0&0&1&0\\0&0&0&1 \end{matrix} \right] \\ = \left[ \begin{matrix} cos\gamma & 0 & -sin\gamma sin\alpha &0\\ -sin\gamma & 0&-cos\gamma sin\alpha & 0 \\ 0&0&cos\alpha&0\\0&0&0&1 \end{matrix} \right]
    • [xyz1]=[xcosγysinγ0xsinγsinαycosγsinα+zcosα1]\left[ \begin{matrix} x' & y'&z' & 1 \end{matrix}\right] = \left[ \begin{matrix} xcos\gamma-ysin\gamma & 0& -xsin\gamma sin\alpha-ycos\gamma sin\alpha + zcos\alpha & 1 \end{matrix}\right]
  • 正等轴测图:取 γ=45α=35.26\gamma = 45^\circ , \alpha = -35.26^\circT正等轴测=[0.707100.408200.707100.40820000.816500001]T_{\text{正等轴测}} = \left[ \begin{matrix} 0.7071&0&-0.4082&0\\-0.7071&0&-0.4082&0\\0&0&0.8165&0\\0&0&0&1 \end{matrix} \right]

  • 正二测图:取 γ=20.7α=19.47\gamma = 20.7^\circ , \alpha = 19.47^\circT正二测=[0.935400.117800.707100.31180000.942800001]T_{\text{正二测}} = \left[ \begin{matrix} 0.9354&0&-0.1178&0\\-0.7071&0&-0.3118&0\\0&0&0.9428&0\\0&0&0&1 \end{matrix} \right]


6.4 透视投影

6.4.1 透视投影概述
  • 特点
    • 物体投影视图由计算投影线与观察平面之交点而得
    • 生成真实感视图但不保持比例

计算机图形学完整笔记(六):三维图形变换

  • 三维变换矩阵,T3D=[abcpdefqghirlmns]T_{3D} = \left[ \begin{matrix} a&b&c&p\\d&e&f&q\\g&h&i&r\\l&m&n&s \end{matrix} \right],其中 p、q、r 能产生透视变换的效果。

计算机图形学完整笔记(六):三维图形变换

6.4.2 一点透视
  • 假设 q0p=r=0q \not=0,p=r=0
  • [xyz1][1000010q00100001]=[xyzqy+1]\left[ \begin{matrix} x&y&z&1 \end{matrix} \right]· \left[ \begin{matrix} 1&0&0&0\\0&1&0&q\\0&0&1&0\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x&y&z&qy+1 \end{matrix} \right]
  • 齐次化后:[xyz1]=[xqy+1yqy+1zqy+11]\left[ \begin{matrix} x'&y'&z'&1 \end{matrix} \right]=\left[ \begin{matrix} \frac{x}{qy+1}&\frac{y}{qy+1}&\frac{z}{qy+1}&1 \end{matrix} \right]
    • y=0y=0 时,[xyz1]=[x0z1]\left[ \begin{matrix} x'&y'&z'&1 \end{matrix} \right]=\left[ \begin{matrix}x&0&z&1 \end{matrix} \right],即处于 y=0 平面内的点变换后无变化
    • yy\rightarrow∞时,[xyz1]=[01q01]\left[ \begin{matrix} x'&y'&z'&1 \end{matrix} \right]=\left[ \begin{matrix}0&\frac{1}{q}&0&1 \end{matrix} \right],所有点都集中到y轴的1/q处,这点叫灭点

计算机图形学完整笔记(六):三维图形变换

  • 只形成一个灭点的透视变换即为一点透视。
  • 同样的分别假设 pprr 其中一个不为 00 ,另外两个为 00 ,都会产生一个灭点 (1p,0,0)(\frac{1}{p}, 0, 0)(0,0,1r)(0, 0, \frac{1}{r})
6.4.3 多点透视
  • 根据一点透视的原理予以推广,如果 ppqqrr 三个元素中有两个为非零元素时,将会生成两个灭点,因此得到两点透视;相应的三点透视概念也可得知。
    • 如当 p0r0p\not=0,r\not=0[xyz1][100p0100001r0001]=[xyzpx+rz+1]\left[ \begin{matrix} x&y&z&1 \end{matrix} \right]· \left[ \begin{matrix} 1&0&0&p\\0&1&0&0\\0&0&1&r\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x&y&z&px+rz+1 \end{matrix} \right]
    • 齐次化后:[xyz1]=[xpx+rz+1ypx+rz+1zpx+rz+11]\left[ \begin{matrix} x'&y'&z'&1 \end{matrix} \right]=\left[ \begin{matrix} \frac{x}{px+rz+1}&\frac{y}{px+rz+1}&\frac{z}{px+rz+1}&1 \end{matrix} \right]
    • 分别看到两个灭点,(1p,0,0)(\frac{1}{p}, 0, 0)(0,0,1r)(0, 0, \frac{1}{r})

计算机图形学完整笔记(六):三维图形变换

6.4.4 生成透视投影图的方法

计算机图形学完整笔记(六):三维图形变换

  • 设投影中心:c(0, 0, -d),现在推空间一点 p(x,y,z)p(x, y, z) 的透视投影点 p(x,y,z)p'(x', y', z')
  • ABCAOCxx=yy=dd+zx=x1+z/dy=y1+z/dz=0\large \triangle ABC \sim \triangle A'OC \Rightarrow \frac{x'}{x} =\frac{y'}{y} = \frac{d}{d+z} \Rightarrow x'= \frac{x}{1+z/d},y' = \frac{y}{1+z/d},z' = 0
  • 矩阵形式是:[xyz1][100001000011d0001]=[xyzzd+1]\left[ \begin{matrix} x&y&z&1 \end{matrix} \right]· \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&\frac{1}{d}\\0&0&0&1 \end{matrix} \right] =\left[ \begin{matrix} x&y&z&\frac{z}{d}+1 \end{matrix} \right]
    • 透视坐标与 zz 值成反比。即 zz 值越大,透视坐标值越小
    • dd 的取值不同,可以对形成的透视图有放大和缩小的功能。当值较大时,形成的透视图变大;反之缩小。
  • 再乘以向投影面投影的变换矩阵,就得到点在画面上的投影[xyz1][100001000011d0001][1000010000000001]\left[ \begin{matrix} x&y&z&1 \end{matrix} \right]· \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&1&\frac{1}{d}\\0&0&0&1 \end{matrix} \right] · \left[ \begin{matrix} 1&0&0&0\\0&1&0&0\\0&0&0&0\\0&0&0&1 \end{matrix} \right]
    • 若投影中心在无穷远处,则 1d0\frac{1}{d} \rightarrow 0,上式变为平行投影。
6.4.5 一点透视投影实例

计算机图形学完整笔记(六):三维图形变换

  • l=0.8l=-0.8, m=1.6m=-1.6, n=2n=-2, 视距 d=2.5d=-2.5

计算机图形学完整笔记(六):三维图形变换

6.4.6 二点透视投影实例:

计算机图形学完整笔记(六):三维图形变换
计算机图形学完整笔记(六):三维图形变换

  • 将物体平移到适当位置 lmnl、m、n
  • 将物体绕 yy 轴旋转 θθ
  • 进行透视变换
  • 最后向 x0yx0y 面做正投影,即得二点透视图

相关文章: