补充

对于旋转矩阵

R_{\theta} = \begin{pmatrix} cos_{\theta} & -sin_{\theta} \\ sin_{\theta} & cos_{\theta} \end{pmatrix}
R_{-\theta} = \begin{pmatrix} cos_{\theta} & sin_{\theta} \\ -sin_{\theta} & cos_{\theta} \end{pmatrix} = R^T_{\theta}
R_{-\theta} = R^{-1}_{\theta}

如果一个矩阵的逆等于其转置,我们这个矩阵为正交矩阵。

3D 变换

1-glzq.webp

3 维旋转矩阵有 3 个矩阵,分别绕 x 轴,y 轴,z 轴旋转。由于我们采用的是右手系,因此旋转是有定向的,正如在二维中,是 x 轴向 y 轴旋转,对应到 3 维中便是绕 z 轴旋转( x 轴转向 y 轴),绕 x 轴旋转( y 转向 z ),绕 y 轴旋转( z 转向 x )。

R_x({\alpha}) = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cos_{\alpha} & -sin_{\alpha} & 0 \\ 0 & sin_{\alpha} & cos_{\alpha} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

绕 x 轴旋转,故 x 不变,且 y 转向 z

R_y({\alpha}) = \begin{pmatrix} cos_{\alpha} & 0 & sin_{\alpha} & 0 \\ 0 & 1 & 0 & 0 \\ -sin_{\alpha} & 0 & cos_{\alpha} & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

绕 y 轴旋转,故 y 不变,因为是 z 转向 x,所以此处需要求逆

R_z({\alpha}) = \begin{pmatrix} cos_{\alpha} & -sin_{\alpha} & 0 & 0 \\ sin_{\alpha} & cos_{\alpha} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{pmatrix}

绕 z 轴旋转,故 z 不变,x 转向 y

绕任意轴旋转

绕任意轴旋转,首先将该轴旋转到任意的 x, y, z 轴上,然后可以应用基本的旋转矩阵,最后再逆旋转回来即可

R_1R_xR_1^T \times (x, y, z)^T

这里R_x的求法,从上面的解释可以得到,问题是如何求R_1,设想我们围绕旋转的轴为 u,R_1便是将 u 转到 x 的矩阵。具体来说,这里需要以 u 为一轴,构造一个 3 维正交坐标系,然后将 u-x 对齐,其他两轴和 y,z 对齐。

构造如下,任取一 t 方向不与 u 重合。

w = t \times u \\ v = u \times w

此时,u, w, v 便是我们构造出来的新坐标。注,这里是用叉乘。

如何将新坐标和原始坐标系重合呢?取R_1 = (u, w, v),该旋转矩阵的含义便是将 x, y, z 旋转到 u, w, v 的旋转矩阵。因此

\begin{bmatrix} x_u & x_v & x_w \\ y_u & y_v & y_w \\ z_u & z_v & z_w \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & cos_{\alpha} & -sin_{\alpha} \\ 0 & sin_{\alpha} & cos_{\alpha} \end{bmatrix} \begin{bmatrix} x_u & y_u & z_u \\ x_v & y_v & z_v \\ x_w & y_w & z_w \end{bmatrix}

罗德里格旋转公式

绕旋转轴\vec{n}旋转角度\alpha

1-sqbr.webp

视图变换(Viewing/Camera transformation)

什么是视图变换

用拍照来比喻一下:

  • 找一个好位置,安排模特(model transformation)

  • 找一个好的角度,摆放相机(view transformation)

  • 拍照! (projection transformation)

如何视图变换

首先定义相机:

  • Position\vec{e}

  • Look-at / gaze direction\hat{g}

  • Up direction\hat{t}

3-dctx.webp

如果相机和物体一起变换,那么相对不变。

4-nrke.webp

所以,我们规定将相机放在原点,up 在 Y 轴,看向 -z 方向

5-kqnf.webp

这样做的原因是,以后有很多操作会非常方便。

那么如何求变换矩阵M_{view}?

  • 将 e 平移到原点

  • 旋转 g 到 -Z

  • 旋转 t 到 Y

  • 旋转(g \times t)到 X

6-dqnh.webp

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

首先

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}

旋转 g 到 -Z,t 到 Y,g \times t到 X。

反向考虑一下,X 到(g \times t),Y 到 t,Z 到 -g。

7-kcca.webp

投影变换(Projection transformation)

  • 投影的目的是将 3D 映射为 2D

  • 正交投影(orthographic projection)

  • 透视投影(perspective projection)

8-iqjc.webp

对于正交投影,3D 中平行的线,投影之后还是平行。而透视投影则不是。

9-sryr.webp

正交投影

  • 相机位于原点,朝向 -Z,up 位于 Y

  • 丢弃 Z 轴

  • 平移并且缩放结果在一个矩形中[-1, 1]^2

10-jjhb.webp

更常规得看,我们是将一个立方体[l, r] \times [b, t] \times [f, n]映射到一个(正则,规范、标准)的立方体[-1, 1]^3

11-zyjq.webp

变换矩阵

先平移,再缩放

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)

  • 在图形学中应用最广泛

  • 近大远小

12-kbsl.webp

在齐次坐标系中

  • (x, y, z, 1), (kx, ky, kz, k!=0), (xz, yz,z^2, z!=0),在 3D 中都表示相同的点 (x, y, z)

  • (1, 0, 0, 1) 和 (2, 0, 0, 2) 都表示 (1, 0, 0)

如何完成投影变换

  • 首先,把截锥压成一个长方体(n->n, f->f)(M_{persp->ortho})

  • 做正交投影(M_{ortho})

13-ypoy.webp

第一步的关键因素是,发现变换点 (x^{'},y^{'},z^{'}) 和原始点 (x, y, z) 之间的关系

14-ovvi.webp

很明显,根据相似三角形公式,可以得到如下的结论:

15-wsni.webp

而由这个公式,我们可以推出以下矩阵:

16-pffm.webp

目前,我们还无法得知第三行是什么,不过,通过观察可以发现:

1. 近平面中任何点是不会改变的

17-xlci.webp

第三行必须是(0 0 A B),其中A和B是未知的

18-lxzg.webp

2. 远平面中任何点的z值是不会改变的

19-qold.webp

从上面,可以推出两个方程:

An + B = n^2 \\ Af + B = f^2

解得:

A = n + f \\ B = -nf

最后

M_{persp} = M_{ortho}M_{persp->ortho}