仿射變換與齊次座標

仿射變換與齊次座標

Affine Transformation仿射變換(Affine Transformation)和齊次座標系(Homogeneous Coordinate)是計算機圖形學中經常碰到的基本概念。這篇文章主要講述什麼是仿射變換和齊次座標系,以及在圖形系統中爲什麼要是用它們。不求全面,只爲自己學習理解。

仿射變換其實是另外兩種簡單變換的疊加:一個是線性變換,一個是平移變換。統一平移變換和線性變換的一種變換我們起了個名字叫“仿射變換”。這個新的變換就不再單純的是兩個線性空間的映射了,而是變成了兩個仿射空間的映射關係。爲了更好地理解仿射變換,首先就要知道線性變換以及它的不足。在未說明的情況下,下面使用的是卡迪爾座標系。

所謂線性變換是指兩個線性空間的映射,一個變換\mathcal{L}:\mathcal{A}\to\mathcal{B}是線性變換,必須滿足兩個條件,也就是我們經常說的線性條件:

L(u+v)=L(u)+L(v)      additivity

L({\alpha}u)={alpha}L(u)      homogeneity

舉個例子說明一下。建設L是一個二維繞原點旋轉變換,uv是旋轉角度。我們知道“一次性旋轉u+v度”和“先旋轉u度再旋轉v讀”達到的效果是一樣的;同樣地,“一次性旋轉{\alpha}u度”和“旋轉{\alpha}次u度”也是一張的。

線性變換可以用矩陣來表示。假設p=(x,y)^{T}是二維空間中的點,T是一線性變換,那麼存在一個矩陣A,使得p'=(x',y')^{T}=T(p)=Ap。上面的旋轉變換R,以及縮放S變換都有相應的變換矩陣

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{cc} cos(\theta) & -sin(\theta) \\ sin(\theta) & cos(\theta) \\ \end{array} } \right] \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{cc} S_x & 0 \\ 0 & S_y \\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ \end{array} } \right]

但是在卡迪爾座標系中,平移變換卻不能用矩陣來表示。一個平移變換T具有如下的形式

\left[ {\begin{array}{c} x'\\y'\\ \end{array}} \right]=T(p)= I \left[ {\begin{array}{cc} x \\ y \\ \end{array} } \right]+\left[ {\begin{array}{c} t_x \\ t_y \\ \end{array} } \right]

我們可以很容易地驗證,平移變換T是不能寫成兩個矩陣乘積形式的。使用齊次座標系很好的解決了這個問題(可能還有其它的原因)。齊次座標系統其實是用高維座標來表示一個低維的點,就好比我們用(x,1)來表示一個長度值一樣,其實用一個x就可以了,但是用高一維的表示,在有的時候會帶來便利。一個N維的卡迪爾座標系中的一個點p=(x_1,x_2,...,x_N),在齊次座標系中有無數的N+1維點與之對應,這些點可以描述爲p_H=(\omega x_1,\omega x_2,...,\omega x_N,\omega)\omega取不同的值,我們變得到齊次座標系中不同的點。當把這些點映射到\omega=1平面(不改變x_i之間比例),我們又降維得到對應的卡迪爾座標系中的點。在OpenGL中我們是用(x,y,z,1)(\omega=1)來表示一點三維的點,顯然這個點與卡迪爾座標系中的點(x,y,z)是一一對應的。在計算的過程中,會出現第四個分量不爲\omega \neq 1的情況,這時我們也總是同除以\omega使齊次座標正規化。現在回來讓我們看看使用齊次座標時,對應的線性變換是什麼形式。假設p=(x,y,1)^{T}是二維點對應的齊次座標,與上面使用卡迪爾座標系類似,我們可以得到相應的線性變換如旋轉變換R和縮放變換S的矩陣表示:

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=R(p)= \left[ {\begin{array}{ccc} cos(\theta) & -sin(\theta) & 0 \\ sin(\theta) & cos(\theta) & 0 \\ 0 & 0 & 1\\\end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=S(p)= \left[ {\begin{array}{ccc} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

容易驗證, (x', y')的值並沒有變化。但是使用齊次座標後,平移操作便也可以使用矩陣來表示了(如下),平移量出現在變換矩陣的最右側。

\left[ {\begin{array}{c} x'\\y'\\1\\ \end{array}} \right]=T(p)= \left[ {\begin{array}{ccc} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1\\ \end{array} } \right] \left[ {\begin{array}{c} x \\ y \\ 1 \\ \end{array} } \right]

最後,我們給出仿射變換稍微正式點的定義。一個仿射變換T,可以表示成一個線性變換A後平移tT(p)=Ap+t,其中p是待變換的點齊次座標表示。T可以表示成如下的形式:

\bf{T}=\left[ {\begin{array}{cccc} a_11&a_12&a_13&t_1\\ a_21&a_22&a_23&t_2\\ a_31&a32&a33&t_3\\ 0&0&0&1\\ \end{array}} \right]

其中,\bf{A}=\left[ {\begin{array}{ccc} a_11&a_12&a_13\\ a_21&a_22&a_23\\ a_31&a32&a33\\ \end{array}} \right]表示線性變換;\bf{t}=\left[ {\begin{array}{c} t_1\\ t_2\\ t_3\\ \end{array}} \right]表示平移變換;右下角的數字可以進行整體縮放,當爲1時,表示不進行整體縮放。

仿射變換之所以重要,另一個重要的原因是仿射變換後不改變點的共線/共面性,而且還保持比例,這對圖形系統尤其重要。例如,根據這個性質,如果我們要變換一個三角形,只需要對三個定點v1,v2,v3進行變換T就可以了,對於原先邊v1v2上的點,變換後一定還在邊後T(v1)T(v2)上。

總結一下,仿射變換是線性變換後進行平移變換(其實也是齊次空間的線性變換),使用齊次座標使得仿射變換可以以統一的矩陣形式進行表示。

Advertisements

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章