MVP变换总结与补充

概述

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 变换(模型、视图、投影)中说明 。

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇