文章目录
GAMES101 – 现代图形学入门笔记4:变换进阶
该课程是 GAMES 开设的现代计算机图形学课程,系统而全面的介绍:光栅化、几何表示、光的传播理论、动画与模拟。每个方面都从基础原理出发讲解到实际应用,并介绍前沿的理论研究。本文是其 4 章(进阶变换)的学习笔记。
1. 反向旋转
已知二维图形旋转 \theta 其变换矩阵为:
\begin{matrix} \cos{\theta} & -\sin{\theta} \\ \sin{\theta} & \cos{\theta} \end{matrix} \right)
\tag{1}
使用同样的求法可知反向旋转相同角度时:
\begin{matrix} \cos{\theta} & \sin{\theta} \\ -\sin{\theta} & \cos{\theta} \end{matrix} \right) \tag{2}
实际上,从定义上说正向和反向旋转时互逆的过程,而对于该类矩阵实际上其逆即为转置;转置等于其逆的矩阵在数学上称为正交矩阵(Orthogonal Matrix)。
2. 3D Transformations
3d 仿射变换
同样使用其次坐标定义:
- 3d point = (x, y, z, 1)^T
- 3d vector = (x, y, z, 0)^T
同样,对于 (x, y, z, w) (w != 0) 其值相当于 (x/w, y/w, z/w),有:
\left( \begin{matrix} a & b & c & t_x \\ d & e & f & t_y \\ g & h & i & t_z \\ 0 & 0 & 0 & 1 \end{matrix} \right) \cdot
\left( \begin{matrix} x \\ y \\ z \\ 1 \end{matrix} \right)
\tag{3}
也是先应用线性变换,再运用平移变换
缩放
\left( \begin{matrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\0 & 0 & 0 & 1 \end{matrix} \right) \tag{4}
平移
\left( \begin{matrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \end{matrix} \right) \tag{5}
旋转
指定轴的旋转表示
对于 x 轴:
\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) \tag{6}
对于 y 轴:
\left(\begin{matrix}
\cos{\beta} & 0 & \sin{\beta} & 0 \\
0 & 1 & 0 & 0 \\
-\sin{\beta} & 0 & \cos{\beta} & 0 \\
0 & 0 & 0 & 1
\end{matrix} \right) \tag{7}
对于 z 轴:
\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)
\tag{8}
其中由于循环对称,使用右手定则容易注意到:
- for x-axis, y and z -> x
- for y-axis, z and x-> -y
- for z-axis, x and y-> z
故而存在对 y 轴的旋转形式与其他轴旋转情况不同的结果。
旋转的组合
对于任意 3D 旋转可以拆分成多个不同轴的旋转的组合,称为欧拉角(Euler angles)。假设飞机航向为 y 轴正方向,常见称呼为:
- pitch 倾角,沿 x 轴旋转
- roll 翻滚,沿 y 轴旋转
- yaw 转向,沿 z 轴旋转
其表示为:
Rodrigues’ 旋转公式
任意旋转可以表示使用角度 \alpha 和轴 n 表示:
\cos(\alpha) I +
(1 – \cos(\alpha) )nn^T +
\sin(\alpha)\left(\begin{matrix}0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \end{matrix} \right)
\tag{10}
- 对于不过原点的轴, 相当于将原点移动到轴上,旋转后,移动回去
- 式 10 的最右矩阵实际上是相当于使用轴进行叉乘
四元数的引入更多地为计算旋转和旋转之间的差值
3. 视图/摄影机变换
什么是视图变换?
考虑如何拍照:
- 寻找一个地点并且准备被摄物体(模型变换)
- 发现一个好的角度并且设置一个摄像机(视图变换)
- 拍照(投影变换)
如何进行视图变换?
相机的定义:
- 位置 Position: \vec{e}
- 朝向 Look-at/gaze direction: \vec{g}
- 朝上 Up direction: \vec{t}
关键的观察:当相机和所有物体一起移动时,照片一样;可视为相机固定于原点,Y 为上,-Z 为朝向,所有物体相对于相机移动,减少了复杂度。
视图变换方法:
- 变换到原点
- g 旋转到 -Z
- t 旋转到 Y
- g 叉乘 t 旋转到 X
数学上的定义:
因此,视图变换可以分解为视图位移和视图旋转:
\tag{11}
其中,视图位移易得:
1 & 0 & 0 & -x_e \\
0 & 1 & 0 & -y_e \\
0 & 0 & 1 & -z_e \\
0 & 0 & 0.& 1 \end{matrix} \right)
\tag{12}
若考虑将世界轴向摄像机轴移动,则有:
x_{\vec{g} \times \vec{t} } & x_t & x_{-g} & 0 \\
y_{\vec{g} \times \vec{t} } & y_t & y_{-g} & 0 \\
z_{\vec{g} \times \vec{t} } & z_t & z_{-g} & 0 \\
0 & 0 & 0 & 1 \end{matrix} \right)
\tag{13}
由式 1 和式 2 得,摄像机轴向世界轴的移动为式 13 的非拓展部分转置,有:
x_{\vec{g} \times \vec{t} } & y_{\vec{g} \times \vec{t} } & z_{\vec{g} \times \vec{t} } & 0 \\
x_t & y_t & z_t & 0 \\
x_{-g} & y_{-g} & z_{-g} & 0 \\
0 & 0 & 0 & 1 \end{matrix} \right)
\tag{14}
模型变换和视图变换可以结合到一起,称为模型视图变换。
4. 投影变换
图形学中的投影
- 3D 到 2D 的变换
- 正交投影(Orthographic Projection):
- 平行线的延长仍然平行,用于工程制图
- 假设相机离得无限远,远近切割平面大小相等
- 透视投影(Perspective Projection):
- 平行线的延长会相交,人眼的视角
- 认为摄像机本身是一个点,将远处的较大切割平面投射到近处较小的切割平面
正交投影
简单的理解:
- 摄像机进行视图变换
- 移除 Z 轴(对于前后区分,若无透明度,可以最小正距离为准;否则以透明度公式计算)
- 移动并缩放结果到 -1 到 1 的矩形上(约定俗成,方便后续计算)
正式:试图映射一个 [l,r] \times [b, t] \times [f, n] 立方体(cuboid)到正则(规范、标准?canonical)立方体 [-1,1]^3
\left( \begin{matrix}
\frac{2}{r-l} & 0 & 0 & 0 \\
0 & \frac{2}{t-b} & 0 & 0 \\
0 & 0 & \frac{2}{n-f} & 0 \\
0 & 0 & 0 & 1 \end{matrix} \right)
\left( \begin{matrix}
1 & 0 & 0 & -\frac{r+l}{2} \\
0 & 1 & 0 & -\frac{t+b}{2} \\
0 & 0 & 1 & -\frac{n+f}{2} \\
0 & 0 & 0 & 1 \end{matrix} \right)
\tag{15}
该方法可以便于裁剪(OPENGL 使用左手系)
透视投影
透视投影概述
- 计算机图形学中最广泛使用的
- 近大远小
回顾:齐次坐标中,点的每个维度乘以任何一个非 0 相同值仍然表示同一个点
如何进行透视投影?
对于透视投影,设置远近平面,称为 frustum;对于正交投影,设置远近平面,称为 cuboid。有基本思路:
- 将 frustum 挤压(squish)成为 cuboid
- 进行正交投影
规定:
- 近平面永远不变
- z 轴不变
- 远平面中心点不变
挤压变换,根据相似三角形得:
\tag{16}
由齐次坐标同乘不变得:
\left( \begin{matrix} nx/z \\ ny/z \\ unknown \\ 1 \end{matrix} \right) \equiv
\left( \begin{matrix} nx \\ ny \\ unknown \\ z \end{matrix} \right)
\tag{17}
则有转换矩阵为:
\left( \begin{matrix}
n & 0 & 0 & 0 \\
0 & n & 0 & 0 \\
? & ? & ? & ? \\
0 & 0 & 1 & 0 \\
\end{matrix} \right)
\tag{18}
存在以下两个观察:
- 任何一个点在近平面上不会变化
- 任何点在远的平面上 z 不会变化
由以上观察 1 得:
\tag{19}
替换 z 为 n 时,有:
\left( \begin{matrix} x \\ y \\ n \\ 1 \end{matrix} \right) \equiv
\left( \begin{matrix} nx \\ ny \\ n^2 \\ n \end{matrix} \right)
\tag{20}
因此第三行必须有以下形式:
\tag{21}
由观察 2 得:
\tag{22}
由式 21 式 22 得:
An + B &= n^2 \\
Af + B &= f^2
\end{aligned}
\tag{23}
得:
A &= n + f \\
B &= -nf
\end{aligned}
\tag{24}