GAMES101笔记 02-视图变换
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
正交投影:
- 把相机放原点,看向$-Z$,头向着$Y$
- 扔掉$Z$轴
- 不管 $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]$