「GAMES101」Transformation

「GAMES101」Transformation

关于变换的一些笔记。

2D Transformation

Scale

$$\begin{bmatrix} y'\\x' \end{bmatrix} = \begin{bmatrix} s_x & 0\\ 0 & s_y \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}$$

Reflection

$$\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} -1 & 0\\ 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}$$

Shear

Shear

$$\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} 1 & a\\ 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}$$

Rotate

一般默认为绕原点逆时针方向旋转

Rotate

$$\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} \cos \theta & -\sin \theta\\ \sin \theta & \cos \theta \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix}$$

:$R ^ {-1}(\theta) = R(-\theta) = R ^ T(\theta)$
旋转矩阵是正交矩阵

Homogeneous Coordinates

Why

平移变换不能写成上述矩阵形式

$$\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} a & b\\ c & d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} + \begin{bmatrix} t_x\\t_y \end{bmatrix}$$

但是不想把平移作为一种特殊变换


  • 2D Point = $(x, y, 1) ^ T$
  • 2D vector = $(x, y, 0) ^ T$

向量具有平移不变性,$w = 0$

$$\begin{bmatrix} x'\\y'\\w' \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix} = \begin{bmatrix} x + t_x\\ y + t_y\\ 1 \end{bmatrix}$$

扩充:$\begin{bmatrix}x\\y\\w\end{bmatrix}$ is the 2D point $\begin{bmatrix}x/w\\y/w\\1\end{bmatrix}, w \neq 0$
所以 point + point 为两点的中点

Affine Transformations

Affine map = linear map + translation

$$\begin{bmatrix} x'\\y' \end{bmatrix} = \begin{bmatrix} a & b\\ c & d \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} + \begin{bmatrix} t_x\\t_y \end{bmatrix}$$

Using homogeneous coordinates:

$$\begin{bmatrix} x'\\y'\\1 \end{bmatrix} = \begin{bmatrix} a & b & t_x\\ c & d & t_y\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x\\y\\1 \end{bmatrix}$$

一些规律

  • 最后一行是 $0, 0, 1$(二维情况下的仿射变换)
  • 平移是最后一列
  • 左上角 $2 \times 2$ 子矩阵为原来的变换矩阵

Scale

$$S(s_x, s_y) = \begin{bmatrix} s_x & 0 & 0\\ 0 & s_y & 0\\ 0 & 0 & 1 \end{bmatrix}$$

Rotation

$$R(\alpha) = \begin{bmatrix} \cos \alpha & -\sin \alpha\\ \sin \alpha & \cos \alpha \end{bmatrix}$$

Translation

$$T(t_x, t_y) = \begin{bmatrix} 1 & 0 & t_x\\ 0 & 1 & t_y\\ 0 & 0 & 1 \end{bmatrix}$$

Composing Transform

在默认列向量情况下,变换不断左乘,变换顺序从右往左读

Decomposing Complex Transforms

Rotate C

以 $c$ 点为中心旋转,先平移 $-c$,绕原点旋转,再平移 $c$

$$T(c) R(\alpha) T(-c)$$

3D Transformation

同样使用齐次坐标

  • 3D point = $(x, y, z, 1) ^ T$
  • 3D vector = $(x, y, z, 0) ^ T$

即 $(x, y, z, w)$ 在 $w \neq 0$ 时表示点 $(x / w, y / w, z / w)$

$$\begin{bmatrix} x'\\y'\\z'\\1 \end{bmatrix}=\begin{bmatrix} a & b & c & t_x\\ d & e & f & t_y\\ g & h & i & t_z\\ 0 & 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x\\y\\z\\1 \end{bmatrix}$$

本质是先线性变换,再平移

Rotation

绕某个轴旋转

$$R_x(\alpha) = \begin{bmatrix} 1 & 0 & 0 & 0\\ 0 & \cos \alpha & -\sin \alpha & 0\\ 0 & \sin \alpha & \cos \alpha & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}$$ $$R_y(\alpha) = \begin{bmatrix} \cos \alpha & 0 & \sin \alpha & 0\\ 0 & 1 & 0 & 0\\ -\sin \alpha & 0 & \cos \alpha & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}$$ $$R_z(\alpha) = \begin{bmatrix} \cos \alpha & -\sin \alpha & 0 & 0\\ \sin \alpha & \cos \alpha & 0 & 0\\ 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}$$

欧拉角

$$R_{xyz}(\alpha, \beta, \gamma) = R_x(\alpha)R_y(\beta)R_z(\gamma)$$

应用:flight simulators roll, pitch, yaw

Rodrigues’ Rotation Formula

绕轴 $\vec n$ 旋转 $\alpha$,默认轴过原点

$$R(\vec n, \alpha) = \cos(\alpha) \mathrm{I} + (1 - \cos \alpha)\vec n \vec n ^ T + \sin(\alpha)\begin{bmatrix} 0 & -n_z & n_y\\ n_z & 0 & -n_x\\ -n_y & n_x & 0 \end{bmatrix}$$

View / Camera transformation (视图变换)

相机

Camera

  • Position $\vec e$
  • Look-at $\hat{g}$
  • Up direction $\hat{t}$ (与 look-at 垂直)

只要相机和物体的相对位置不变,那么最终效果就不会变,所以可将相机永远固定在原点向 $-z$ 方向看,向上是 $y$,并将物体同样移动

  • 平移 $\vec{e}$ 到原点
  • 旋转 $\hat{g}$ 到 $-z$
  • 旋转 $\hat{t}$ 到 $y$
  • 旋转 $\hat{g} \times \hat{t}$ 到 $x$

$$M_{view} = R_{view}T_{view}$$

移动 $\vec{e}$

$$T_{view} = \begin{bmatrix} 1 & 0 & 0 & -x_e\\ 0 & 1 & 0 & -y_e\\ 0 & 0 & 1 & -z_e\\ 0 & 0 & 0 & 1 \end{bmatrix}$$

接下来三个旋转,考虑反过来旋转,将 $x \rightarrow \hat{g} \times \hat{t}, y \rightarrow \hat{t}, z \rightarrow -\hat{g}$,求 $R ^ {-1}_{view}$

$$R ^ {-1}_{view} = \begin{bmatrix} x_{\hat{g} \times \hat{t}} & x_{\hat{t}} & x_{-\hat{g}}& 0\\ y_{\hat{g} \times \hat{t}} & y_{\hat{t}} & y_{-\hat{g}} & 0\\ z_{\hat{g} \times \hat{t}} & z_{\hat{t}} & z_{-\hat{g}} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}$$

由于旋转矩阵是正交矩阵

$$R_{view} = (R ^ {-1}_{view}) ^ T = \begin{bmatrix} x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{t}} & 0\\ x_{\hat{t}} & y_{\hat{t}} & z_{\hat{t}} & 0\\ x_{-\hat{g}}& y_{-\hat{g}} & z_{-\hat{g}} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix}$$

Projection transformation (投影变换)

Fig. 7.1 from Fundamentals of Computer Graphics, 4th Edition

https://stackoverflow.com/questions/36573283/from-perspective-picture-to-orthographic-picture

Orthographic projection (正交投影)

简单理解

  • 相机放在原点上,向 $-z$ 看,向上是 $y$
  • 扔掉 $z$ 坐标
  • 平移缩放 $x,y$ 范围至 $[-1, 1] ^ 2$

正式做法

将 $[l, r] \times [b, t] \times [f, n]$ (视野范围) 映射到 $[-1, 1] ^ 3$ 标准 (canonical) 立方体

注:因为相机看向 $-z$,所以近 $n$ 值大于远 $f$

先平移,将中心移到原点,再缩放到 $[-1, 1] ^ 3$

$$M_{ortho} = \begin{bmatrix} \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{bmatrix}\begin{bmatrix} 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{bmatrix}$$

Perspective projection (透视投影)

齐次坐标:$(x, y, z, 1), (kx, ky, kz, k \neq 0), (xz, yz, z ^ 2, z \neq 0)$ 都是同一个点

Fig. 7.13 from Fundamentals of Computer Graphics, 4th Edition

基本思路:将远平面挤压成和近平面同大小,再正交投影;近平面不会变,远平面中心点不会变

Persp to Ortho

从侧面 ($x$) 看,上图右侧 $-z$ 方向即为相机看向的方向,由相似三角形可得

$$y’ = \frac{n}{z}y$$

同理

$$x’ = \frac{n}{z}x$$

所以

$$\begin{bmatrix} x\\y\\z\\1 \end{bmatrix} \Rightarrow \begin{bmatrix} nx/z\\ny/z\\\text{unknown}\\1 \end{bmatrix} = ^ {\times z}\begin{bmatrix} nx\\ny\\\text{still unknown}\\z \end{bmatrix}$$

即求 $M_{persp \rightarrow ortho}$ 满足

$$M_{persp \rightarrow ortho} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}=\begin{bmatrix} nx\\ny\\\text{unknown}\\z \end{bmatrix}$$

于是有

$$M_{persp \rightarrow ortho}=\begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & 1 & 0 \end{bmatrix}$$

注意到任何一个近平面上的点不变,任何一个远平面上的点 $z$ 不会发生变化


利用近平面不变
用 $n$ 替换上面坐标变换中的 $z$,即取进平面上点 $(x, y, n, 1)$,有

$$\begin{bmatrix} x\\y\\n\\1 \end{bmatrix} \Rightarrow \begin{bmatrix} x\\y\\n\\1 \end{bmatrix} = ^ {\times (n=z)}\begin{bmatrix} nx\\ny\\n^2\\n \end{bmatrix}$$

对于 $M_{persp \rightarrow ortho}$ 的第三行必为 $(0, 0, A, B)$,有

$$\begin{bmatrix} 0 & 0 & A & B \end{bmatrix}\begin{bmatrix} x\\y\\n\\1 \end{bmatrix}=n^2$$

即有

$$An + B = n ^ 2$$


利用远平面 $z$ 不变
取点 $(0, 0, f, 1) ^ T$,即有

$$\begin{bmatrix} 0\\0\\f\\1 \end{bmatrix} \Rightarrow \begin{bmatrix} 0\\0\\f\\1 \end{bmatrix} = \begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix}$$

于是

$$\begin{bmatrix} 0 & 0 & A & B \end{bmatrix}\begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}=f^2$$

即有

$$Af + B = f ^ 2$$


于是

$$\begin{cases} An + B = n ^ 2\\ Af + B = f ^ 2 \end{cases}$$

所以

$$A = n + f, B = -nf$$

$$M_{persp \rightarrow ortho}=\begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n + f & -nf\\ 0 & 0 & 1 & 0 \end{bmatrix}$$

最后

$$M_{persp} = M_{ortho}M_{persp \rightarrow ortho}$$


透视投影中视锥的定义 (假设 $l = -r, b = -t$)

  • aspect ratio 宽高比
  • field-of-view fov 垂直可视角度

$$\tan \frac{fovY}{2} = \frac{t}{\left|n\right|}$$ $$aspect = \frac{r}{t}$$
# ,

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×