0%

【Games 101】Lec 04:变换(续)

Lecture 04 : Transformation Cont.

概述

  • View / Camera transformation:视图变换 / 相机变换

  • Projection transformation:投影变换

图形学:正交/透视投影矩阵的推导(多个思路) - 知乎 (zhihu.com)

上面这一边里面讲的非常清楚了 !

视图变换

试图变换是什么?

三元素 :

  • 把场景搭好(model transformation,模型变换
  • 找一个好的角度,把相机放好(view transformation,视图变换
  • 然后拍照(projection transformation,投影变换
    简称 MVP 变换

特别解释 :

  1. 位置:这个没啥好说的…就是一个坐标
  2. 凝视方向:也就是向哪里看,这里其实包含了两个方向,我们把头当作摄像机,那么凝视方向就包含了我们头左右看上下看的元素(不歪头)
  3. 向上方向:这个不是说向上看的意思…还是把我们的头当作摄像机,当我们确定了头的位置和凝视方向时,当我们歪头时,我们可以发现我们看到的还是不同的,所以我们还需要一个元素来约束;这里引入一个始终垂直于我们头顶的法向量,这个法向量指向的方向就是向上方向,当我们歪头时,这个法向量也不同;

因此,通过上面这3个元素,我们可以唯一确定相机看到的图像!!!

如何进行视图变换?

首先我们将相机定,其他东西都随相机移动;
(固定指的是:相机在0 0 0处,且x向前,y向上,-z向右)

具体操作:(初始相机在e点,看向g,向上是t,g叉乘t对应着x)

  • 先平移到 0 0 0
  • 将 g 旋转到 -z
  • 将 t 旋转到 y
  • 最后将 g 叉乘 t 旋转到 x

下面是矩阵表示

直接求这个变换矩阵的话不太好求,我们可以反过来想:

将(x、y、-z)旋转到(g x t、t、g),得到旋转矩阵,将这个旋转矩阵求逆就是我们结果,注意到上节课的性质,这种变换的矩阵是正交矩阵,即 矩阵的逆<=>矩阵的转置,所以直接求矩阵的转置就行。

投影变换

正交投影

近大远小效果

假设相机在 0 0 0 处,且看向-z方向,向右是x,向上是y;那么将相机x y范围内的的物体的z方向去掉得到的图像就是正交投影

更加规范的

  1. 先将物体的中心移到原点0 0 0
  2. 将物体进行缩放,缩放到(-1,1)³的立方体中
    (这里长方体等物体会变得不一样… 后面会将再一次拉伸 ( 视口变换 )…)

透视投影

**概述 : **

近大远小效果

回顾一下,前面我们讲了,齐次坐标(用四个数表示三维空间中的 点/向量)

如何进行透视投影?

还是那个问题,正面不好想,我们反着想;

透视投影要做的是将平面变成进平面 ( 挤压 ) ;

也就是如何 透视投影 -> 正交投影,得到变换矩阵之后;求这个变换矩阵的逆,那么这个逆就是 正交投影 -> 透视投影 的结果。

透视投影 -> 正交投影

  1. 将 透视投影 的梯形体挤压成长方体(近平面不变,远平面挤压,且远平面的z不变,且远平面的中心点的坐标仍然不变)
  2. 做一遍正交投影

**具体分析 : **

第二步是比较简单的,上面说过了;

下面分析第一步要怎么做???

首先我们要明确一下我们的问题,现在的问题是:

如何将在透视投影中的点(x y z)变换为正交投影中的点(x’ y’ z’),也就是 透视投影 -> 正交投影 的变换矩阵

首先我们可以发现变换时点在z轴上的变换是比较难求的,这里我们先不考虑z轴的情况,后面再求;

我们先看x轴和y轴的情况,可以发现他们形成一个相似三角形,因此 x’ x,y’ y 的关系很容易就知道了!

前面说过,齐次坐标下,每个数都同时乘上同一个数,这个点/向量不变的,表示的还是那个点;所以我们可以进一步的变换:

接着我们试着反推一下这个变换矩阵:(什么样的矩阵 乘上 透视时的点 会变成 正交时的点?)

可以发现,我们可以得到这个变换矩阵的大部分信息:

由于我们把这个z轴给展示不管了,所以导致这个变换矩阵的第三行是未知的;现在我们需要通过一些性质去把第三行解出来;可以发现在变换前后有这样两个性质

  • 变换前后,平面上的点是不变的(x y z都不变);
  • 变换前后,平面上的中心点是不变的(x y z都不变);

我们先利用第一个性质,假设在近平面上有一个点(x y n 1),那么变换之后还是(x y n 1),变换一下为(nx ny n² n);

利用上面的残缺矩阵,我们可知:

(????)(x y n 1)转置 = (nx ny n² n)转置

从而我们可以推出第三行:

同时得到一个方程:

接着我们利用第二个性质:远平面上的中心点为(0 0 f 1),变换后还是(0 0 f 1),同理变换一下(0 0 f² f)

同样,我们可以的到一个方程:

也就是说我们有两个未知数A B,有两个方程,这样就能解除A B,从而得到我们的变换矩阵了!

分析结束!!!

注意 :

到这里 , 我们只是求出了 透视投影压缩变换 , 也就是 透视投影 -> 正交投影 ;

所以如果要求透视投影矩阵 , 我们还需要乘上一个 正交投影矩阵 :

具体的话可以再看一下这篇文章的分析 :

图形学:正交/透视投影矩阵的推导(多个思路) - 知乎 (zhihu.com)

**思考 : **

在近平面和远平面之间的点,从透视投影 -> 正交投影的过程中,它们的z轴是向近缩,还是向远拉伸???

题解

离相机更远(更靠近远平面)

GANES101 透视投影的理解

欢迎关注我的其它发布渠道