1、流程中图片的变换
世界变换 -> 摄像机变换 ->投影变换 ->视口变换
2、摄像机变换
对摄像机的描述,有三个三个向量就能定义一个摄像机的位置和摄像方位:
- Position e ⃗ \vec{e} e
- gaze g ^ \hat{g} g^
- Up t ^ \hat{t} t^
M v i e w = R v i e w T v i e w M_{view} = R_{view}T_{view} Mview=RviewTview(摄像机的变换可以给分解为旋转和平移两种变换)。
- 把整个世界都移动,让摄像机的位置处于原点;再对世界旋转,把摄像机的 gaze 对到 z轴上。但是,对于把 gaze 旋转到 z 轴,Up 旋转到 y 轴。这是一件很难的事情:所以,我们考虑求摄像机的旋转矩阵的逆矩阵,因为本身它的 基向量 就是 正交向量。所以它的逆向量就是 他的转置矩阵。
T v i e w = [ 1 0 0 − x e 0 1 0 − y e 0 0 1 − z e 0 0 0 1 ] R v i e w = [ x g ^ × t ^ x t x − g − x e y g ^ × t ^ y t y − g − y e z g ^ × t ^ z t z − g − z e 0 0 0 1 ] T_{view}=\left[ \begin{matrix} 1& 0& 0& -x_e\\ 0& 1& 0& -y_e\\ 0& 0& 1& -z_e\\ 0& 0& 0& 1\\ \end{matrix} \right] \\ \\ R_{view}=\left[ \begin{matrix} x_{\hat{g}\times \hat{t}}& x_t& x_{-g}& -x_e\\ y_{\hat{g}\times \hat{t}}& y_t& y_{-g}& -y_e\\ z_{\hat{g}\times \hat{t}}& z_t& z_{-g}& -z_e\\ 0& 0& 0& 1\\ \end{matrix} \right] Tview=⎣ ⎡100001000010−xe−ye−ze1⎦ ⎤Rview=⎣ ⎡xg^×t^yg^×t^zg^×t^0xtytzt0x−gy−gz−g0−xe−ye−ze1⎦ ⎤
3、投影变换
![image-20220525161949814](assets/image-20220525161949814.png)
①正交投影
要做的操作比较简单:首先平移到原点,然后将整个投影的视野缩放到一个小立方体里。
②透视投影
我们是把整个的 视椎体 挤压成半个立方体,计算的到 视椎体 中到立方体中的映射。而《GAMES101》保持近截面不变,远截面挤压成 近截面 的大小 ,让 视野 挤压成一个立方体。然后剩下的做法就和 正交投影一样的了。
其中,视椎体中任意坐标的 x,y 值都很容易用 相似三角形 来获得
然后,我们在齐次坐标系中,四个数都同时乘以一个数,实际上整个坐标都没有改变。
根据我们投影的向量的变化,我们能够反推出这个变换矩阵的部分的数值,留下第三行还暂时不能确定。
我们又利用这个挤压变换过程两个性质:任何在近截面点的 z 值不会变化;任何在远截面的点的 z 值不会变换。
带入近截面的点(其坐标 z值 一定是 n):
带入远截面的点(其坐标 z值 一定是 f):
这样,我们的两个方程,就能求到
M
p
e
r
s
p
−
>
o
r
t
h
o
M_{persp->ortho}
Mpersp−>ortho 这个变换矩阵的所有项了。之后就再做正交投影就行了。