1 视图变换(Viewing Transformation)

1.1 罗德里格斯旋转公式

绕任意轴$n$旋转$\alpha$度(其中$I$为单位矩阵)

TODO:后面补3D数学基础时再来推导一遍吧

1.2 什么是视图变换

视图变换是想如何拍一张照片:

  • 找一个好的地方并安排拍照的人(Model Transformation 模型变换)
  • 找一个好的地方并且安放好相机(View Transformation 视图变换)
  • 拍照,将3D画面处理为2D画面(Projection Transformation 投影变换)

1.3 定义相机

相机有三个非常重要的属性:(此处的^代表一个单位向量)

  • Position $\vec{e}$
  • Look-at/gaze direction $\hat{g}$
  • up direction $\hat{t}$ (控制相机选择,固定相机)



如果相机和所有物件一起移动,这个”相片会是一样的”,因此,将相机固定于$(0,0,0)$,向着$-z$方向看

2 Model Transformation

将 $\vec{e}$ 移到原点,可得变换矩阵:

3 View Transformation

将世界坐标系转换到摄像机坐标系,也就是Rotate $g$ to $-Z$, $t$ to $Y$, ($g \times t$) to $X$

直接变换我们可能想不出,为什么不考虑一下$X$ to ($g \times t$), $Y$ to $t$, $Z$ to $-g$呢,因为旋转矩阵的逆矩阵就是其转置矩阵,因此我们写出了后者就得到了前者

可得到:

同时我们结合上一节也能得到$M{view}=R{view}T_{view}$

4 Projection transformation

4.1 正交投影 Orthographic

正交投影:

  1. 把相机放原点,看向$-Z$,头向着$Y$
  2. 扔掉$Z$轴
  3. 不管 $x$, $y$ 范围有多大,都把它移到$[-1,1]*[-1,1]$上



通常的做法是:记录一个长方体的 $[l,r][b,t][f,n]$ (x, y, z轴范围),将其移动到原点,再缩放为$[-1,1]^3$

ps:为什么此处是near - far(n - f),因为我们的camera是朝着$-Z$方向的,因此数值越小反而越远

4.2 透视投影 Perspective

做透视投影,要先投影再正交变换$M_{persp->ortho}$,将frustum(视椎)挤压为一个长方形


那如何来做这个”压扁”操作呢:


由上图可知,利用相似三角形的性质,可以得出$x’=(n/z)x$ , $y’=(n/z)y$ , 但是$z$的变化是我们仍不知道的,例如:

同时又可以通过矩阵叉乘得到未知矩阵的一部分

但是$f$,$n$平面的$z$在被挤压过后是不变的,只是中间的平面会变
由此我们可以得到

同理代入$f$ , 可以得到一个方程组:

因此我们的矩阵最终写为

5 光栅化处理及视口变换

把东西画在屏幕上的过程就叫作光栅化

5.1 定义视椎体宽高比和垂直可视角度

  • fov:垂直可视角度
  • t:在y轴的高度
  • n:近平面上的z轴的点
  • r:中心点到右边的距离

宽高比(aspect)= $r/t$

5.2 像素以及屏幕

pixel即picture element,pixel的范围:$(0,0)$ to $(width-1,height-1)$,中心:$(x+0.5,y+0.5)$

屏幕覆盖范围:$(0,0)$ to $(width,height)$

5.3 视口变换

将$x,y$转换:$[-1,1]^2$ to $[0,width] \times [0,height]$