本页目录

【GAMES101】Transformation

2D变换

缩放 Scale

img

切变 Shear

时水平偏移是

时水平偏移是

垂直偏移总是

img

旋转 Rotate

img

平移 Translation - 引入齐次坐标

下面这个简单的平面平移变换并不能用2维矩阵表示:

img

引入齐次坐标

我们不希望将平移操作看待为一个特例,而是想要找到一个统一的、适用于各种变换的方法。
这个解决方案就是引入齐次坐标Homogeneous Coordinates

现在我们用3个维度来表示一个2D的点或向量:

2D点:

2D向量:

理解最后一个维度

对于点和向量的运算,下表的结论是显然成立的:

运算

结果

向量 + 向量

向量

点 - 点

向量

点 + 向量

点 + 点

无意义

通过最后一个维度是分别表达点或向量,可以满足上述性质。

此时平移变换就可以表示为:

在齐次坐标下,前面提及的变换都可以表示为矩阵

组合变换

组合变换的矩阵顺序会影响结果,应该从右至左结合。
对于一点先应用,再应用,最后应用,应该写为:

3D变换

一般形式

由2D变换推广而来,在齐次坐标下3D变换的一般形式可以表示为:

3D旋转

绕坐标轴旋转

任意旋转

任何3D旋转都可以由上面三个基本矩阵得到:

罗德里格旋转公式

绕旋转轴旋转的旋转矩阵:

MVP变换

引入

图形学中将3D空间的物体展现在2D屏幕上有十分重要的三个变换,以拍照片为例子,三个步骤是:

找到一个好场景,并安排好要拍照的人或物品(模型变换Model Transformation

找到一个好角度放置相机(视图变换View Transformation

按下快门,得到照片(投影变换Projection Transformation

模型变换

3D物体有基于自身的坐标系表示,原点是只与这个物体有关的某个指定参考点。其他顶点的坐标值都是相对于这个原点而言的。

然后,将模型摆放到世界空间中指定的位置,需要依次进行缩放、旋转、平移操作,也就是:

变换前:模型空间(Local Space)
变换后:世界空间(World Space)

视图变换

确定一个相机需要三个向量:
相机位置、观测方向(相机对着哪儿拍?)、向上方向(横着,竖着,还是斜着拍?)

通常约定相机固定在原点,观测方向,向上方向为
现在试着将上面描述的相机移动到约定位置,我们需要以下步骤:

平移相机原本的中心点到原点;

旋转观测方向

旋转向上方向

假设上述三个步骤可以用矩阵表示,显然它们可以拆解为先平移、再旋转两步,也就是
显然有:

接下来考虑旋转:我们想把方向旋转到,那么同时也会把方向旋转到。然而这个变换并不好直接写出。因此我们现在考虑旋转操作的逆变换

的操作就是把方向旋转到

旋转矩阵是正交阵,其转置等于逆,因此有:

变换前:世界空间(World Space)
变换后:观察空间(View Space)

投影变换

img

投影变换有如上图两种:正交投影(Orthographic Projection)透视投影(Perspective Projection)

正交投影

简单理解来说,正交投影的结果相当于直接丢弃了坐标,“拍扁”在平面上。

正交投影更正式的做法是,我们希望将一个空间中的立方体变换至

这个过程可以分解为两步:先将立方体移动至中心与原点重合,再将各轴缩放至范围。用矩阵表示为:

透视投影

透视投影符合近大远小的视觉效果,观感上更为自然。透视投影可以首先将视锥体(View Frustum)“挤压”至长方体内,再应用正交投影:

img

变换前:观察空间(View Space)
变换后:裁剪空间(Clip Space)

视口变换

视口变换希望在平面上将变换至屏幕上,这个矩阵是:

无论正交投影还是透视投影,物体在视锥体之外的部分将会变得不可见,这也是裁剪空间的得名。

变换前:裁剪空间(Clip Space)
变换后:屏幕空间(Screen Space)