矩陣變換

矩陣乘法

矩陣rc表示一個(gè)r行c列的矩陣,兩個(gè)矩陣A(r1c1)和B(r2c2)相乘有意義的條件是c1等于r2,相乘后得到一個(gè)(r1c2)的矩陣。
畫個(gè)圖來看一下:

矩陣乘法

需要注意的是,矩陣乘法不滿足交換律

矩陣乘法有什么用

用處肯定很多,但這里我們研究的是它在圖形學(xué)里的平移,縮放等變換功能。在這里我們只研究二位空間里的情況,也就是平面圖形。
首先思考一個(gè)問題:如何平移一個(gè)平面圖形?
答案很簡單,那就是把它的每個(gè)頂點(diǎn)都平移,整個(gè)圖形自然就移動(dòng)了。
那如何用矩陣來實(shí)現(xiàn)這個(gè)操作呢?
首先就是把它的頂點(diǎn)都存儲(chǔ)進(jìn)矩陣?yán)?,如下圖


頂點(diǎn)矩陣

為什么要這么放?因?yàn)橐镁仃嚦朔ò?,由前面的乘法特性可以看出,要想乘法有意義,需要矩陣1的列數(shù)等于矩陣2的行數(shù),由于是二位空間圖形,變換矩陣可以是一個(gè)2 * 2的矩陣,這樣就能滿足我們的需求。
等等,這樣真的能滿足需求么?根據(jù)乘法的算法,結(jié)果中任一單元都是變換矩陣某值和x坐標(biāo)的乘積加上變換矩陣某值和y坐標(biāo)的乘積,這里先不考慮x和y都是變量,我們按砝碼去想,x和y是兩種可能不是1的砝碼,我們的結(jié)果只能是由兩種砝碼的若干倍之和組成,這樣顯然不能保證拼湊出所有正值,而我們的圖形平移的值域肯定是整個(gè)正數(shù)范圍。
這種情況怎么辦?好辦,加個(gè)常數(shù)表示偏移量。按照這種思路,用s表示偏移量,則表示二位空間的圖形可以用如下頂點(diǎn)矩陣:


帶偏移量的頂點(diǎn)矩陣和對(duì)應(yīng)的變換矩陣

這種情況下,我們先假設(shè)變換矩陣是一個(gè)3 * 3的矩陣,再看看能發(fā)現(xiàn)些什么。使用矩陣乘法用變換矩陣去改變頂點(diǎn)矩陣,得到的結(jié)果中,任一位置的結(jié)果都是由原位置的x值和y值和常量拼湊成的。根據(jù)矩陣乘法的規(guī)則可以得出,在上圖變換矩陣中:
a:變換后x值中原x的倍數(shù),控制x縮放
b:變換后x值中原y的倍數(shù),控制x切變拉伸
c:變換后x值中常量的倍數(shù),控制x偏移
d:變換后y值中原x的倍數(shù),控制y切變拉伸
e:變換后y值中原y的倍數(shù),控制y縮放
f:變換后y值中常量的倍數(shù),控制y偏移
g:變換后常量值中原x的倍數(shù)
h:變換后常量值中原y的倍數(shù)
i:變換后常量值中原常量的倍數(shù)
可以看出,如果sn全部取1的話,我們用變換矩陣可以把原值變成任意正整數(shù),不過頂點(diǎn)之間的相對(duì)關(guān)系約束還是沒法打破的。另外,g、h和i其實(shí)沒什么意義,所以變換矩陣用2 * 3足矣。
寫到這里,平移操作就沒什么難度了吧?如果想x軸平移,就改變c的值,如果想y軸平移,就改變f的值。
寫到這里可能有人要問:那我改b的值不也是x軸平移么?錯(cuò)!對(duì)于任一頂點(diǎn),x的值可以是不同的,如果你改了b的值,那結(jié)果就是不同頂點(diǎn)在x軸上的平移位置不一定相同,那么對(duì)于整個(gè)圖形來說,這就不是平移,而是形變。改變a、b、d、e中任意一個(gè)值,都是形變,具體怎么形變的,有興趣可以自己試試。
最后加一句,矩陣乘法滿足結(jié)合律,所以對(duì)于比較復(fù)雜的變換,可以將其分解為基本的平移、旋轉(zhuǎn)等,再相乘得到變換矩陣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容