US2S1L16——正交投影变换

正交投影变换

  • 获取正交投影的摄像机重要参数

    • Size:视锥体竖直向上高度的一半
    • Near:近裁剪面离摄像机的距离
    • Far:远裁剪面离摄像机的距离
    • Aspect:屏幕宽高比
    • 远近裁剪面的高 = 2Size2 \cdot Size
    • 远近裁剪面的宽 = 2AspectSize2 \cdot Aspect \cdot Size
  • 正交投影变换到裁剪空间的矩阵:

    1. 将视锥体中心位移到观察空间原点中心
    2. 将长方体视锥体的x,y,zx,y,z坐标范围映射到(-1,1)长宽高为2的正方体中

    得到了最终的变换矩阵:

    (1Aspect×Size00001Size00002FarNearNear+FarFarNear0001)\begin{pmatrix} \frac{1}{Aspect \times Size} & 0 & 0 & 0 \\ 0 & \frac{1}{Size} & 0 & 0 \\ 0 & 0 & -\frac{2}{Far - Near} & -\frac{Near+Far}{Far - Near} \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

明确正交投影变换目标

我们这节课的目标就是要得到 将摄像机视锥体的 正交投影 空间 转换到 齐次坐标裁剪空间 时的 变换矩阵

image

我们可以将其分成两步来完成:

  1. 将视锥体中心位移到观察空间原点中心
  2. 将长方体视锥体的​**x,y,zx,y,z坐标范围映射到(1,1)(-1,1)长宽高为2的正方体中**

image

Unity中正交投影重要参数

Camera详细参数可见:U1L10-1——Camera可编辑参数相关,正交投影相关具体参数:Projection,Clipping Planes

image

image

  • Projection - 摄像机投影模式

    • Perspective 透视模式

    • orthographic 正交摄像机(一般用于2D游戏制作)

      • Size - 摄制范围
  • Clipping Planes - 裁剪平面距离

    • Near:近裁剪面离摄像机的距离
    • Far:远裁剪面离摄像机的距离

利用已知参数,获取到远近裁剪面的高度

  • 已知:

    Size:视锥体竖直方向上高度的一半

  • 可得:

    近裁剪面高 = 2 * Size
    远裁剪面高 = 2 * Size

现在我们已经可以得到:近裁剪面高 = 远裁剪面高 = 2 * Size

我们还可以知道远近裁剪面的宽,可以通过摄像机参数Camera.aspect​得到Game窗口的宽高比

1
print(Camera.main.aspect);

Aspect = 宽 : 高 = 宽 / 高

因此可以得到:近裁剪面高 = 远裁剪面高 = Aspect * 2 * Size

于是,现在我们就可以得到在观察空间下,视锥体各个点的坐标:

image

正交投影变换矩阵

我们已经知道,我们需要通过以下两步来进行矩阵变换:

  1. 将视锥体中心位移到观察空间原点中心

    image

    • 我们只需要对视锥体进行 ZZ 方向的平移,XYX、Y 方向是不需要变换的。
      因此第一步的变换矩阵的结构一定是一个平移矩阵:

      (10000100001Z0001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & Z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

      我们只需要求出该平移变换矩阵中 ZZ 应该平移多少即可

    • 已知远近裁剪面离摄像机的距离为 NearNearFarFar ,而观察空间中 ZZ 方向是摄像机后方,
      因此可知 视锥体中心点的 ZZ 坐标为:

      Z=(Near)+(Far)2Z = \frac{(-Near)+(-Far)}{2}

      知道了视锥体中心点的 ZZ 坐标,那么我们只需要将视锥体平移 (Near)+(Far)2-\frac{(-Near)+(-Far)}{2} 个单位即可

      所以,平移矩阵为:

      (10000100001Z0001)=(10000100001(Near)+(Far)20001)=(10000100001Near+Far20001)\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & Z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & -\frac{(-Near)+(-Far)}{2} \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & \frac{Near+Far}{2} \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

  2. 将长方体视锥体的x,y,zx,y,z坐标范围映射到(1,1)(-1,1)长宽高为2的正方体中

    我们可以得到观察空间中的xyz和齐次坐标系中x,y,zx,y,z的关系如下图:

    image

    根据这个关系图,可以得到一些转换公式:

    {X=22×Aspect×SizeXY=22×SizeYZ未取反=2Near(Far)Z=2FarNearZ\begin{cases} X_齐 = \frac{2}{2 \times Aspect \times Size} X_观 \\ Y_齐 = \frac{2}{2 \times Size} Y_观 \\ Z_{未取反} = \frac{2}{-Near - (-Far)} Z_观 = \frac{2}{Far - Near} Z_观 \end{cases}

    image

    由于要将右手坐标系(观察空间)转换为左手坐标系(裁剪空间),因此要对z轴取反,最终得到公式:

    {X=22×Aspect×SizeX=1Aspect×SizeXY=22×SizeY=1SizeYZ=2FarNearZ\begin{cases} X_齐 = \frac{2}{2 \times Aspect \times Size} X_观 = \frac{1}{Aspect \times Size} X_观 \\ Y_齐 = \frac{2}{2 \times Size} Y_观 = \frac{1}{Size} Y_观 \\ Z_齐 = -\frac{2}{Far - Near} Z_观 \end{cases}

    不难发现,这其实就是一个缩放变换,因此根据上面的公式,得到一个缩放矩阵:

    (1Aspect×Size00001Size00002FarNear00001)\begin{pmatrix} \frac{1}{Aspect \times Size} & 0 & 0 & 0 \\ 0 & \frac{1}{Size} & 0 & 0 \\ 0 & 0 & -\frac{2}{Far - Near} & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}

我们现在得到了两步的对应平移平移矩阵和缩放矩阵,我们将其进行乘法计算后,
便可以得到将摄像机视锥体的 正交投影空间 转换到 齐次坐标裁剪空间 时的变换矩阵

(1Aspect×Size00001Size00002FarNear00001)(10000100001Near+Far20001)=(1Aspect×Size00001Size00002FarNearNear+FarFarNear0001)\begin{pmatrix} \frac{1}{Aspect \times Size} & 0 & 0 & 0 \\ 0 & \frac{1}{Size} & 0 & 0 \\ 0 & 0 & -\frac{2}{Far - Near} & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & \frac{Near+Far}{2} \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} = \begin{pmatrix} \frac{1}{Aspect \times Size} & 0 & 0 & 0 \\ 0 & \frac{1}{Size} & 0 & 0 \\ 0 & 0 & -\frac{2}{Far - Near} & -\frac{Near+Far}{Far - Near} \\ 0 & 0 & 0 & 1 \\ \end{pmatrix}