计算机图形学.李胜.05.投影(3)

三维图形的显示流程图

  • 模型坐标系

    • 模型变换 \(\downarrow\)
  • 世界坐标系

    • 观察变换 \(\downarrow\)
  • 观察坐标系

    • 规范化变换 \(\downarrow\)
  • 规范化投影坐标系

    • 关于视见体的裁剪 \(\downarrow\)
    • 投影 \(\downarrow\)
  • 投影平面

    • 窗口至视区的变换 \(\downarrow\)
  • 设备坐标系

    • 显示

模型变换

  • 模型坐标系 Modeling Coordinate
    • 物体的局部坐标系
    • 在模型坐标系中物体的表示简单
  • 模型变换 Modeling Transformation
  • 将物体从本身的模型坐标系变换到上层物体的模型坐标系(或世界坐标系)的几何变换

何时裁剪

  • 投影之前:三维裁剪
    • 裁剪相对复杂
    • 只需要对可见的物体进行投影变换
  • 投影之后:二位裁剪
    • 裁剪相对简单
    • 需要对所有的物体进行投影变换
  • 为什么需要在投影之前进行裁剪
    • 三维物体的表面通常被离散表示成多边形或折线,而这类简单图元的三维裁剪比较简单
    • 三维图形在显示过程中需要被消隐,消隐需要图形的深度信息,所以必须在投影之前完成

规范视见体

  • 规范视见体的引入可以简化裁剪
  • 规范化变化:将任意视见体变换成规范视见体的变换
  • 规范投影坐标(三维屏幕坐标 ):经规范化的观察坐标系

平行投影的规范视见体

  • 半立方体

\[ \left\{ \begin{array}{**lr**} u=-1,u=1\\ v=-1,v=1\\ n=-1,n=0 \end{array} \right. \]

透视投影的规范视见体

  • 四棱台

\[ \left\{ \begin{array}{**lr**} u=-n,u=n\\ v=-n,v=n\\ n=-1,n=-n_{min} \end{array} \right. \]

平行投影视见体的规范化

  • 将任意的平行投影视见体变换为规范平行投影视见体
  • 变换的分解与合成
  • 例如之前的 OpenGL 的变换推导

透视投影视见体的规范化

  • 将任意的透视投影视见体变换为规范透视投影视见体
  • 变换的分解与合成
  • 例如之前的 OpenGL 的变换推导

规范视见体之间的变换

  • 将透视投影的规范视见体变换为平行投影的规范视见体
  • 原因
    • 关于长方体的裁剪较关于正四棱台的裁剪简单
    • 平行投影较透视投影简单
    • 透视投影与平行投影都采用同一套裁剪与投影程序,处理一致,便于用硬件实现

\[ \begin{bmatrix} 1&0&0&0\\ 0&1&0&0\\ 0&0&\dfrac{1}{1-n_{min}}&\dfrac{n_{min}}{1-n_{min}}\\ 0&0&-1&0 \end{bmatrix} \]

  • \(n_{min}\ge0\)

三维裁剪

两种方法

  • 将齐次坐标转换为三维坐标,在三维空间对视见体裁剪
    • 三维裁剪相对容易
    • 需要将齐次坐标转换为三维坐标
  • 直接在四维齐次坐标空间中进行裁剪
    • 不需要将齐次坐标转换为三维坐标
    • 有理曲线曲面可以直接用齐次坐标来表示,对它们的裁剪只能在齐次坐标空间中进行
    • 四维裁剪相对复杂

关于规范视见体的裁剪

  • 直线段裁剪的Cohen_Sutherland算法、梁_Barskey算法的直接推广
  • 多边形裁剪的Sutherland_Hodgman算法的直接推广
  • 齐次坐标空间中的裁剪
    • 四维裁剪体的定义

相机的任意控制

欧拉变换

  • Euler 变换

  • 缺省视域方向

    • 视线为 -z 轴
    • 头顶朝向为 +y 轴
    • 右手系
  • \(E(h,p,r)=R_z(r)R_x(p)R_y(h)\)

    • 旋转顺序:\({\color{red}yzx}\)
  • 正交矩阵 \(E\)

    • \(E^{-1}=E^T=(R_zR_xR_y)^T=R_y^TR_x^TR_z^T\)
  • 方向规定:

    • \(head/yaw:z\to x\)
    • \(pitch:y\to z\)
    • \(roll:y\to x\)
      • 和右手系相反
  • Gimbal lock:万向锁

    • 一个自由度缺失
    • 旋转一直都是在物体所在的局部坐标系变换
      • 在旋转的过程中,某个轴旋转的时候与一开始的某个其他轴重合
  • \(c\) 表示 \(\cos\)\(s\) 表示 \(\sin\)

\[ E(h,p,r)= \begin{bmatrix} c_yc_z-s_xs_ys_z&-c_xc_z&s_yc_z+s_xc_ys_z&0\\ c_ys_z+s_xs_yc_z&c_xc_z&s_ys_z-s_xc_yc_z&0\\ -s_yc_x&s_x&c_xc_y&0\\ 0&0&0&1 \end{bmatrix} \]

\[ E(h,p,r)= \begin{bmatrix} c_hc_r-s_ps_hs_r&-c_pc_r&s_hc_r+s_pc_hs_r&0\\ c_hs_r+s_ps_hc_r&c_pc_r&s_hs_r-s_pc_hc_r&0\\ -s_hc_p&s_p&c_pc_h&0\\ 0&0&0&1 \end{bmatrix} \]

  • \(p=\dfrac{\pi}{2}\) 时,自由度损失

\[ E(h,p,r)= \begin{bmatrix} c_hc_r-s_hs_r&0&s_hc_r+c_hs_r&0\\ c_hs_r+s_hc_r&0&s_hs_r-c_hc_r&0\\ 0&1&0&0\\ 0&0&0&1 \end{bmatrix} \]

\[ E(h,p,r)= \begin{bmatrix} \cos(h+r)&0&\sin(h+r)&0\\ \sin(h+r)&0&-\cos(h+r)&0\\ 0&1&0&0\\ 0&0&0&1 \end{bmatrix} \]

  • 万向锁产生,\(h,r\) 共轴

四元数 Quaternion

  • 最早由 Sir William Rowan Hamilton 于 1843 年提出,从复数推广到四维空间
  • 1985年,Shoemake 把四元数引入计算机图形学
  • 在表示旋转和朝向方面,优于Euler角。具有表示紧凑,朝向插值稳定的优点,在虚拟现实系统中,常用于表示各种视点(camera)的旋转变换
  • 定义
    • \(\vec{q}=(\vec{q_v},q_w)=(iq_x+jq_y+kq_z+q_w)=\vec{q_v}+q_w\)
    • \(\vec{q_v}=(iq_x+jq_y+kq_z)=(q_x,q_y,q_z)\)
    • \(i^2=j^2=k^2=1,ij=-ji=k,jk=-kj=i,ki=-ik=j\)
      • 感觉和 xyz 坐标系差不多
    • \(q_w\) 称为实部\(\vec{q_v}\) 称为虚部
    • \(i,j,k\) 称为虚轴

四元数性质

  • 四元数乘法:直接展开即可

\[ \begin{aligned} \vec{q}\vec{r}=&(iq_x+jq_y+kq_z+q_w)(ir_x+jr_y+kr_z+r_w)\\ =&(\vec{q_v}\times\vec{r_v}+r_w\vec{q_v}+q_w\vec{r_v},q_wr_w-\vec{q_v}\cdot\vec{r_w})\\ =&(q_yr_z-q_zr_y+r_wq_x+q_wr_x,\\ &q_zr_x-q_xr_z+r_wq_y+q_wr_y,\\ &q_xr_y-q_yr_x+r_wq_z+q_wr_z,\\ &q_wr_w-q_xr_x-q_yr_y-q_zr_z) \end{aligned} \]

  • 四元数加法:实部虚部分开做加法
    • \(\vec{q}+\vec{r}=(\vec{q_v}+\vec{r_v},q_w+r_w)\)
  • 四元数共轭
    • \(\vec{q}^\star=(-\vec{q_v},q_w)\)
  • 四元数范数
    • \(n(\vec{q})= \Vert \vec{q}^2\Vert =\vec{q}\vec{q}^\star=\vec{q}^\star\vec{q}=\vec{q_v}\cdot\vec{q_v}+q_w^2=\vec{q_x}^2+\vec{q_y}^2+\vec{q_z}^2+q_w^2\)
  • 四元数的逆
    • \(\vec{q}^{-1}=\dfrac{\vec{q}^\star}{\Vert\vec{q}^2\Vert}\)
  • 共轭法则
    • \((\vec{q}^\star)^\star=\vec{q}\)
    • \((\vec{q}+\vec{r})^\star=\vec{q}^\star+\vec{r}^\star\)
    • \((\vec{q}\vec{r})^\star=\vec{r}^\star\vec{q}^\star\)
  • 范数法则
    • \(n(\vec{q})=n(\vec{q}^\star)\)
    • \(n(\vec{q}\vec{r})=n(\vec{q})n(\vec{r})\)
  • 线性性质
    • \(\vec{p}(s\vec{q}+t\vec{r})=s\vec{p}\vec{q}+t\vec{p}\vec{r}\)
    • \((s\vec{q}+t\vec{r})\vec{p}=s\vec{q}\vec{p}+t\vec{r}\vec{p}\)
  • 交换律
    • \((\vec{p}\vec{q})\vec{r}=\vec{p}(\vec{q}\vec{r})\)
  • 单位四元数
    • \(n(\vec{q})=1\)
    • 可以写成 \(\vec{q}=(\sin\phi\vec{u_q},\cos\phi)=\sin\phi\vec{u_q}+\cos\phi\),其中 \(\Vert\vec{u_q}\Vert=1\)
    • \(\vec{q}=\sin\phi\vec{u_q},\cos\phi=e^{\phi\vec{u_q}}\)
      • 参照单位复数 \(\cos\phi+i\sin\phi=e^{i\phi}\)
  • 单位四元数对数运算
    • \(\ln\vec{q}=\phi\vec{u_q}\)
  • 单位四元数指数运算
    • \(\vec{q}^t=e^{t\phi\vec{u_q}}=\sin(t\phi)\vec{u_q}+\cos(t\phi)\)

四元数变换

  • 单位四元数的最重要性质:能表示任意、旋转,而且表示简单、紧凑
  • 给定向量 \(\vec{p}=(p_x,p_y,p_z,p_w)^T\) 和单位四元数 \(\vec{q}=(\sin\phi\vec{u_q},\cos\phi)\)
    • \(\vec{q}\vec{p}\vec{q}^{-1}\)\(p\) 绕单位轴 \(\vec{u_q}\) 旋转 \({\color{red}2\phi}\) 角度
    • \({\color{red}\mathrm{Proof}}\)
      • 可以通过最原始的旋转进行验证
        • 以单位旋转轴为 z 轴建立新坐标系,坐标系变换
        • 套用旋转矩阵
        • 坐标系逆变换
      • 对比得到的矩阵是否一致
    • 旋转模长不变是显然的
      • \(\Vert\vec{q}\vec{p}\vec{q}^{-1}\Vert=\Vert\vec{q}\Vert\Vert\vec{p}\Vert\Vert\vec{q}^\star\Vert=\Vert\vec{p}\Vert\)

绕任意单位轴的旋转矩阵

  • 绕单位轴 \((a,b,c)\) 旋转 \(\theta\) 的旋转矩阵
(1) 建立新坐标系
  • \(n=(n_x,n_y,n_z)\)
  • \(u=(0,\dfrac{-n_z}{\sqrt{n_y^2+n_z^2}},\dfrac{n_y}{\sqrt{n_y^2+n_z^2}})\)
  • \(v=n\times u=(\sqrt{n_y^2+n_z^2},\dfrac{-n_xn_y}{\sqrt{n_y^2+n_z^2}},\dfrac{-n_xn_z}{\sqrt{n_y^2+n_z^2}})\)
(2) 坐标变换矩阵
  • \(xyz\to uvn\)

\[ M_1=\begin{bmatrix} u_x & u_y & u_z & 0\\ v_x & v_y & v_z & 0\\ n_x & n_y & n_z & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]

(3) 绕 n(z) 轴旋转角度 \(\theta\)

\[ M_2= \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0\\ \sin\theta & \cos\theta & 0 & 0\\ 0 & 0 & 1& 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]

(4) 坐标变换逆变换
  • 正交矩阵 \(M_1\)

\[ M_3=M_1^{-1}=M_1^T \]

(5) 结果
  • \(M_3M_2M_1\)
  • \(c\) 表示 \(\cos\theta\)\(s\) 表示 \(\sin\theta\)

\[ \begin{bmatrix} n_x^2+(u_x^2+v_x^2)c&n_xn_y-n_zs+(u_xu_y+v_xv_y)c&n_xn_z+n_ys+(u_xu_z+v_xv_z)c&0\\ n_xn_y+n_xs+(u_xu_y+v_xv_y)c&(u_y^2+v_y^2)c+n_y^2&n_yn_z-n_xs+(u_yu_z+v_yv_z)c&0\\ n_xn_z-n_ys+(u_xu_z+v_xv_z)c&n_yn_z+n_xs+(u_yu_z+v_yv_z)c&(u_z^2+v_z^2)c+n_z^2&0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]

\[ M(\vec{n},\theta)=M_3M_2M_1= \begin{bmatrix} n_x^2(1-c)+c & n_xn_y(1-c)-n_zs& n_xn_z(1-c)+n_ys& 0\\ n_xn_y(1-c)+n_zs & n_y^2(1-c)+c & n_yn_z(1-c)-n_xs & 0\\ n_xn_z(1-c)-n_ys & n_yn_z(1-c)+n_xs & n_z^2(1-c)+c & 0\\ 0 & 0 & 0 & 1\\ \end{bmatrix} \]

四元数转化为矩阵形式

\[ \begin{aligned} \vec{q}\vec{p}\vec{q}^{-1}=&(q_x,q_y,q_z,q_w)(p_x,p_y,p_z,p_w)(-q_x,-q_y,-q_z,q_w)\\ =&(q_yp_z-q_zp_y+p_wq_x+q_wp_x,\\ &q_zp_x-q_xp_z+p_wq_y+q_wp_y,\\ &q_xp_y-q_yp_x+p_wq_z+q_wp_z,\\ &q_wp_w-q_xp_x-q_yp_y-q_zp_z)(-q_x,-q_y,-q_z,q_w)\\ =&\cdots \end{aligned} \]

  • 展开即可
    • 展开第一项,后面的可以根据循环对称性进行推导
  • 表示方便,我们写成矩阵形式 \(\vec{q}\vec{p}\vec{q}^{-1}=M^q\vec{p}\)

\[ M^q= \begin{bmatrix} 1-2(q_y^2+q_z^2)&2(q_xq_y-q_zq_w)&2(q_xq_z+q_yq_w)&0\\ 2(q_xq_y+q_zq_w)&1-2(q_x^2+q_z^2)&2(q_yq_z-q_xq_w)&0\\ 2(q_xq_z-q_yq_w)&2(q_yq_z+q_xq_w)&1-2(q_x^2+q_y^2)&0\\ 0&0&0&1 \end{bmatrix} \]

  • 如果 \(\vec{q}\) 不是单位四元数,那么上面的 \(2\) 全部得换成 \(\dfrac{2}{n(\vec{q})}\)
  • 对比 \(M(\vec{n},\theta)\) 确实是一致的
    • \(\vec{q}=(n_x\sin\phi,n_y\sin\phi,n_z\sin\phi,\cos\phi)\)
    • \(\theta=2\phi\)
    • 逐个验证即可

矩阵形式转化为四元数

  • 根据矩阵的性质来进行计算四元数 \(\vec{q}\)

\[ \left\{ \begin{array}{**lr**} tr(M)=4q_w^2\\ m_{21}-m_{12}=4q_xq_w\\ m_{02}-m_{20}=4q_yq_w\\ m_{10}-m_{01}=4q_zq_w \end{array} \right. \]

\[ \left\{ \begin{array}{**lr**} q_w=\dfrac{1}{2}\sqrt{tr(M)}\\ q_x=\dfrac{m_{21}-m_{12}}{4q_w}\\ q_y=\dfrac{m_{02}-m_{20}}{4q_w}\\ q_z=\dfrac{m_{10}-m_{01}}{4q_w} \end{array} \right. \]