一直对齐次坐标这个概念的理解不够彻底,只见大部分的书中说道“齐次坐标在仿射变换中非常的方便”,然后就没有了后文,今天在一个叫做“三百年 重生”的博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明,特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。
由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来:
对于一个 向量 v 以及基 oabc ,可以找到一组坐标 (v1,v2,v3) ,使得 v = v1 a + v2 b + v3 c ( 1 )
而对于一个 点 p ,则可以找到一组坐标( p1,p2,p3 ),使得 p – o = p1 a + p2 b + p3 c ( 2 ),
从上面对 向量 和 点 的表达,我们可以看出为了在坐标系中表示一个 点 (如 p ),我们把点的位置看作是对这个基的原点 o 所进行的一个位移,即一个向量—— p – o (有的书中把这样的向量叫做位置向量 ——起始于坐标原点的特殊向量),我们在表达这个向量的同时用等价的方式表达出了点
p:p = o + p1 a + p2 b + p3 c (3)
(1)(3) 是坐标系下表达一个 向量 和点 的不同表达方式。这里可以看出,虽然都是用代数分量的形式表达向量和点,但表达一个点比一个向量需要额外的信息。如果我写出一个代数分量表达 (1, 4, 7) ,谁知道它是个向量还是个点!
我们现在把( 1 )( 3 )写成矩阵的形式:v = (v1 v2 v3 0) X (a b c o)
p = (p1 p2 p3 1) X (a b c o), 这里 (a,b,c,o) 是坐标基矩阵,右边的列向量分别是向量 v 和点 p 在基下的坐标。 这样,向量和点在同一个基下就有了不同的表达:3D 向量 的第 4 个代数分量是 0 ,而 3D 点 的第 4 个代数分量是 1 。像这种这种用 4 个代数分量表示 3D 几何概念的方式是一种齐次坐标表示。
这样,上面的 (1, 4, 7) 如果写成( 1,4,7,0 ),它就是个向量;如果是 (1,4,7,1) ,它就是个点。 下面是如何在普通坐标 (Ordinary Coordinate) 和齐次坐标 (Homogeneous Coordinate) 之间进行转换:
(1) 从普通坐标转换成齐次坐标时
如果 (x,y,z) 是个点,则变为 (x,y,z,1);
如果 (x,y,z) 是个向量,则变为 (x,y,z,0)
(2)从齐次坐标转换成普通坐标时
如果是 (x,y,z,1) ,则知道它是个点,变成 (x,y,z);
如果是 (x,y,z,0) ,则知道它是个向量,仍然变成 (x,y,z)
以上是通过齐次坐标来区分向量和点的方式。从中可以思考得知,对于平移 T 、旋转 R 、缩放 S 这 3 个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向.
而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。
此外,对于一个普通坐标的 点 P=(Px, Py, Pz) ,有对应的一族齐次坐标 (wPx, wPy, wPz, w) ,其中 w 不等于零 。比如, P(1, 4, 7) 的齐次坐 标有 (1, 4, 7, 1) 、( 2, 8, 14, 2 )、( -0.1, -0.4, -0.7, -0.1 )等等 。 因此,如果把一个点从普通坐标变成齐次坐标,给 x,y,z 乘上同一个非零数 w ,然后增加第 4 个分量 w ;如果把一个齐 次坐标转换成普通坐标,把 前三个坐标同时除以第 4 个坐标,然后去掉第 4 个分量。
由于齐次坐标使用了 4 个分量来表达 3D 概念,使得平移变换可以使用矩阵进行,从而如 F.S. Hill, JR 所说,仿射(线性)变换的进行 更加方便。由于图形硬件已经普遍地支持齐次坐标与矩阵乘法,因此更加促进了齐次坐标使用,使得它似乎成为图形学中的一个标准。
以上很好的阐释了齐次坐标的作用及运用齐次坐标的好处。其实在图形学的理论中,很多已经被封装的好的API也是很有研究 的,要想成为一名专业的计算机 图形学 的 学习者,除了知其然必须还得知其所以然。 这样在遇到问题的时候才能迅速定位问题的根源,从而解决问题。