GAMES101 Lecture 4 Transformation Cont
这里回顾GAMES101 Lecture 4,变换(续)。
课程主页:
课程作业:
课程视频:
参考资料:
- https://zh.m.wikipedia.org/zh-hans/%E7%BD%97%E5%BE%B7%E9%87%8C%E6%A0%BC%E6%97%8B%E8%BD%AC%E5%85%AC%E5%BC%8F
- https://www.cnblogs.com/wtyuan/p/12324495.html
- https://wuli.wiki/online/TriCro.html
本讲内容
- 3D变换
- 观测变换
- 视图/相机(view/camera)变换
- 投影(projection)变换
- 正交投影
- 透视投影
3D变换
对于3D变换,依然使用其次坐标:
- 对于3D point,利用$(x, y,z,1)^T$表示;
- 对于3D vector,利用$(x,y,z,0)^T$表示;
- 通常其次坐标$(x,y,z, w)$对应于点$(x/w, y/w, z/w)$;
仿射变换的矩阵形式为:
伸缩
伸缩变换:
平移
平移变换:
旋转
绕x, y, z轴旋转的矩阵:
这里$\mathbf R_y(\alpha)$的形式和$\mathbf R_x(\alpha),\mathbf R_z(\alpha)$不同,这是因为$\vec y = \vec z\times \vec x$。
对于一般的旋转,可以表示为:
$\alpha, \beta,\gamma$被称为Euler角;上述等式可以通过飞行器理解,飞行器中,有三个方向(roll, pitch, yaw),飞机的旋转可以分解为绕着三个轴旋转:
罗德里格斯旋转公式
对于一般的情形,即绕任意轴$\mathbf n$(单位向量)旋转角度$\alpha$的矩阵可以用罗德里格斯旋转公式描述:
首先要理解向量绕轴旋转的含义,其含义为将向量沿平行于轴和垂直于轴分解,平行于轴方向的分量不旋转,垂直于轴方向的分量进行旋转,这可以用下图理解:
备注:图片来自于博客。
在证明之前,给出两个引理:
叉积的矩阵表示:
叉积化简:
取$\mathbf B= \mathbf A$:
特别地,如果$\mathbf A$为单位向量,即$\mathbf{A} \cdot \mathbf{A}=1$,那么:
现在根据上述引理给出证明。
证明:
给定轴$\mathbf k$,对于任意向量$\mathbf v$,将其沿$\mathbf k$和垂直于$\mathbf k$分解:
那么:
根据叉积化简定理,第二式可以变换为:
根据之前对旋转的讨论,可以在垂直于$\mathbf k$的平面内对$\mathbf{v}_{\perp}$进行旋转,特别的,将$\mathbf{v}_{\perp}$作为$x$轴,$\mathbf n \times \mathbf{v}_{\perp}$作为$y$轴即可,旋转后的结果为:
所以最后的结果为:
倒数第二个等号利用了如下事实:
观测转换
视图/相机变换
- 什么是视图变换?
- 考虑如何拍照
- 找个好地方然后安排拍摄人(模型(model)变换)
- 找到一个好的“角度”来放置相机(视图(view)变换)
- Cheese!(投影(projection)变换)
- 合起来称为MVP。
为了介绍相机变换,首先定义相机,相机由如下三个量描述:
- position $\vec e$
- 相机向量;
- look-at / gaze direction $\vec g$
- 相机朝向;
- up direction $\vec t$
- 相机角度;
图示如下:
注意到如果相机和所有物体一起移动,“照片”将是相同的,所以我们总是将相机变换成
- 在原点位置,up direction为$Y$,gaze direction为$-Z$;
- 并与相机一起变换物体
图示:
假设上述变换为$M_{view}$,那么在数学上为:
- 平移到原点;
- 旋转$\vec g$到$-Z$;
- 旋转$\vec t$到$Y$;
- 旋转$(\vec g\times \vec t)$到$X$;
图示:
将变换分解为平移和旋转,即:
那么:
而$R_{v i e w}$是很难描述的,考虑其逆变换$R_{v i e w}^{-1}$,可以理解为将$X$轴旋转到$(\vec g\times \vec t)$,$Y$轴旋转到$\vec t$,$Z$轴旋转到$-\vec g$:
利用正交矩阵的逆为其转置,可得:
视图/相机变换小结:
- 与相机一起变换物体;
- 直到相机在原点,up在$Y$轴,look at $-Z$;
- 后续变换的基础;
投影(projection)变换
计算机图形学中的投影:
- 3D到2D;
- 正交投影;
- 透视投影;
透视投影可以带来近大远小的效果:
正交投影
正交投影一种简单的理解方式:
- 相机位于原点,look $-Z$,up at $Y$(看起来很熟悉?);
- 删除$Z$坐标;
- 将生成的矩形平移并缩放为$[-1, 1]^2$;
一般情况下:
- 我们希望将立方体$[l, r] \times[b, t] \times[{f}, {n}]$映射到规范立方体$[-1, 1]^3$;
- 我们先将立方体平移;
- 再将立方体缩放;
变换矩阵为:
补充:
- 沿着$-Z$观察,使远近不直观因为此时($n > f$);
- 仅供参考:这就是 OpenGL(图形 API)使用左手坐标系的原因;
透视投影
透视投影:
- 最常见于计算机图形学、艺术、视觉系统;
- 远处物体更小;
- 平行线不平行,相交到单点;
在继续之前,回顾齐次坐标的性质:
- $(x,y ,z ,1), (kx, ky, kz, k\neq 0), (xz, yz, z^2, z\neq 0)$在3D中都表示$(x, y, z)$;
- 例如,$(1,0,0, 1)$和$(2, 0, 0, 2)$都表示$(1, 0, 0)$;
那么如何进行透视投影?
- 首先将frustum“挤压”成一个长方体 ($n\to n, f\to f , M_{perp\to ortho}$);
- 然后进行正交投影(利用已知的$M_{ortho}$);
为了找到变换,我们可以找到变换后的关系,即点$(x’, y’, z’)$和原始点$(x, y, z)$:
丛上图中,可以看到关系为:
在齐次坐标下,坐标之间的关系为:
所以$M_{perp\to ortho}$作用为:
因此不难看出:
现在的问题是求解第三行,这里可以利用两个信息:
- 近平面上的任何点都不会改变;
- 远平面上任何点的$z$都不会改变;
对于第一点,公式1中将$z$替换为$n$可得:
由于上式对于任意的$x, y$都成立,因此$M_{p e r s p \rightarrow o r t h o}^{(4 \times 4)} $的第三行为:
对应的方程为:
对于第二点,原平面上的特殊点$(0, 0, f)$,那么:
对应的方程为:
求解可得:
即:
因此,最终的变换为: