仿射變換與齊次座標
仿射變換(Affine Transformation)和齊次座標系(Homogeneous Coordinate)是計算機圖形學中經常碰到的基本概念。這篇文章主要講述什麼是仿射變換和齊次座標系,以及在圖形系統中爲什麼要是用它們。不求全面,只爲自己學習理解。
仿射變換其實是另外兩種簡單變換的疊加:一個是線性變換,一個是平移變換。統一平移變換和線性變換的一種變換我們起了個名字叫“仿射變換”。這個新的變換就不再單純的是兩個線性空間的映射了,而是變成了兩個仿射空間的映射關係。爲了更好地理解仿射變換,首先就要知道線性變換以及它的不足。在未說明的情況下,下面使用的是卡迪爾座標系。
所謂線性變換是指兩個線性空間的映射,一個變換是線性變換,必須滿足兩個條件,也就是我們經常說的線性條件:
additivity
homogeneity
舉個例子說明一下。建設是一個二維繞原點旋轉變換,和是旋轉角度。我們知道“一次性旋轉度”和“先旋轉度再旋轉讀”達到的效果是一樣的;同樣地,“一次性旋轉度”和“旋轉次u度”也是一張的。
線性變換可以用矩陣來表示。假設是二維空間中的點,T是一線性變換,那麼存在一個矩陣A,使得。上面的旋轉變換R,以及縮放S變換都有相應的變換矩陣
但是在卡迪爾座標系中,平移變換卻不能用矩陣來表示。一個平移變換T具有如下的形式
+
我們可以很容易地驗證,平移變換T是不能寫成兩個矩陣乘積形式的。使用齊次座標系很好的解決了這個問題(可能還有其它的原因)。齊次座標系統其實是用高維座標來表示一個低維的點,就好比我們用(x,1)來表示一個長度值一樣,其實用一個x就可以了,但是用高一維的表示,在有的時候會帶來便利。一個N維的卡迪爾座標系中的一個點,在齊次座標系中有無數的N+1維點與之對應,這些點可以描述爲,取不同的值,我們變得到齊次座標系中不同的點。當把這些點映射到平面(不改變之間比例),我們又降維得到對應的卡迪爾座標系中的點。在OpenGL中我們是用()來表示一點三維的點,顯然這個點與卡迪爾座標系中的點是一一對應的。在計算的過程中,會出現第四個分量不爲的情況,這時我們也總是同除以使齊次座標正規化。現在回來讓我們看看使用齊次座標時,對應的線性變換是什麼形式。假設是二維點對應的齊次座標,與上面使用卡迪爾座標系類似,我們可以得到相應的線性變換如旋轉變換R和縮放變換S的矩陣表示:
容易驗證, 的值並沒有變化。但是使用齊次座標後,平移操作便也可以使用矩陣來表示了(如下),平移量出現在變換矩陣的最右側。
最後,我們給出仿射變換稍微正式點的定義。一個仿射變換T,可以表示成一個線性變換A後平移t:T(p)=Ap+t,其中p是待變換的點齊次座標表示。T可以表示成如下的形式:
其中,表示線性變換;
表示平移變換;右下角的數字可以進行整體縮放,當爲1時,表示不進行整體縮放。
仿射變換之所以重要,另一個重要的原因是仿射變換後不改變點的共線/共面性,而且還保持比例,這對圖形系統尤其重要。例如,根據這個性質,如果我們要變換一個三角形,只需要對三個定點v1,v2,v3進行變換T就可以了,對於原先邊v1v2上的點,變換後一定還在邊後T(v1)T(v2)上。
總結一下,仿射變換是線性變換後進行平移變換(其實也是齊次空間的線性變換),使用齊次座標使得仿射變換可以以統一的矩陣形式進行表示。