definition
Affine Transformation
Linear Transformation + Translate
线性变换 (Linear Transformation): 你可以对这个网格进行 旋转 (Rotate)、缩放 (Scale)、切变 (Shear)。
Canonical
Coordinate Transformations
我们可以简单地视为“改变该点所处的坐标系”例如,在图
点 $(2, 1)$ 应用了一个“平移 $(-1, 0)$”的变换。右上角的图是当我们把这个变换看作物理运动(点在动)时的心理图像,而右下角的图是当我们把这个变换看作坐标改变(在此例中是坐标原点的移动)时的心理图像。图中那个虚构的边界框仅仅是一种示意手段,在两种情况下,坐标轴和点的相对位置实际上是完全相同的。
我们看到了两种可视化运动的方式。在不同的语境下,这两种解释可能各有优劣(某种解释可能更合适)。
例如,一个驾驶游戏可能包含一个城市的模型和一个汽车的模型。如果呈现给玩家的是透过挡风玻璃向外看的视角,那么车内的物体在屏幕上的绘制位置总是固定的,而随着玩家驾驶,街道和建筑物则显得
在向后移动。在每一帧中,我们都对这些(车外的)物体应用一个变换,使它们比上一帧的位置更靠后。理解这种操作的一种方式是简单地认为它将建筑物向后移动了;另一种理解方式是,建筑物保持静止,但我们想要用来绘制它们的坐标系——即附着在汽车上的坐标系——正在(向前)移动。在第二种解释中,变换是在改变城市几何体的坐标,将其表示为“汽车坐标系”中的坐标。这就导致了(无论你用哪种方式理解),应用在车外几何体上的矩阵都是完全相同的。
如果游戏还支持俯视视角(overhead view)来显示汽车在城市中的位置,那么建筑物和街道就需要绘制在固定的位置,而汽车则需要在每一帧之间移动。同样的两种解释依然适用:我们可以将这种变化的变换理解为将汽车从其规范位置(canonical position,通常指模型原点)移动到世界中的当前位置;或者,我们也可以将其理解为仅仅改变了汽车几何体的坐标表示——即将其原本用“附着在汽车上的坐标系”表示的坐标,转换为用“相对于城市固定的坐标系”来表示。“坐标变换”这种解释方式清楚地表明,在这两种模式(城市到汽车的坐标变换 vs. 汽车到城市的坐标变换)中使用的矩阵,互为逆矩阵。改变坐标系的想法与编程中的类型转换(type conversions)概念非常相似。在我们将一个浮点数与一个整数相加之前,我们需要根据需求将整数转换为浮点数,或者将浮点数转换为整数,以便类型相匹配。同样地,在我们能够将城市和汽车画在一起之前,我们需要根据需求将城市转换为汽车坐标,或者将汽车转换为城市坐标,以便坐标系相匹配。当管理多个坐标系时,很容易混淆并导致物体处于错误的坐标系中,从而使它们出现在意想不到的位置。但只要对坐标系之间的变换进行系统性的思考,你就能可靠地得出正确的变换。在几何上,一个坐标系,或者叫坐标框架(coordinate frame),由一个原点和一个基底(basis)——即一组三个向量——组成。标准正交基(Orthonormal bases)(互相垂直且长度为1)非常方便,因此除非另有说明,我们通常假设坐标框架都是标准正交的。在一个原点为 $\mathbf{p}$ 且基底为 ${\mathbf{u}, \mathbf{v}, \mathbf{w}}$ 的坐标框架中,坐标 $(u, v, w)$ 描述了点:
当我们在计算机中存储这些向量时,它们需要基于某种坐标系来表示。为了开始工作,我们必须指定某种规范坐标系(canonical coordinate system),通常称为‘全局坐标’(global coordinates)或‘世界坐标’(world coordinates),它被用来描述所有其他的坐标系统。在那个城市的例子中,我们可以采用街道网格作为参考,并约定 $x$ 轴沿着主街(Main Street)指向,$y$ 轴指向上方(天空),而 $z$ 轴沿着中央大道(Central Avenue)指向。这样一来,当我们用这些(世界)坐标来写出汽车坐标框架的原点和基底时,我们的意思就很清楚了。
在 2D 中,我们的惯例是使用点 $\mathbf{o}$ 作为原点,并使用 $\mathbf{x}$ 和 $\mathbf{y}$ 作为右手系的规范正交基向量。
点 p 可以用(这两个)坐标系中的任意一个来表示。
另一个坐标系可能拥有原点 $\mathbf{e}$ 以及右手系的规范正交基向量 $\mathbf{u}$ 和 $\mathbf{v}$。请注意,通常情况下,规范数据 $\mathbf{o}, \mathbf{x}, \mathbf{y}$ (指世界坐标原点和轴)从不会被显式地存储。它们是所有其他坐标系的参考系(frame-of-reference)。在该坐标系中,我们通常将 $\mathbf{p}$ 的位置记录为一个有序对,这是完整向量表达式的简写形式:
例如,在上图中,$(xp, y_p) = (2.5, 0.9)$。请注意,这个有序对 $(x_p, y_p)$ 隐式地假设了原点为 $\mathbf{o}$。同样地,我们可以用另一个方程来表示 $\mathbf{p}$:
在上图中,对应的值为 $(u_p, v_p) = (0.5, -0.7)$。同样,原点 $\mathbf{e}$ 被作为与 $\mathbf{u}$ 和 $\mathbf{v}$ 关联的坐标系的一个隐式部分而省略了。我们可以使用矩阵机制来表达同样的这种关系,如下所示:
注意,这里假设我们已经以规范坐标的形式存储了点 $\mathbf{e}$ 以及向量 $\mathbf{u}$ 和 $\mathbf{v}$;$(x, y)$ 坐标系是众系之首(first among equals)。就我们在本章中讨论的基本变换类型而言,这是一个旋转(涉及 $\mathbf{u}$ 和 $\mathbf{v}$),后面紧跟一个平移(涉及 $\mathbf{e}$)。观察这个结合了旋转和平移的矩阵,你会发现它非常容易写出来:我们只需要把 $\mathbf{u}, \mathbf{v}$ 和 $\mathbf{e}$ 填入矩阵的列中,并在第三行填上通常的 $[0\ 0\ 1]$。为了让这一点更清楚,我们可以像这样写出矩阵:$$\mathbf{p}{xy} =
\begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{e} \ 0 & 0 & 1 \end{bmatrix}
\mathbf{p}{uv}.\begin{bmatrix} u_p \ v_p \ 1 \end{bmatrix} =
\begin{bmatrix} x_u & y_u & 0 \ x_v & y_v & 0 \ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} 1 & 0 & -x_e \ 0 & 1 & -y_e \ 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} x_p \ y_p \ 1 \end{bmatrix}.\mathbf{p}{uv} = \begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{e} \ 0 & 0 & 1 \end{bmatrix}^{-1} \mathbf{p}{xy}.\mathbf{p}{uv} = \begin{bmatrix} \mathbf{x}{uv} & \mathbf{y}{uv} & \mathbf{o}{uv} \ 0 & 0 & 1 \end{bmatrix} \mathbf{p}{xy}.\mathbf{p}{uv} = \begin{bmatrix} \mathbf{x}{uv} & \mathbf{y}{uv} & \mathbf{o}{uv} \ 0 & 0 & 1 \end{bmatrix} \mathbf{p}{xy}.\begin{bmatrix} x_p \ y_p \ z_p \ 1 \end{bmatrix} =
\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} x_u & x_v & x_w & 0 \ y_u & y_v & y_w & 0 \ z_u & z_v & z_w & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} u_p \ v_p \ w_p \ 1 \end{bmatrix}
\quad (6.8)\mathbf{p}{xyz} = \begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{w} & \mathbf{e} \ 0 & 0 & 0 & 1 \end{bmatrix} \mathbf{p}{uvw},\begin{bmatrix} u_p \ v_p \ w_p \ 1 \end{bmatrix} =
\begin{bmatrix} x_u & y_u & z_u & 0 \ x_v & y_v & z_v & 0 \ x_w & y_w & z_w & 0 \ 0 & 0 & 0 & 1 \end{bmatrix}
\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} x_p \ y_p \ z_p \ 1 \end{bmatrix}
\quad (6.9)$$$$\mathbf{p}{uvw} = \begin{bmatrix} \mathbf{u} & \mathbf{v} & \mathbf{w} & \mathbf{e} \ 0 & 0 & 0 & 1 \end{bmatrix}^{-1} \mathbf{p}_{xyz}.$$