1官扣、概述
上節(jié)提到,3D圖形的移動羞福,旋轉(zhuǎn)惕蹄,縮放等變換,都是通過乘以一個矩陣實現(xiàn)治专。那么為什么通過矩陣就可以實現(xiàn)呢焊唬?本節(jié)主要是探討這個問題。要理解本節(jié)內(nèi)容看靠,你最好有點向量和矩陣的知識赶促。
- 向量:有大小和方向的有向線段。物體的每一點挟炬,就是物體原點到每一點的向量鸥滨,表示為:[1,0,0]等,也可以理解為點的坐標谤祖。
- 矩陣:可以理解為二維數(shù)組婿滓,OpenGL只考慮3x3或者4x4的矩陣。
更多向量和矩陣知識粥喜,請查閱:3D圖形.pdf-對應向量和矩陣章節(jié)
2凸主、向量變換
物體通過矩陣進行變換,其實就是物體里面的每個點(向量)通過矩陣進行變換额湘。所以我們可以簡單討論向量通過矩陣的變換:
公式:新向量 = 矩陣 x 向量(v' = Mv)
上面是向量和矩陣的乘法卿吐。
行向量與矩陣相乘,行向量必須在矩陣左邊锋华,這叫行向量左乘嗡官,左乘才有意義。同理毯焕,列向量右乘才有意義衍腥。OpenGL使用列向量。后面的部分內(nèi)容可能還是使用行向量纳猫,原理一樣婆咸。
3、矩陣的幾何意義
矩陣是怎么變換向量的呢芜辕,或者說我們怎么知道一個矩陣表示的意義呢尚骄,是使向量旋轉(zhuǎn)了多少度,縮放了多少呢物遇?
上圖乖仇,我們分別用x軸的單位向量(基向量)[1 0 0]憾儒,y軸的單位向量[0 1 0]询兴,z軸的單位向量[0 0 1]乃沙,乘以矩陣,進行向量變換诗舰。
[1 0 0]警儒,x軸的單位向量,乘以矩陣后眶根,得到了矩陣的第一行蜀铲,所以矩陣的第一行就是x軸單位向量[1 0 0]經(jīng)過矩陣轉(zhuǎn)換后的向量。以后我們看到矩陣的第一行属百,就知道了x軸單位向量[1 0 0]變換后的向量记劝。
同理,[0 1 0]y軸單位向量經(jīng)過矩陣變換為第二行族扰,[0 0 1]z軸單位向量經(jīng)過矩陣變換為第三行厌丑。
知道上面的原理后,我們就可以進行下面的推導了:
矩陣為:
所以:
x軸基向量[1 0] --> [2 1]
y軸基向量[0 1] --> [-1 2]
所以我們就可以得到右圖
反過來渔呵,如果我們想讓左圖轉(zhuǎn)變?yōu)橛覉D怒竿,根據(jù)右圖的x軸和y軸,反推出矩陣扩氢。
再來看個三維的例子:
矩陣意義總結(jié):
我們可以推理出:
1耕驰、繞x軸旋轉(zhuǎn)的矩陣為:
2、繞y軸旋轉(zhuǎn)的矩陣為:
3录豺、繞z軸旋轉(zhuǎn)的矩陣為:
縮放:
4朦肘、4x4矩陣
平移,你會發(fā)現(xiàn)双饥,按上面的理論厚骗,根本無法表示平移?
上面的變換都是圍繞坐標原點的兢哭,平移會使物體離開原點领舰,一個3x3的矩陣是無法表示平移的。
要加入平移迟螺,我們得用4x4的矩陣冲秽,如下圖:
藍色部分:我們知道旋轉(zhuǎn)、縮放等的線性變換只需要通過3x3的矩陣就可以矩父。所以這里的藍色部分矩陣就代表線性變換(線性變換包括旋轉(zhuǎn)锉桑,縮放等,表示的變換原點位置是不變的)。
紫色:表示投影相關參數(shù)礁竞,暫不關注邓了。
綠色:
看下面例子:
向量[Vx Vy Vz] 分別產(chǎn)生了 tx滋迈、ty请契、tz的平移量舀武。比如原點[0 0 0]就變成了[tx ty tz]
下面我們通過幾個例子加深理解向量的仿射變換(仿射變換包括線性變換邻辉,可以理解為增加了平移的線性變換):
1轿衔、平移:
2微驶、放大:
3浪谴、旋轉(zhuǎn)
4、組合
向量 v' = Mv
矩陣 M = TR T為平移矩陣因苹,R為旋轉(zhuǎn)矩陣
所以 v' = (TR)v