對於齊次座標的理解

一直對齊次座標這個概念的理解不夠完全,只見大部分的書中說道「齊次座標在仿射變換中很是的方便」,而後就沒有了後文,今天在一個叫作「三百年 重生」的博客上看到一篇關於透視投影變換的探討的文章,其中有對齊次座標有很是精闢的說明,特別是針對這樣一句話進行了有力的證實:html

「齊次座標表示是計算機圖形學的重要手段之一,它既可以用來明確區分向量和點,同時也更易用於進行仿射(線性)幾何變換。」—— F.S. Hill, JR。

對於一個向量v以及基oabc,能夠找到一組座標(v1,v2,v3),使得學習

v = v1 a + v2 b + v3 c (1)code

而對於一個點p,則能夠找到一組座標(p1,p2,p3),使得 htm

p – o = p1 a + p2 b + p3 c (2)blog

從上面對向量和點的表達,咱們能夠看出爲了在座標系中表示一個點(如p),咱們把點的位置看做是對這個基的原點o所進行的一個位移,即一個向量——p – o(有的書中把這樣的向量叫作位置向量——起始於座標原點的特殊向量),咱們在表達這個向量的同時用等價的方式表達出了點p:get

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)di

這裏(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)

  1. 從齊次座標轉換成普通座標時
    若是是(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也是頗有研究的,要想成爲一名專業的計算機圖形學的學習者,除了知其然必須還得知其因此然。這樣在遇到問題的時候才能迅速定位問題的根源,從而解決問題。

原文

相關文章
相關標籤/搜索