一直對齊次坐標這個概念的理解不夠徹底,只見大部分的書中說道“齊次坐標在仿射變換中非常的方便”,然后就沒有了后文,今天在一個叫做“三百年 重生”的博客上看到一篇關于透視投影變換的探討的文章,其中有對齊次坐標有非常精辟的說明,特別是針對這樣一句話進行了有力的證明:“齊次坐標表示是計算機圖形學的重要手段之一,它既能夠用來明確區(qū)分向量和點,同時也更易用于進行仿射(線性)幾何變換。”——?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) 是坐標系下表達一個?向量?和點?的不同表達方式。這里可以看出,雖然都是用代數(shù)分量的形式表達向量和點,但表達一個點比一個向量需要額外的信息。如果我寫出一個代數(shù)分量表達 (1, 4, 7) ,誰知道它是個向量還是個點!
??? 我們現(xiàn)在把( 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 個代數(shù)分量是 0 ,而?3D?點?的第 4 個代數(shù)分量是 1 。像這種這種用 4 個代數(shù)分量表示 3D 幾何概念的方式是一種齊次坐標表示。
這樣,上面的 (1, 4, 7) 如果寫成( 1,4,7,0 ),它就是個向量;如果是 (1,4,7,1) ,它就是個點。 下面是如何在普通坐標 (Ordinary Coordinate) 和齊次坐標 (Homogeneous Coordinate) 之間進行轉(zhuǎn)換:
(1) 從普通坐標轉(zhuǎn)換成齊次坐標時
?? 如果 (x,y,z) 是個點,則變?yōu)?(x,y,z,1);
?? 如果 (x,y,z) 是個向量,則變?yōu)?(x,y,z,0)
(2)從齊次坐標轉(zhuǎn)換成普通坐標時 ???
?? 如果是 (x,y,z,1) ,則知道它是個點,變成 (x,y,z);
?? 如果是 (x,y,z,0) ,則知道它是個向量,仍然變成 (x,y,z)
以上是通過齊次坐標來區(qū)分向量和點的方式。從中可以思考得知,對于平移 T 、旋轉(zhuǎn) R 、縮放 S 這 3 個最常見的仿射變換,平移變換只對于點才有意義,因為普通向量沒有位置概念,只有大小和方向.
而旋轉(zhuǎn)和縮放對于向量和點都有意義,你可以用類似上面齊次表示來檢測。從中可以看出,齊次坐標用于仿射變換非常方便。
此外,對于一個普通坐標的?點?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 乘上同一個非零數(shù) w ,然后增加第 4 個分量 w ;如果把一個齊 次坐標轉(zhuǎn)換成普通坐標,把 前三個坐標同時除以第 4 個坐標,然后去掉第 4 個分量。
由于齊次坐標使用了 4 個分量來表達 3D 概念,使得平移變換可以使用矩陣進行,從而如 F.S. Hill, JR 所說,仿射(線性)變換的進行 更加方便。由于圖形硬件已經(jīng)普遍地支持齊次坐標與矩陣乘法,因此更加促進了齊次坐標使用,使得它似乎成為圖形學中的一個標準。
??? 以上很好的闡釋了齊次坐標的作用及運用齊次坐標的好處。其實在圖形學的理論中,很多已經(jīng)被封裝的好的API也是很有研究 的,要想成為一名專業(yè)的計算機 圖形學 的 學習者,除了知其然必須還得知其所以然。 這樣在遇到問題的時候才能迅速定位問題的根源,從而解決問題。