1. 程式人生 > >關於齊次座標的理解

關於齊次座標的理解

最近又開始看圖形學以及渲染相關的內容,再次遇到了齊次座標的問題,找到兩篇文章感覺還不錯。轉發一下~
第一篇描述了齊次座標對於表示無窮遠的點的作用,第二篇還描述了其對於點和向量的意義,第三篇描述高維度線性變換與低維度仿射變換的關係,可以輔助理解齊次座標的意義~

先從一個問題開始:兩條平行線可以相交於一點麼?
在歐氏幾何空間,同一平面的兩條平行線不能相交,這是我們都熟悉的一種場景。
然而,在透視空間裡面,兩條平行線可以相交,例如:火車軌道隨著我們的視線越來越窄,最後兩條平行線在無窮遠處交於一點。
在這裡插入圖片描述
歐氏空間(或者笛卡爾空間)描述2D/3D幾何非常適合,但是這種方法卻不適合處理透視空間的問題(實際上,歐氏幾何是透視幾何的一個子集合),2維笛卡爾座標可以表為(x,y)。

如果一個點在無窮遠處,這個點的座標將會(∞,∞),在歐氏空間,這變得沒有意義。平行線在透視空間的無窮遠處交於一點,但是在歐氏空間卻不能,數學家發現了一種方式來解決這個問題。

這個方法就是:齊次座標

簡而言之,齊次座標就是用N+1維來代表N維座標

我們可以在一個2D笛卡爾座標末尾加上一個額外的變數w來形成2D齊次座標,因此,一個點(X,Y)在齊次座標裡面變成了(x,y,w),並且有 X = x/w Y = y/w

例如,笛卡爾座標系下(1,2)的齊次座標可以表示為(1,2,1),如果點(1,2)移動到無限遠處,在笛卡爾座標下它變為(∞,∞),然後它的齊次座標表示為(1,2,0),因為(1/0, 2/0) = (∞,∞),我們可以不用”∞"來表示一個無窮遠處的點了,哈哈。

為什麼叫齊次座標?

我們把齊次座標轉化為笛卡爾座標的方法是前面n-1個座標分量分別除以最後一個分量即可。

轉化齊次座標到笛卡爾座標的過程中,我們有一個發現,例如:
在這裡插入圖片描述

你會發現(1, 2, 3), (2, 4, 6) 和(4, 8, 12)對應同一個Euclidean point (1/3, 2/3),任何標量的乘積,例如(1a, 2a, 3a) 對應 笛卡爾空間裡面的(1/3, 2/3) 。因此,這些點是“齊次的”,因為他們代表了笛卡爾座標系裡面的同一個點。換句話說,齊次座標有規模不變性。

證明:兩條直線可以相交

考慮如下方程組:
在這裡插入圖片描述

我們知道在笛卡爾座標系裡面,該方程組無解,因為C ≠ D,如果C=D,兩條直線就相同了。

讓我們在透視空間裡面,用齊次座標x/w, y/w代替x ,y,

在這裡插入圖片描述

現在我們有一個解(x, y, 0),兩條直線相交於(x, y, 0),這個點在無窮遠處。

小結:齊次座標在圖形學中是一個非常基礎的概念,例如3D場景對映到2D場景的過程中

一直對齊次座標這個概念的理解不夠徹底,只見大部分的書中說道“齊次座標在仿射變換中非常的方便”,然後就沒有了後文,今天在一個叫做“三百年 重生”的部落格上看到一篇關於透視投影變換的探討的文章,其中有對齊次座標有非常精闢的說明,特別是針對這樣一句話進行了有力的證明:“齊次座標表示是計算機圖形學的重要手段之一,它既能夠用來明確區分向量和點,同時也更易用於進行仿射(線性)幾何變換。”—— 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也是很有研究的,要想成為一名專業的計算機圖形學的學習者,除了知其然必須還得知其所以然。這樣在遇到問題的時候才能迅速定位問題的根源,從而解決問題。