Wednesday, March 20, 2013

齐次坐标的理解


齐次坐标的理解

     一直对齐次坐标这个概念的理解不够彻底,只见大部分的书中说道“齐次坐标在仿射变换中非常的方便”,然后就没有了后文,今天在一个叫做“三百年 重生”的博客上看到一篇关于透视投影变换的探讨的文章,其中有对齐次坐标有非常精辟的说明,特别是针对这样一句话进行了有力的证明:“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR。
     由于作者对齐次坐标真的解释的不错,我就原封不动的摘抄过来:
     对于一个向量v以及基oabc可以找到一组坐标(v1,v2,v3),使得v = v1 a + v2 b + v3 c          1
 而对于一个p,则可以找到一组坐标(p1,p2,p3),使得 po = 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、缩放S3个最常见的仿射变换,平移变换只对于点才有意义,因为普通向量没有位置概念,只有大小和方向.
 
而旋转和缩放对于向量和点都有意义,你可以用类似上面齐次表示来检测。从中可以看出,齐次坐标用于仿射变换非常方便。
 
此外,对于一个普通坐标的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也是很有研究的,要想成为一名专业的计算机图形学学习者,除了知其然必须还得知其所以然。这样在遇到问题的时候才能迅速定位问题的根源,从而解决问题。
4
0
(请您对文章做出评价)
« 博主上一篇:世界坐标系与局部坐标系
» 博主下一篇:关于typedef的用法总结
posted @ 2008-12-09 20:41 Bigcoder 阅读(9688) 评论(15) 编辑 收藏

  
#1楼 2009-08-25 09:27 饭特稀[未注册用户]
多谢博主,茅塞顿开。
  
#2楼[楼主] 2009-08-31 17:26 Bigcoder  
感觉自己还是有些地方没说清楚,呵呵,共同讨论!
  
#3楼 2009-09-29 04:07 恍然大悟[未注册用户]
明白了很多一下子呵呵 找了很多文章都没看懂
  
#4楼 2009-11-20 09:36 tlin[未注册用户]
多谢楼主
  
#5楼 2010-01-17 10:19 ai.lc  
精辟深刻。
  
#6楼 2010-02-08 21:24 安羽.  
楼主再多看几篇计算机图形学的文章,会更明白,楼主还是没找更好的文章呀。
  
#7楼 2010-02-22 21:34 Qzier[未注册用户]
刚学习到opengl 的 glrasterpos(x,y,z,w) , 颇为不解 ...

到了楼主这确实有茅塞顿开的感觉 ...
  
#8楼[楼主] 2010-04-25 18:59 Bigcoder  
能否推荐下更好的图形学资料,谢谢!
  
#9楼 2010-06-17 10:37 宅男费纸 宅女费电  
应该就是homogeneous coordinate 吧
看英文的正郁闷着呢,谢谢楼主。
  
#10楼 2010-06-30 18:33 安羽.  
@楼主
我手上有
《计算机图形学的概念与方法》中文
《计算机图形学的算法基础》中文
《游戏开发图形学》英文

需要请联系QQ:80699694

齐次坐标 写了这么多还是没谈到核心呀,只是些概念与结论而已。

没谈到向量与矩阵相乘时齐次坐标能够清晰表示位移(只有看到了推导过程,才会明白齐次坐标的妙处)及在多次变换中化繁为简的作用,这才是齐次坐标本源。


  
#11楼[楼主] 2010-07-26 23:04 Bigcoder  
@安羽.
哪本书对齐次坐标有更深入的解释,介绍一下。
  
#12楼 2011-08-04 09:26 alex_  
仿射不是线性,而是线性+平移
  
#13楼 2012-04-26 00:13 NumberXiao  
博客园真的博大精深。
  
#14楼 2012-07-09 16:50 likebeta  
up楼主,做科学的就应该刨根问底
  
#15楼 2013-02-28 19:22 芥须  
个人感觉解释的有点牵强。。。。

No comments:

Post a Comment