仿射變換其實是另外兩種簡單變換的疊加:一個是線性變換询件,一個是平移變換。統(tǒng)一平移變換和線性變換的一種變換我們起了個名字叫“仿射變換”畅涂。這個新的變換就不再單純的是兩個線性空間的映射了,而是變成了兩個仿射空間的映射關(guān)系道川。為了更好地理解仿射變換午衰,首先就要知道線性變換以及它的不足立宜。在未說明的情況下,下面使用的是卡迪爾坐標系臊岸。
所謂線性變換是指兩個線性空間的映射橙数,一個變換
是線性變換,必須滿足兩個條件帅戒,也就是我們經(jīng)常說的線性條件:
additivity
homogeneity
舉個例子說明一下灯帮。建設(shè)
是一個二維繞原點旋轉(zhuǎn)變換,
和
是旋轉(zhuǎn)角度逻住。我們知道“一次性旋轉(zhuǎn)
度”和“先旋轉(zhuǎn)
度再旋轉(zhuǎn)
讀”達到的效果是一樣的钟哥;同樣地,“一次性旋轉(zhuǎn)
度”和“旋轉(zhuǎn)
次u度”也是一張的鄙信。
線性變換可以用矩陣來表示瞪醋。假設(shè)
是二維空間中的點忿晕,T是一線性變換装诡,那么存在一個矩陣A,使得
践盼。上面的旋轉(zhuǎn)變換R鸦采,以及縮放S變換都有相應(yīng)的變換矩陣
但是在卡迪爾坐標系中,平移變換卻不能用矩陣來表示咕幻。一個平移變換T具有如下的形式
+
我們可以很容易地驗證渔伯,平移變換T是不能寫成兩個矩陣乘積形式的。使用齊次坐標系很好的解決了這個問題(可能還有其它的原因)肄程。齊次坐標系統(tǒng)其實是用高維坐標來表示一個低維的點锣吼,就好比我們用(x,1)來表示一個長度值一樣,其實用一個x就可以了蓝厌,但是用高一維的表示玄叠,在有的時候會帶來便利。一個N維的卡迪爾坐標系中的一個點
拓提,在齊次坐標系中有無數(shù)的N+1維點與之對應(yīng)读恃,這些點可以描述為
,
取不同的值代态,我們變得到齊次坐標系中不同的點寺惫。當把這些點映射到
平面(不改變
之間比例),我們又降維得到對應(yīng)的卡迪爾坐標系中的點蹦疑。在OpenGL中我們是用
(
)來表示一點三維的點西雀,顯然這個點與卡迪爾坐標系中的點
是一一對應(yīng)的。在計算的過程中歉摧,會出現(xiàn)第四個分量不為
的情況蒋搜,這時我們也總是同除以
使齊次坐標正規(guī)化〈勰欤現(xiàn)在回來讓我們看看使用齊次坐標時,對應(yīng)的線性變換是什么形式豆挽。假設(shè)
是二維點對應(yīng)的齊次坐標育谬,與上面使用卡迪爾坐標系類似,我們可以得到相應(yīng)的線性變換如旋轉(zhuǎn)變換R和縮放變換S的矩陣表示:
容易驗證,
的值并沒有變化帮哈。但是使用齊次坐標后膛檀,平移操作便也可以使用矩陣來表示了(如下),平移量出現(xiàn)在變換矩陣的最右側(cè)娘侍。
最后咖刃,我們給出仿射變換稍微正式點的定義。一個仿射變換T憾筏,可以表示成一個線性變換A后平移t:T(p)=Ap+t嚎杨,其中p是待變換的點齊次坐標表示。T可以表示成如下的形式:
其中氧腰,表示線性變換枫浙;表示平移變換;右下角的數(shù)字可以進行整體縮放古拴,當為1時箩帚,表示不進行整體縮放。
仿射變換之所以重要黄痪,另一個重要的原因是仿射變換后不改變點的共線/共面性紧帕,而且還保持比例,這對圖形系統(tǒng)尤其重要桅打。例如是嗜,根據(jù)這個性質(zhì),如果我們要變換一個三角形挺尾,只需要對三個定點v1,v2,v3進行變換T就可以了鹅搪,對于原先邊v1v2上的點,變換后一定還在邊后T(v1)T(v2)上潦嘶。
總結(jié)一下涩嚣,仿射變換是線性變換后進行平移變換(其實也是齊次空間的線性變換),使用齊次坐標使得仿射變換可以以統(tǒng)一的矩陣形式進行表示掂僵。