视锥之内的故事(I):序、仿射空间和参考系


我一直认为图形学是计算机科学中最具魅力的分支,这是因为一方面它将枯燥的数学运算、物理原理、逻辑过程和数据结构以直观的视觉刺激呈现,既模拟了现实世界又在此基础上创造出无数虚拟的宇宙;另一方面,从能量守恒到信号处理再到流体模拟,图形学几乎深入了现代科学的所有领域。但我认为图形学最大的魔力还是用离散的数字系统拟合连续的现实世界——从某种意义上来说也是现代科学最伟大的地方。

我注意到,在中文互联网上和图形学有关的线上教程往往比较混乱,既没有做到比教材简明,也没有做到提供必要的知识。所以如你所见,《视锥之内的故事》是一个与图形学理论相关的系列。在这一系列中,我将尽可能简洁同时简单地阐述图形学的基本原理。这一系列是我献给图形学的一首赞歌。

我们的旅程从空间的描述开始。

仿射空间(Affine space)

n维仿射空间是在n维欧氏空间(记作 $\mathbb{R}^n$ )中定义的点的集合。为了和向量区别开来,我们约定仿射空间中的元素(点)记作 $\tilde{p}$ 。

仿射空间是“纯粹”的空间,这个空间没有定义原点和单位长度。因为空间中没有 $\vec{0}$ ,所以受到线性空间(Linear space)法则(要求 $\vec{0}$ 的存在)约束的向量不能直接在仿射空间中获得表示。但这并不意味着仿射空间与向量是完全无关的——

对于仿射空间 $A$ 和 $\forall \tilde{p}, \tilde{q} \in A$,我们定义:

$$\vec{v} = \tilde{q}-\tilde{p}$$

由此,我们就得到了以 $\tilde{q}$ 为终点,以 $\tilde{p}$ 为起点的向量 $\vec{v}$ ,仿射空间和向量就此联系了起来。事实上,所有的 $\vec{v}$ 张成(span)了伴随仿射空间 $A$ 的线性空间 $\vec{A}$,而这一线性空间和仿射空间是同维度的。一个常见的仿射空间的例子是笛卡尔坐标系下不经过原点的平面表示的空间,例如 $y=2$ 。这一空间中没有原点(至少是形式上的),但是其中的所有点的位置坐标相减都能得到一个伴随的向量空间 $\mathbb{R}^2$ 中的向量。

定义了减法,我们自然可以得到加法:

$$\tilde{p}+\vec{v}=\tilde{q}$$

总结一下,在仿射空间中,点与点相减得到向量,点加上向量得到新的点。但是点与点之间不能相加:考虑现实中的情况,把两个地点相加似乎没有意义,而把两个地点相减似乎就能表示两地的距离。

参考系(Frame)

我们已经了解了仿射空间的概念(不太严格但是管用)和基本的运算性质,但我们依然无法描述仿射空间中物体的位置。表示位置需要一个参照物和相对参照物的观测方向,也就是参考系。尽管仿射空间本身没有原点的存在,但我们却可以定义仿射空间中的某个点为参考系的原点(origin),我们将这个点记作 $\tilde{o}$。对于观测方向,我们定义一组基向量 $\vec{e_1}, \vec{e_2}, …$ 作为这一参考系的坐标轴。那么在仿射空间中的某点的位置就可以表示为:

$$\tilde{p} = \tilde{o} + \sum_{i} c_i \vec{e_i}$$

我们不妨换一种记法:

$$ \begin{bmatrix} E & \tilde{o} \end{bmatrix} \begin{bmatrix} \vec{c} \\ 1 \end{bmatrix} $$

在三维空间中,写作:

$$ \begin{bmatrix} \vec{e_1} & \vec{e_2} & \vec{e_3} & \tilde{o} \end{bmatrix} \begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix} $$

这是不是很熟悉?矩阵 $\begin{bmatrix} \vec{e_1} & \vec{e_2} & \vec{e_3} & \tilde{o} \end{bmatrix}$ 可以类比为线性空间中的基底,它包含了参考系的所有信息:原点位置和单位轴的取向。而相应地,$\begin{bmatrix} c_1 \\ c_2 \\ c_3 \\ 1 \end{bmatrix}$就是这一参考系下指定点的坐标了。

在默认参考系的前提下,为了方便,我们可以直接把坐标记作 $(c_1, c_2, c_3, 1)$ 。我们注意到尽管坐标表示的是三维空间中的点,它们的记法却使用了四个分量。这第四个分量就目前而言只有形式上的用处(稍后会提到),在后来的齐次坐标(homogeneous coordinate)中我们会予以进一步探索。

到目前为止,我们认为所有点的第四个分量都是1。

尽管定义了参考系,这些点依然属于仿射空间,所以它们也满足先前提到的仿射空间的性质。我们不妨对两个点做差:

$$(a_1, a_2, a_3, 1) – (b_1, b_2, b_3, 1) = (a_1-b_1, a_2-b_2, a_3-b_3, 0)$$

注意到第四个分量变为了0。由此我们可以从形式上区分仿射空间中的点和仿射空间的伴随线性空间中的向量。

通过在仿射空间中建立参考系,我们获得了一个既包含坐标轴基向量又包含坐标轴原点的矩阵,这为我们在仿射空间中执行线性空间中难以简易描述,但现实中却很常见的参考系变换(含原点变换)创造了可能。


Leave a Reply

Your email address will not be published.