概述
MVP变换的目的是将三维的场景,也就是相机看到的场景,转化到裁剪空间中,为光栅化将场景显示到屏幕上做准备。
MVP分别由Model矩阵,View矩阵,Projection矩阵三个齐次坐标矩阵构成。计算出MVP矩阵后并按顺序相乘,再将每个坐标依次乘MVP坐标,就能得到该坐标在裁剪空间中的坐标。
\(MVP=Projection\times View\times Model\)Model矩阵用于把模型放置到场景中
View矩阵用于将相机放到坐标系原点
Projection矩阵用于根据相机的视锥形成裁剪空间
在完成上述步骤后,即MVP变换后,再将裁剪空间进行光栅化,就能得到图像了。
Model模型矩阵
理论
Model为模型矩阵,用来将物体顶点在模型空间下的坐标转换为在世界空间下的坐标。
模型矩阵由三部分构成:平移矩阵、旋转矩阵、缩放矩阵。
模型空间中是以模型的一个顶点为原点建立坐标系的空间,可以理解为模型的自己的空间,每个模型都有自己模型空间。此时模型还未被放入场景中。
世界空间可以理解为场景,世界空间中的坐标原点也就是场景的坐标原点。模型矩阵的作用就是把模型空间中的坐标转换为世界空间中的坐标,也就是将模型放入场景中。
模型放入场景时是要确定放入的位置、模型大小和模型的旋转角度,这也就对应着模型矩阵中的平移矩阵、旋转矩阵、缩放矩阵。
进行完平移、旋转、缩放的变换后,就能确定模型的每个顶点都在场景中的具体位置,即坐标。
如果以上三种变换有缺省的话,比如说不进行缩放变换,即表示模型按照1:1加入到场景。
我们需要知道的是模型空间原点在世界空间中的位置、模型空间坐标系系在世界空间中旋转信息,模型空间坐标系在世界空间中的缩放信息。其实就是平移、旋转、缩放。
公式
模型矩阵=[平移]*[旋转]*[缩放]
在旋转时分为绕X轴、Y轴、Z轴和任意轴旋转。绕任意轴旋转时需要定义旋转轴向量\(\overrightarrow{axis}\)并使用罗德里格斯旋转公式,这里使用该公式为例。
参数
缩放:\(\left(s_x, s_y, s_z\right)\)
旋转:旋转轴\(\overrightarrow{n}=\left(x,y,z\right)\),旋转角度\(\alpha\)
平移:\(\left(t_x, t_y, t_z\right)\)
公式
\(
\mathbf{R}(\mathbf{n}, \alpha)=\cos (\alpha) \mathbf{I}+(1-\cos (\alpha)) \mathbf{n} \mathbf{n}^T+\sin (\alpha) \underbrace{
\begin{bmatrix}
0 & -n_z & n_y \\
n_z & 0 & -n_x \\
-n_y & n_x & 0
\end{bmatrix}
}_{\mathbf{N}}
\)
注意这里的3*3矩阵\(\mathbf{R}(\mathbf{n}, \alpha)\)需要拓展成4*4矩阵\(\mathbf{R’}(\mathbf{n}, \alpha)\)
\(
\mathbf{Model} =
\begin{bmatrix}
1 & 0 & 0 & t_x \\
0 & 1 & 0 & t_y \\
0 & 0 & 1 & t_z \\
0 & 0 & 0 & 1
\end{bmatrix}\mathbf{R’}(\mathbf{n}, \alpha)
\begin{bmatrix}
s_x & 0 & 0 & 0 \\
0 & s_y & 0 & 0 \\
0 & 0 & s_z & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\)
模型矩阵主要是在GAMES101-L03 变换(二维与三维)中说明
View视图矩阵
View为视图矩阵,用来将物体顶点在世界空间下的坐标转换为视图空间下的坐标。
视图空间就是以相机作为坐标系原点建立的空间,目的是简化下一步投影过程中的计算。
视图矩阵就是将场景中、也就是世界空间中所有的坐标,包括相机,进行平移和旋转,使得相机处于标准位:相机处于原点,向-Z方向看,向上方向为Y。
公式
视图矩阵=[旋转]*[平移]
参数
相机位置:\(\overrightarrow{e}=\left(x_e,y_e,z_e\right)\)
相机的视线\(\widehat{g}\)
相机向上方向\(\widehat{t}\)
待完善
公式
\(
\mathbf{View} =
\begin{bmatrix}
x_{\hat{g} \times \hat{t}} & y_{\hat{g} \times \hat{t}} & z_{\hat{g} \times \hat{t}} & 0 \\
x_t & y_t & z_t & 0 \\
x_{-g} & y_{-g} & z_{-g} & 0 \\
0 & 0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
1 & 0 & 0 & -x_e \\
0 & 1 & 0 & -y_e \\
0 & 0 & 1 & -z_e \\
0 & 0 & 0 & 1
\end{bmatrix}
\)
模型矩阵主要是在GAMES101-L04 变换(模型、视图、投影)中说明。
Projection投影矩阵
Projection为投影矩阵,用来将物体顶点在视图空间的坐标转换为裁剪空间的坐标,正交投影矩阵和透视投影矩阵。
投影矩阵由三部分构成:挤压矩阵,平移矩阵,缩放矩阵。
相机的视野是有限的,而相机视野,即能看到的场景,是由视锥决定的,落在视锥中的坐标才能被看见,也就是显示到屏幕上。
视锥有4个参数:垂直可视角,长宽比,近平面,远平面。
进行透视投影的第一步进行挤压,将视锥体,即由近平面和远平面构成的棱台,挤压成视景体,即一个长方体。此时近平面不变,而远平面被挤压成和近平面一样大,且远平面中心保持不变,并且内部不均匀,形成近大远小的效果。
第一步得到的视景体,就和正交投影中的视锥相等了。于是第二步就是进行正交投影。
在进行正交投影前,需要获取视景体的6个信息,即n,f,l,r,t,b,这些信息可以利用视锥的4个参数计算得出。
正交投影分为两步,第一步是将视景体的中心移到坐标原点上,第二步是进行缩放,将视景体缩放到\([-1,1]^3\)大的标准立方中。
由于有之前的视图变换,视景体n、f平面的中心就在Z轴上,所以平移时只需要将视景体沿Z轴平移使中心在坐标原点上。
公式
投影矩阵=[缩放]*[平移]*[挤压]
参数
视锥:
近平面:\(zNear\)
远平面:\(zFar\)
垂直可视角:\(fovY\)
宽高比:\(aspect\)
公式
\(n=zNear\)
\(f=zFar\)
\(t=tan(\frac{fovY}{2} )\times n\)
\(b=-t\)
\(r=aspect\times t\)
\(l=-r\)
\(
\mathbf{Projection} =
\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 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & -\frac{n+f}{2} \\
0 & 0 & 0 & 1
\end{bmatrix}
\begin{bmatrix}
n & 0 & 0 & 0 \\
0 & n & 0 & 0 \\
0 & 0 & n+f & -nf \\
0 & 0 & 1 & 0
\end{bmatrix}=\begin{bmatrix}
\frac{2n}{r-l} & 0 & 0 & 0 \\
0 & \frac{2n}{t-b} & 0 & 0 \\
0 & 0 & \frac{n+f}{n-f} & \frac{-2nf}{n-f} \\
0 & 0 & 1 & 0
\end{bmatrix}
\)
模型矩阵的视锥部分主要是在GAMES101-L05 光栅化(三角形的离散化)中说明,正交投影和透视投影在 GAMES101-L04 变换(模型、视图、投影)中说明 。