跳过正文
  1. Posts/

GAMES101学习笔记04:变换(,模型.视图,投影)

··1436 字·3 分钟·
Xenolies
作者
Xenolies
Keep On Keeping On

MVP变换(Model-View-Projection Matrices)
#

MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。

MVP变换分为三步:

  • 模型变换(model tranformation):将模型空间转换到世界空间(找个好的地方,把所有人集合在一起,摆个pose)
  • 摄像机变换(view tranformation):将世界空间转换到观察空间(找到一个放相机的位置,往某一个角度去看)
  • 投影变换(projection tranformation):将观察空间转换到裁剪空间(茄子!)

视图变换(View)
#

视图变换的目的是变换Camera位置到原点,上方为Y,观察方向为-Z

  • Camera的y轴正方向向上,z轴方向是\(\vec{x} \times \vec{y}\)右手系)

  • 对物体进行运动,摄像机会跟随着一起运动保持相对位置不变

  • 怎么写出数学表示

通过\(V_{\text{view}}\)​变换相机,在数学上怎么表示?

  • 将e平移到零点
  • 旋转g到−Z
  • 旋转t到Y
  • 旋转G x T到X

可以将其拆解成两个部分: 平移+旋转

$$M_{VIEW} = R_{VIEW} T_{VIEW}$$

首先将相机从e平移到标准原点的位置

$$ T_{VIEW} = \begin{bmatrix} 1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

由于旋转矩阵具有正交性,因此它的逆矩阵就等于它的转置矩阵.

$$ \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_t & x_{-g} & 0 \\ y_{\hat{g}\times\hat{t}} & y_t & y_{-g} & 0 \\ z_{\hat{g}\times\hat{t}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} = E \cdot \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_t & x_{-g} & 0 \\ y_{\hat{g}\times\hat{t}} & y_t & y_{-g} & 0 \\ z_{\hat{g}\times\hat{t}} & z_t & z_{-g} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

在通过正交矩阵的性质(正交矩阵的逆等于它的转置矩阵),可以求出:

$$ R_{\text{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} $$

总结:

  • 让物体和相机一起变换。
  • 直到相机位于原点,头朝上(Y),看向 −Z

投影变换(Projection)
#

投影变换分为两种:

  • 正交投影(Orthogonal projection)变换:透视线平行
  • 透视投影(Perspective projection)变换:透视线相交,近大远小

简单来讲,透视投影相当于两点透视或三点透视,有透视畸变。正交投影相当于是基于坐标的轴测图

正交投影 (Orthogonal projection)
#

一种简单的理解方式

  • 相机位于原点,朝向 -Z 方向,向上为 Y 方向

  • 丢弃 Z 坐标

  • 将得到的矩形平移并缩放到 [-1, 1]² 范围内

  • 我们希望将一个长方体区域 [l, r] × [b, t] × [f, n] (左右 X 下上 X 远近)

  • 映射到立方体 [-1, 1]³

方法:

  1. 现将标准立方体拉到原点
  2. 后将x,y,z轴各自**伸缩到[−1,1]

变换顺序:先移动(中点移动到原点),再缩放(基向量缩放比例为\(\frac{2}{\text{长} / \text{宽} / \text{高}}\)

因为相机朝向-z方向(右手系),此时n > f,这也是 OpenGL 用左手系( f > n )的原因。

正交投影矩阵(Orthographic Projection Matrix)
#

$$ M_{\text{ortho}} = \underbrace{ \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} }_{\text{缩放矩阵 } S} \cdot \underbrace{ \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2} \\ 0 & 1 & 0 & -\frac{t+b}{2} \\ 0 & 0 & 1 & -\frac{n+f}{2} \\ 0 & 0 & 0 & 1 \end{bmatrix} }_{\text{平移矩阵 } T} $$

合并后形式

$$ M_{\text{ortho}} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & -\frac{r+l}{r-l} \\ 0 & \frac{2}{t-b} & 0 & -\frac{t+b}{t-b} \\ 0 & 0 & \frac{2}{n-f} & -\frac{n+f}{n-f} \\ 0 & 0 & 0 & 1 \end{bmatrix} $$

参数说明:

  • l, r → 左右边界(left / right)
  • b, t → 下上边界(bottom / top)
  • f, n → 远近裁剪面(far / near),注意在右手系中通常 n > f (如 n = -0.1, f = -100)

透视投影 (Perspective projection)
#