1、概述
上節(jié)提到,3D圖形的移動(dòng),旋轉(zhuǎn),縮放等變換,都是通過乘以一個(gè)矩陣實(shí)現(xiàn)。那么為什么通過矩陣就可以實(shí)現(xiàn)呢?本節(jié)主要是探討這個(gè)問題。要理解本節(jié)內(nèi)容,你最好有點(diǎn)向量和矩陣的知識(shí)。
- 向量:有大小和方向的有向線段。物體的每一點(diǎn),就是物體原點(diǎn)到每一點(diǎn)的向量,表示為:[1,0,0]等,也可以理解為點(diǎn)的坐標(biāo)。
- 矩陣:可以理解為二維數(shù)組,OpenGL只考慮3x3或者4x4的矩陣。
更多向量和矩陣知識(shí),請(qǐng)查閱:3D圖形.pdf-對(duì)應(yīng)向量和矩陣章節(jié)
2、向量變換
物體通過矩陣進(jìn)行變換,其實(shí)就是物體里面的每個(gè)點(diǎn)(向量)通過矩陣進(jìn)行變換。所以我們可以簡單討論向量通過矩陣的變換:
公式:新向量 = 矩陣 x 向量(v' = Mv)
上面是向量和矩陣的乘法。
行向量與矩陣相乘,行向量必須在矩陣左邊,這叫行向量左乘,左乘才有意義。同理,列向量右乘才有意義。OpenGL使用列向量。后面的部分內(nèi)容可能還是使用行向量,原理一樣。
3、矩陣的幾何意義
矩陣是怎么變換向量的呢,或者說我們?cè)趺粗酪粋€(gè)矩陣表示的意義呢,是使向量旋轉(zhuǎn)了多少度,縮放了多少呢?
上圖,我們分別用x軸的單位向量(基向量)[1 0 0],y軸的單位向量[0 1 0],z軸的單位向量[0 0 1],乘以矩陣,進(jìn)行向量變換。
[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)過矩陣變換為第三行。
知道上面的原理后,我們就可以進(jìn)行下面的推導(dǎo)了:
矩陣為:
所以:
x軸基向量[1 0] --> [2 1]
y軸基向量[0 1] --> [-1 2]
所以我們就可以得到右圖
反過來,如果我們想讓左圖轉(zhuǎn)變?yōu)橛覉D,根據(jù)右圖的x軸和y軸,反推出矩陣。
再來看個(gè)三維的例子:
矩陣意義總結(jié):
我們可以推理出:
1、繞x軸旋轉(zhuǎn)的矩陣為:
2、繞y軸旋轉(zhuǎn)的矩陣為:
3、繞z軸旋轉(zhuǎn)的矩陣為:
縮放:
4、4x4矩陣
平移,你會(huì)發(fā)現(xiàn),按上面的理論,根本無法表示平移?
上面的變換都是圍繞坐標(biāo)原點(diǎn)的,平移會(huì)使物體離開原點(diǎn),一個(gè)3x3的矩陣是無法表示平移的。
要加入平移,我們得用4x4的矩陣,如下圖:
藍(lán)色部分:我們知道旋轉(zhuǎn)、縮放等的線性變換只需要通過3x3的矩陣就可以。所以這里的藍(lán)色部分矩陣就代表線性變換(線性變換包括旋轉(zhuǎn),縮放等,表示的變換原點(diǎn)位置是不變的)。
紫色:表示投影相關(guān)參數(shù),暫不關(guān)注。
綠色:
看下面例子:
向量[Vx Vy Vz] 分別產(chǎn)生了 tx、ty、tz的平移量。比如原點(diǎn)[0 0 0]就變成了[tx ty tz]
下面我們通過幾個(gè)例子加深理解向量的仿射變換(仿射變換包括線性變換,可以理解為增加了平移的線性變換):
1、平移:
2、放大:
3、旋轉(zhuǎn)
4、組合
向量 v' = Mv
矩陣 M = TR T為平移矩陣,R為旋轉(zhuǎn)矩陣
所以 v' = (TR)v