问题:两条平行线可以相交于一点
在欧氏空间(几何),同一平面的两条平行线不能相交,或永远不能相遇。这是我们都熟悉的常识。
然而,在透视空间里面,两条平行线可以相交,例如:在下图中,火车轨道离我们的视线越远,变得越窄。最后,两条平行线相交于地平线处,即无穷远处的一点。
欧氏空间(或笛卡尔空间)描述 2D / 3D 几何非常适合,但是这种方法却不适合处理透视空间的问题(实际上,欧氏几何是透视几何的一个子集合),2D 点的笛卡尔坐标可以表示为 (x,y) ( x , y ) 。
如果一个点在无穷远处,这个点的坐标将会是 (∞,∞) ( ∞ , ∞ ) ,在欧氏空间,这变得没有意义。平行线在透视空间的无穷远处交于一点,但是在欧氏空间却不能。数学家发现了一种方法来解决这个问题。
方法:齐次坐标
August Ferdinand Möbius 引入了齐次坐标,使得在透视空间进行图形和几何计算成为可能。齐次坐标是一种使用N+1个数来代表N维坐标的方法。
为了构建 2D 齐次坐标,我们可以在现有笛卡尔坐标基础上,加一个额外的变量
w
w
。因此,笛卡尔坐标系内的点 在齐次坐标系里面变成了
(x,y,z)
(
x
,
y
,
z
)
,并且有
比如,笛卡尔坐标系下的点(1,2)的齐次坐标可以表示为(1,2,1)。如果点(1,2)移动到无限远处,在笛卡尔坐标下它变为 (∞,∞) ( ∞ , ∞ ) ,然后它的齐次坐标表示为(1,2,0),因为 (1/0,2/0)≈(∞,∞) ( 1/0,2/ 0 ) ≈ ( ∞ , ∞ ) 。注意,我们可以不用 “ ∞ ∞ “ 来表示一个无穷远处的点了。
为什么叫齐次坐标?
如上所述,为了将齐次坐标
(x,y,z)
(
x
,
y
,
z
)
转化为笛卡尔坐标
(X,Y)
(
X
,
Y
)
,只需将
x
x
和 除以
w
w
即可:
转化齐次坐标到笛卡尔坐标的过程中,我们有一个重要发现,请看下面的例子:
你会发现点 (1, 2, 3) , (2, 4, 6) 和 (4, 8, 12) 对应同一个欧氏空间点 (1/3, 2/3)。在欧氏空间中,任何标量乘积,如(1a, 2a, 3a) 对应同一个点 (1/3, 2/3) 。因此,这些点是“齐次的” (译者注:含有“同类”的意思),因为他们表示欧氏空间(或笛卡尔空间)里面的同一个点。换句话说,齐次坐标有尺度不变性。
证明:两条直线可以相交
考虑欧氏空间中的线性方程组:
我们知道如果C ≠ D,上述方程组无解。如果C=D,两条直线为同一条直线(重叠)。我们在透视空间重写上述方程式,用齐次坐标
x/w
x
/
w
,
y/w
y
/
w
代替
x
x
, ,
现在我们有一个解 (x,y,0) ( x , y , 0 ) ,因为 (C−D)w=0 ( C − D ) w = 0 ,所以 w=0 w = 0 。因此,两条直线相交于 (x,y,0) ( x , y , 0 ) ,这个点在无穷远处。
在诸如将 3D 场景投影到 2D 平面的过程中,齐次坐标是一个非常有用和基础的计算机图形学概念。