首先講講圖形學為什么需要用到矩陣。
首先,圖形學/渲染要做的事情,概括起來無非兩點:變換和上色。
這里只說變換。
一句話解釋變換,就是一個模型,經過各種旋轉、移動、扭曲、拉伸、縮放....后,還能“正確”的顯示在屏幕上。
展開來說,變換包括:1模型變換、2視圖變換、3投影變換、4視口變換。
1.模型變換:模型上的各個頂點,從局部坐標變成世界坐標;
2.觀測變換:把攝像機規范到標准位置,同時模型也跟着攝像機一起轉化,這里包含模型變換model+視圖變換view,合起來叫觀測變換viewing;
3.投影變換:我們想如何看這個模型,是以設計圖的形式看(平行投影),還是以近大遠小的形式看(透視投影);
4.視口變換:把經過投影變換后的點線面,映射到大大小小不同尺寸的屏幕上。
一句話,變換非常復雜。
那怎么辦呢?
有人絕妙的想到,變換歸根結底,不就是拿着模型在空間中扭一扭,轉一轉嗎?
空間,我們可以用直角坐標系表示呀!
扭一扭、轉一轉,我們可以用平移、縮放、旋轉的組合表示呀!
於是,變換的問題,成功的換成,如何在3維直角坐標系(xyz)中平移、縮放、旋轉的問題。
換句話說,變換就是如何調整xyz的值,使圖像達到平移、縮放、旋轉的效果。
這有幾張圖,看看平移、縮放、旋轉在直角坐標系上,xyz值到底是怎樣改變的(以2維xy值為例)。
平移后的點可以表示為
x` = x+tx
y` = x+ty
旋轉后的點可以表示為
x` = cosθx - sinθy
y` = sinθx + cosθy
縮放后的點可以表示為
x` = sx
y` = xy
我們驚訝的發現,改變后的點x`y`,總是可以用原來的xy和一些常量(t、θ)的組合來表示。
於是我們把這些常量(t、θ)抽離出來,形成一個數字組合,以便讓所有的點xy,跟這個數字組合結合以后,都能變換成新的點。
這個數字組合就是矩陣。
回答最開始的問題,為什么需要矩陣?因為
1.模型可以拆分成點,點可以做變換;
2.變換很復雜,我們轉換為在直角坐標中平移、縮放、旋轉,就比較容易;
3.我們可以用一個數字組合,就可以表示所有的平移、縮放、旋轉。
也就是說,用矩陣,是最簡單有效的變換方式。
說完了圖形學為什么需要矩陣,我們再來說說,為什么矩陣長得這么奇怪?
這個數字組合,有個高深的名字,叫做行列式,搞得好像古代的兵陣,實在讓人看不懂。
並且,矩陣乘矩陣,確實非常難以理解,行和列的元素交叉相乘再相加,它所表示的意義何在?
解釋起來可能有點哲學,我從道和術兩個方面來闡述。
道的層面,只因為人是懶的,期望一勞永逸。舉個例子,你看到一部手提電腦或手機,會驚嘆它為何如何小巧而功能強大,拆開后發現是因為芯片做得非常復雜。
里面做的復雜了,外面看起來就簡介了。
其實,芯片完全可以做得非常大,大得像一個屋子,一眼就能看到內部的所有零件(早期計算機就是如此)。
同理,數字組合,可以寫得非常長,長得一眼就能看懂所有的計算過程。
但是人說了,不要!我人類是追求簡潔的,我要把平移/旋轉/縮放看起來不同的表示方法,合成一個表示方法!
於是矩陣這種方方正正的形式就誕生了,雖然很復雜,但功能很強大,而且看起來挺簡潔。
術的層面,我們看在二維上旋轉的表示方法,發現x在變換后,不僅跟x有關系,還跟y有關系;在三維中,x的值變換后,不僅跟x有關系,還跟y、z有關系。
如何才能做到?只需要一種這樣的表示形式:
讓數字組合的每一行,都跟右邊的x、y、z分別乘一遍,不就都有關系了么?
現在可以回答,矩陣乘法為什么是“行和列的元素交叉相乘再相加”?歸根到底是因為人是“懶”的,需要一種看起來一致的簡潔形式,於是造出了行列式。
因此,本質上,它不應該被稱為“乘法”,更應該被稱為“矩陣變換法”。
它除了具有乘法的交換律,好像跟乘法沒太多關系。矩陣乘法實際上是乘法、加法和三角函數組合而成的復合運算。
實際上,我們覺得直觀的東西,基本是一些不證自明的、大自然中能觀察到的東西。
而矩陣它...
也許這就是為什么矩陣及其乘法看起來這么奇怪的原因。