计算机图形学.李胜.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. \]