首页 关于
树枝想去撕裂天空 / 却只戳了几个微小的窟窿 / 它透出天外的光亮 / 人们把它叫做月亮和星星
目录

3D射影空间中的直线

前文提到,三维空间下的点和直线都只有三个自由度,可以直接通过欧式空间的三维直角坐标,或者射影空间的四维齐次坐标来表示。 三维空间中的刚体则有六个自由度,需要通过旋转和平移来描述它的姿态。 而三维空间中的直线,只有四个自由度。处于一种中间的状态,所以它的数学描述相对复杂一点。

早在 19 世纪数学家 Julius Plücker 就开发出了普吕克坐标,可以方便的描述三维空间中的直线。它具有很好的数学计算特性,能够清晰描述直线与点/平面之间的关系。 此外普吕克坐标也被人们拿来描述作用在刚体上的力和力矩。 在射影空间中为了配合四维齐次坐标表示的点和平面的矩阵运算,人们对普吕克坐标做了一些映射关系,通过 \(4 \times 4\) 的普吕克矩阵来描述直线。

本文中,我们从欧式空间出发,先介绍直线的普吕克坐标定义及相关的几何意义。再扩展到射影空间下介绍普吕克矩阵。

1. 欧式空间下直线的普吕克坐标(Plücker Coordinates)

我们知道,在三维空间中,两个点确定一条直线。再加上一个点确定一个平面。 如右图所示,点 \(\boldsymbol{O} = \begin{bmatrix} 0 & 0 & 0 \end{bmatrix}\) 是空间的原点,它与点 \(\boldsymbol{p}_0 = \begin{bmatrix} x_0 & y_0 & z_0 \end{bmatrix}\) 和 \(\boldsymbol{p}_1 = \begin{bmatrix} x_1 & y_1 & z_1 \end{bmatrix}\) 构成了一个平面。

右图中的直线可以用 \(\boldsymbol{l} = \boldsymbol{p}_1 - \boldsymbol{p}_0\) 和 \(\boldsymbol{m} = \boldsymbol{p}_0 \times \boldsymbol{l}\) 两个向量来表示。 向量 \(\boldsymbol{l}\) 比较好理解,它表示直线的方向。\(\boldsymbol{m}\) 则是一个垂直于平面 \(\boldsymbol{O}\boldsymbol{p}_0 \boldsymbol{p}_1\) 的向量, 通过叉乘 \(\boldsymbol{p}_0 \times \boldsymbol{l}\) 得到。向量 \(\boldsymbol{m}\) 被称为直线的矩(moment)。 我们用符号 \(ℓ:(\boldsymbol{m}, \boldsymbol{l})\) 表示空间中的一条直线,这种表示方式就是直线的普吕克坐标。

实际上,直线的普吕克坐标与直线上点的选择无关。直线\(ℓ\)上任意与\(\boldsymbol{p}_0\)不同的点\(\boldsymbol{p}\),都与向量 \(\boldsymbol{l}\) 构成比例关系, \(\boldsymbol{p} - \boldsymbol{p}_0 = \lambda \boldsymbol{l}\)。因此,有:

$$ \begin{array}{rcl} \boldsymbol{p} \times \boldsymbol{l} & = & \left(\boldsymbol{p}_0 + \left(\boldsymbol{p} - \boldsymbol{p}_0\right) \right) \times \boldsymbol{l} \\ & = & \boldsymbol{p}_0 \times \boldsymbol{l} + \lambda \boldsymbol{l} \times \boldsymbol{l} \\ & = & \boldsymbol{m} \end{array} $$

所以 \(\boldsymbol{p} \times \boldsymbol{l} = \boldsymbol{m}\) 是判定点 \(\boldsymbol{p}_0\) 在直线 \(ℓ:(\boldsymbol{m}, \boldsymbol{l})\) 上的必要条件。 它还是点在直线上的充分条件。如果点 \(\boldsymbol{p}\) 满足 \(\boldsymbol{p} \times \boldsymbol{l} = \boldsymbol{m}\), 那么有 \(\left(\boldsymbol{p} - \boldsymbol{p}_0\right) \times \boldsymbol{l} = \boldsymbol{0}\), 即矢量 \(\boldsymbol{p} - \boldsymbol{p}_0\) 与 \(\boldsymbol{l}\) 平行。又因为 \(\boldsymbol{p}_0\) 是 \(ℓ\) 上一点,所以 \(\boldsymbol{p}\) 一定在 \(ℓ\) 上。 因此 \(\boldsymbol{p} \times \boldsymbol{l} = \boldsymbol{m}\) 与点 \(\boldsymbol{p}_0\) 在直线 \(ℓ:(\boldsymbol{m}, \boldsymbol{l})\) 上等价。

如果矢量 \(\boldsymbol{l} = \boldsymbol{p}_1 - \boldsymbol{p}_0\) 的模长为 \(k\),不妨写成 \(\boldsymbol{l} = k\boldsymbol{d}\), 其中 \(\boldsymbol{d}\) 是与 \(\boldsymbol{l}\) 平行的单位向量。那么直线的矩为 \(\boldsymbol{m} = \boldsymbol{p} \times \boldsymbol{l} = k(\boldsymbol{p} \times \boldsymbol{d})\)。令 \(\boldsymbol{m}_d = \boldsymbol{p} \times \boldsymbol{d}\), 则直线 \(ℓ\) 也可以表示为\(k(\boldsymbol{m}_d, \boldsymbol{d})\)。参考齐次坐标, 我们可以无视这个比例系数 \(k\),认为 \((\boldsymbol{m}, \boldsymbol{l})\) 和 \((\boldsymbol{m}_d, \boldsymbol{d})\) 描述的是同一条直线。 所以有些资料里面也会称普吕克坐标为直线的齐次坐标。直线的普吕克坐标虽然有六个参数,但实际上只有四个自由度。 约束那两个冗余的自由度的条件分别是 ① 方向量的模长 ② 矩向量与方向向量的垂直关系。

直线的矩向量 \(\boldsymbol{m}\) 的几何意义有两个方面。其一,描述了原点于直线构成的平面的法向量。这点从它的定义式就可以看出,不再展开。 其二,它的模长反映了原点到直线的距离。

如上右图所示,原点到直线的距离,实际上就是向量 \(\vec{\boldsymbol{O}\boldsymbol{p}_{\bot}}\) 的模长。其中点 \(\boldsymbol{p}_{\bot}\) 是原点在直线 \(ℓ\) 上的垂足。 因为 \(\boldsymbol{p}_{\bot}\) 是直线上的一点,所以有 \(\boldsymbol{m} = \boldsymbol{p}_{\bot} \times \boldsymbol{l}\)。 因此 \(\|\boldsymbol{m}\| = \|\boldsymbol{p}_{\bot}\| \|\boldsymbol{l}\|\)。所以原点到直线的距离 \(d = \|\boldsymbol{p}_{\bot}\| = \|\boldsymbol{m}\| / \|\boldsymbol{l}\|\)。 如果方向向量 \(\boldsymbol{l}\) 是个单位向量,那么矩向量的模长就是原点到直线的距离。

此外,直线的矩向量 \(\boldsymbol{m}\) 与方向向量 \(\boldsymbol{l}\) 不能同时为 0,这不具有任何几何意义。 如果 \(\boldsymbol{m} = \boldsymbol{0}\),\(\boldsymbol{l} \neq \boldsymbol{0}\),那么说明直线经过原点。 如果 \(\boldsymbol{m} \neq \boldsymbol{0}\),\(\boldsymbol{l} = \boldsymbol{0}\),那么对应的直线就是一条无穷远处的直线。

2. 两个平面的交线的普吕克坐标

在欧式空间中,平面可以通过法向量 \(\boldsymbol{n}\) 和一个常数 \(d\) 来表示,有方程 \(\boldsymbol{n} \boldsymbol{x} + d = 0\)。 几何关系上,两个平面相交于一条直线。交线上的点 \(\boldsymbol{x}\) 都能使如下的方程组成立:

$$ \begin{equation}\label{f1} \begin{array}{c} \boldsymbol{n}_1 \boldsymbol{x} + d_1 = 0 \\ \boldsymbol{n}_2 \boldsymbol{x} + d_2 = 0 \\ \end{array} \end{equation} $$

我们知道平面的法向量一定垂直与平面内的任意一条直线,而交线同时存在于两个平面上。所以交线一定与两个平面的法向量垂直。 因此,我们可以通过法向量的叉乘 \(\boldsymbol{n}_1 \times \boldsymbol{n}_2\) 得到交线的方向向量 \(\boldsymbol{l}\)。通过高斯消元法,我们可以去除常数项,得到

$$ d_2 \left(\boldsymbol{n}_1 \boldsymbol{x} + d_1\right) - d_1\left(\boldsymbol{n}_2 \boldsymbol{x} + d_2\right) = 0 \Longrightarrow \underbrace{\left(d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2\right)}_{\boldsymbol{m}}\boldsymbol{x} = 0 $$

上式表明向量 \(\left(d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2\right)\) 与直线上所有点的位置矢量的内积为 0。这意味着,该向量与过原点和交线的平面垂直。 所以 \(\left(d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2\right)\) 与交线的矩向量 \(\boldsymbol{m}\) 的方向一致。根据点在直线上的判定条件, 若 \(ℓ:\left((d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2), \boldsymbol{n}_1 \times \boldsymbol{n}_2\right)\) 是直线的普吕克坐标,还需要满足如下条件:

$$ \boldsymbol{x} \times (\boldsymbol{n}_1 \times \boldsymbol{n}_2) = d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2 $$

又因为,三维向量的叉乘存在关系: \(\boldsymbol{a} \times (\boldsymbol{b} \times \boldsymbol{c}) = (\boldsymbol{a} \cdot \boldsymbol{c})\boldsymbol{b} - (\boldsymbol{a} \cdot \boldsymbol{b}) \boldsymbol{c}\)。 上式左侧展开如下,同时带入平面方程 (\(\ref{f1}\)),有:

$$ \boldsymbol{x} \times (\boldsymbol{n}_1 \times \boldsymbol{n}_2) = (\boldsymbol{x} \cdot \boldsymbol{n}_2)\boldsymbol{n}_1 - (\boldsymbol{x} \cdot \boldsymbol{n}_1) \boldsymbol{n}_2 = d_2\boldsymbol{n}_1 - d_1 \boldsymbol{n}_2 $$

所以,两个平面相交的直线的普吕克坐标就是 \(ℓ:\left((d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2), \boldsymbol{n}_1 \times \boldsymbol{n}_2\right)\), 其中 \((d_2 \boldsymbol{n}_1 - d_1\boldsymbol{n}_2)\) 是直线的矩向量,\(\boldsymbol{n}_1 \times \boldsymbol{n}_2\) 是直线的方向向量。

3. 射影空间下直线的普吕克矩阵(Plücker Matrix)

虽然把直线的普吕克坐标也是齐次的,乘上任意非零的比例系数,描述的还是相同的直线,但是它并不适合直接于点和平面的齐次坐标做矩阵运算。 因为在三维射影空间中,点和平面的齐次坐标有四个数,而直线的普吕克坐标有 6 个数。 为了方便进行矩阵乘法,人们又开发出了普吕克矩阵,用来表述三维射影空间下的直线。

假设空间中有两个不同的点 \(\boldsymbol{p}_0 = \begin{bmatrix} x_0 \\ y_0 \\ z_0 \\ k_0 \end{bmatrix}\) 和 \(\boldsymbol{p}_1 = \begin{bmatrix} x_1 \\ y_1 \\ z_1 \\ k_1 \end{bmatrix}\),那么由这两个点所确定的直线的普吕克矩阵为 \(\boldsymbol{L} = \boldsymbol{p}_0 \boldsymbol{p}_1^T - \boldsymbol{p}_1 \boldsymbol{p}_0^T\),将其展开有

$$ \begin{equation}\label{f2} \boldsymbol{L} = \begin{bmatrix} x_0 x_1 & x_0 y_1 & x_0 z_1 & x_0 k_1 \\ y_0 x_1 & y_0 y_1 & y_0 z_1 & y_0 k_1 \\ z_0 x_1 & z_0 y_1 & z_0 z_1 & z_0 k_1 \\ k_0 x_1 & k_0 y_1 & k_0 z_1 & k_0 k_1 \\ \end{bmatrix} - \begin{bmatrix} x_1 x_0 & x_1 y_0 & x_1 z_0 & x_1 k_0 \\ y_1 x_0 & y_1 y_0 & y_1 z_0 & y_1 k_0 \\ z_1 x_0 & z_1 y_0 & z_1 z_0 & z_1 k_0 \\ k_1 x_0 & k_1 y_0 & k_1 z_0 & k_1 k_0 \\ \end{bmatrix} = \begin{bmatrix} 0 & x_0 y_1 - x_1 y_0 & x_0 z_1 - x_1 z_0 & x_0 k_1 - x_1 k_0 \\ y_0 x_1 - y_1 x_0 & 0 & y_0 z_1 - y_1 z_0 & y_0 k_1 - y_1 k_0 \\ z_0 x_1 - z_1 x_0 & z_0 y_1 - z_1 y_0 & 0 & z_0 k_1 - z_1 k_0 \\ x_1 k_0 - x_0 k_1 & y_1 k_0 - y_0 k_1 & z_1 k_0 - z_0 k_1 & 0 \end{bmatrix} \end{equation} $$

上述普吕克矩阵,可以写成分块的形式:

$$ \begin{equation}\label{f3} \boldsymbol{L} = \begin{bmatrix} \boldsymbol{M}_{3\times 3} & \boldsymbol{\mathcal{L}} \\ -\boldsymbol{\mathcal{L}} & 0 \end{bmatrix} \end{equation} $$

其中,\(\boldsymbol{M}_{3\times 3} = \begin{bmatrix} 0 & x_0 y_1 - x_1 y_0 & x_0 z_1 - x_1 z_0 \\ y_0 x_1 - y_1 x_0 & 0 & y_0 z_1 - y_1 z_0 \\ z_0 x_1 - z_1 x_0 & z_0 y_1 - z_1 y_0 & 0 \end{bmatrix}\) 是一个 斜对称矩阵,只有三个独立的元素, 它与一个三维的向量相乘,相当于两个向量的叉乘。实际上这三个独立元素构成的向量 \(\boldsymbol{m} = \begin{bmatrix} y_0 z_1 - y_1 z_0 \\ -(x_1 z_0 - x_0 z_1) \\ x_0 y_1 - x_1 y_0 \\ \end{bmatrix}\) 正是直线的矩向量。而向量 \(\boldsymbol{\mathcal{L}} = \begin{bmatrix} x_0 k_1 - x_1 k_0 \\ y_0 k_1 - y_1 k_0 \\ z_0 k_1 - z_1 k_0 \\ \end{bmatrix}\) 则是直线的方向向量。此外,根据三维射影空间中,点与平面的对偶关系。我们也可以根据两个平面\(\boldsymbol{P}, \boldsymbol{Q}\)得到一个直线的对偶普吕克矩阵 \(\boldsymbol{L}^* = \boldsymbol{P} \boldsymbol{Q}^T - \boldsymbol{Q} \boldsymbol{P}^T\)。我们只取普吕克矩阵中非对角线上的元素,那么 \(\boldsymbol{L}\) 与 \(\boldsymbol{L}^*\) 之间存在映射关系:

$$ \begin{equation}\label{f4} l_{12}:l_{13}:l_{14}:l_{23}:l_{42}:l_{34} = l_{34}^*:l_{42}^*:l_{23}^*:l_{14}^**:l_{13}^*:l_{12}^* \end{equation} $$

其中,\(l_{ij}\) 为矩阵 \(\boldsymbol{L}\) 中第 \(i\) 行 \(j\) 列的元素,\(l_{ij}^*\) 为矩阵 \(\boldsymbol{L}^*\) 中第 \(i\) 行 \(j\) 列的元素。

4. 完




Copyright @ 高乙超. All Rights Reserved. 京ICP备16033081号-1