GAMES101-Lecture 3~4 变换

现代计算机图形学入门-闫令琪,课程笔记。

Lecture 3~4 Transformation 变换

什么是变换?为什么要学习变换?

  • 动画都是由各种各样的变换组合在一起的;
  • 三维物体投影到二维平面就是变换的一种;

此外,在数学层面,可以将变换理解为函数,不需要关心中间发生了什么,只关心输入和输出的结果,输入向量输出的也是向量。之所以使用不同的术语,是因为变换这个词更能体现运动的意思,可以理解为点或向量在坐标系上的运动。🥳

_几何形式表现_
_矩阵形式表现(与上图无联系)_

图形学中涉及的变换就是物体的原始坐标转变为屏幕坐标的一系列过程,主要涉及以下几个步骤:

  1. 模型变换 Modeling transformation
  2. 相机变换 Camera transformation
  3. 投影变换 Projection transformation
  4. 视口变换 Viewport transformation
_虎书 Figure 7.2_

以拍照做类比,更容易理解图形学中经典的 MVP(model、view、projection)。

  • 人们聚在一个地方 (model transformation)
  • 确定相机的位置 (view transformation)
  • 咔嚓!(projection transformation)

二维模型变换 2D Modeling transformations

首先我们要将常见的几种二维变换方式以数学语言的方式表示出来,这其中主要是找到坐标的变化规律。

其实前面讲到的几种变换都属于线性变换,如果在笛卡尔坐标上展示的话就是:直线变换之后还是直线且原点不会变化。线性变化可以很方便的使用矩阵的形式来表示和计算,可以观看 3Blue1Brown 的这个视频 帮助理解。

墙裂推荐看完 3Blue1Brown 关于线性代数的这个 视频合集,肥肠有帮助!🍺

缩放 Scale:坐标 (x, y) 中 x, y 分别缩放 Sx, Sy 倍,以等式的形式表示就是:

  • X′ = SxX + 0
  • Y′ = 0 + SyY

以矩阵的形式表示就是:

镜像 Reflection:以 Y 轴为轴做镜像时,x 的坐标就成了负值,以矩阵的形式表示就是:

切变 Shear:y 轴的值不变,x 轴坐标变为 x + a*x,以矩阵形式表示:

旋转 Rotation:推导过程:先列出公式的大概样子,然后以特殊点的坐标 (0, 1), (1, 0) 去反推公式中的四个未知数 ABCD。

总结:以上几种变换形式都是线性变换,都可以使用矩阵 x 向量的变换矩阵来描述,不同变换对应的 a,b,c,d 约束不同。

此外还有一种变换——平移,他属于仿射变换。平移变换时图形的原点发生了变化,所以不属于线性变换,不遵循上面公式的规律

为了让所有的变换形式保持统一的公式样式以便于批量处理,我们需要引入新的工具来解决这个问题,这个工具就是齐次坐标!

齐次坐标 Homogeneous coordinates

齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示。

向量和点,在二维坐标系中都可以使用 (X, Y) 的形式来表示,在三维他们分别这样表示 (X, Y, 0),(X, Y, 1)。

此时刚才线性变换的变换矩阵就会变成下图所示,不同变换的 a,b,c,d,e,f 约束不同。

而此时,仿射变换也可以写成一样的变换矩阵:

此时问题解决。刚才不同类型的线性变换转换为 3x3 矩阵之后如下所示:

维基百科的这张图片很好的总结了上面讲到的各种 2D 变换所对应的变换矩阵:

组合变换 Composing transforms

  • 顺序不能变,没有交换律
  • 矩阵计算从右到左
  • 使用齐次坐标计算时,向量左侧的矩阵将始终是 3x3 矩阵,所以复合变换的过程可以只用一个 3x3 的矩阵来表示!

分解变换 Decomposing Complex Transforms

如图,以不在原点的点旋转时,可以先将这个点移动到原点,再去旋转,然后再平移回去。

三维模型变换 3D Modeling transformations

与 2D 类似,三维空间中的点和向量可以使用四维的矩阵来表示(齐次坐标):

  • 需要注意的是左侧矩阵的计算顺序,先红后黄(就是结合律拆开了,两个矩阵从右向左计算)。
  • 二维空间中,我们刚刚已经计算出的线性变换的矩阵转换成四维空间,如下所示
_缩放_
_平移_

旋转变换需要考虑的多一些,先看绕轴旋转:

_绕 X 轴旋转,x 轴坐标不变(标红部分)_
_绕 Z 轴旋转,Z 轴坐标不变(标红部分)_
_绕 Y 轴旋转略有不同_

任意角度任意方向的旋转可以视为绕轴旋转的组合:

_常见的解决方式是欧拉角,用于表示一个定点沿三个轴旋转的描述_

罗德里格斯旋转公式,将任意角度的旋转总结成了一个矩阵表达式:

  • 此处的旋转轴 n 与起点有关,不能简单的使用向量来表示,默认为过原点的轴。
  • 若旋转时不在原点,可平移至原点,旋转后再平移回去。

更复杂的三维旋转需要引入四元数解决,这里没有展开讲。

相机变换 Camera transformation

首先相机需要定义三个属性才能确定拍出来的照片是正确的:

  • 相机的位置 e;
  • 相机看向物体的方向:假设为向量 g;
  • 相机向上的方向,向量 t(否则相机有可能以向量 g 为轴进行旋转);
_示意图 01_
_示意图 02_

其次,如果相机和物体一起运动的话,拍照的效果是一样的,因为相对静止。

_示意图 03_

基于以上两点,为了方便计算,我们约定始终将相机放置在坐标的原点,相机指向 -Z 方向,相机上方为 Y 轴方向。

_示意图 04_
_示意图 05_

下面解决这样一个问题,从示意图 02示意图 04 如何变换?

具体过程是将 e 点移动到原点,三个轴旋转到 XYZ 轴,可以使用一个变换矩阵 M 来表示。M=RT,其中 R 为三个轴的旋转矩阵,T 为 e 点的平移矩阵,先平移,后旋转。

根据前面所讲的,平移矩阵比较简单:

旋转矩阵:把 etg 旋转到 XYZ 不好计算,但可以求出 XYZ 旋转到 etg 的矩阵,然后将求得的矩阵转置(求逆)即可!

投影变换 Projection transformation

包括透视投影 (Perspective projection) 和正交投影 (Orthographic projection)。

透视投影和正交投影示意图,stackoverflow

正交投影 Orthographic projection

  • 远近大小一致
  • 一般用于工程视图(CAD)

一个简单的理解正交投影的方式:所有物体的Z 值丢掉就好了,如下图。

但实际计算时,这种方式其实并不容易,使用更多的以下这个方法:

首先,为了投影后的物体坐标可以更方便的投影到屏幕的二维坐标上,我们会定义一个标准视体 (canonical view volume / canonical cube),它的边长为 2,中心点在坐标系的原点,这个立方体内的所有点都符合 (x, y, z) ∈ [−1, 1]3

如何投影到屏幕的二维坐标上下一章讲。

_虎书 Figure 7.3_

当物体做正交投影时,并不一定就在标准视体中,此时我们会再定义一个立方体,一个刚刚好框住物体的立方体,就叫它正交视体 (orthographic view volume)。然后使用 [l, r] × [b, t] × [f, n] 来描述正交视体的顶点坐标。

此时,我们只需将正交视体的中心平移至原点,然后各边缩放至与标准视体一致,即可实现正交投影。

矩阵表示:

透视投影 Perspective projection

  • 近大远小
  • 更符合人眼的观察习惯,更逼真

透视投影就不能使用正交视体了,我们会定义一个框住物体的椎体,叫做视锥 (frustum)。视锥有两个面,远平面和近平面。

透视投影的过程可以理解为,远平面以及视锥内物体上的坐标点,缩放为与近平面一般大小(Z 值不需变化),然后进行正交投影。

_虎书 Figure 7.12_

如何定义一个视锥?

先说明几个概念:

  • Vfov:近平面上下两条边的中点到相机所形成的的夹角;
  • Hfov:近平面左右两条边的中点到相机所形成的的夹角;
  • aspect ratio:近平面的宽高比;

有了以上几个概念,就可以计算出 l, r, b, t 四个变量(推导要用)。

用矩阵表示:

正交投影变换矩阵 (ortho) 上面已经有了,那如何获得缩放变换的矩阵?我们可以先使用相似三角形原理获得远平面与近平面的对应关系。

此时:X' = nX/Z, Y' = nY/Z. 转为齐次坐标后,每一行与 Z相乘,点的位置不会发生变化,如下所示:

此时可以逆推出缩放变换矩阵的一部分:

第三行在推导之前有两个前提条件:

  • Any point on the near plane will not change
  • Any point’s z on the far plane will not change

然而这个推导过程我并没有理解,老师最后只是用了两个特殊的点就推导出了公式中的未知数,这样可以??先不记了,todo 吧😑

视口变换 Viewport transformation

Viewport transformation 这一步是在透视投影之后的立方体转换为屏幕坐标点,其实就是光栅化的过程,老师单独开了一课,我们下一章见~