四、OpenGL 矩陣變換原理

1、概述

上節(jié)提到,3D圖形的移動,旋轉(zhuǎn),縮放等變換,都是通過乘以一個矩陣實現(xiàn)。那么為什么通過矩陣就可以實現(xiàn)呢?本節(jié)主要是探討這個問題。要理解本節(jié)內(nèi)容,你最好有點向量和矩陣的知識。

  • 向量:有大小和方向的有向線段。物體的每一點,就是物體原點到每一點的向量,表示為:[1,0,0]等,也可以理解為點的坐標。
  • 矩陣:可以理解為二維數(shù)組,OpenGL只考慮3x3或者4x4的矩陣。

更多向量和矩陣知識,請查閱:3D圖形.pdf-對應(yīng)向量和矩陣章節(jié)

2、向量變換

物體通過矩陣進行變換,其實就是物體里面的每個點(向量)通過矩陣進行變換。所以我們可以簡單討論向量通過矩陣的變換:

公式:新向量 = 矩陣 x 向量(v' = Mv)

image

上面是向量和矩陣的乘法。

行向量與矩陣相乘,行向量必須在矩陣左邊,這叫行向量左乘,左乘才有意義。同理,列向量右乘才有意義。OpenGL使用列向量。后面的部分內(nèi)容可能還是使用行向量,原理一樣。

3、矩陣的幾何意義

矩陣是怎么變換向量的呢,或者說我們怎么知道一個矩陣表示的意義呢,是使向量旋轉(zhuǎn)了多少度,縮放了多少呢?

image

上圖,我們分別用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)過矩陣變換為第三行。

知道上面的原理后,我們就可以進行下面的推導(dǎo)了:

image

矩陣為:

image

所以:

x軸基向量[1 0] --> [2 1]

y軸基向量[0 1] --> [-1 2]

所以我們就可以得到右圖

反過來,如果我們想讓左圖轉(zhuǎn)變?yōu)橛覉D,根據(jù)右圖的x軸和y軸,反推出矩陣。

再來看個三維的例子:

image

矩陣意義總結(jié):

image

我們可以推理出:

1、繞x軸旋轉(zhuǎn)的矩陣為:

image

2、繞y軸旋轉(zhuǎn)的矩陣為:

image

3、繞z軸旋轉(zhuǎn)的矩陣為:

image

縮放:

image

4、4x4矩陣

平移,你會發(fā)現(xiàn),按上面的理論,根本無法表示平移?

上面的變換都是圍繞坐標原點的,平移會使物體離開原點,一個3x3的矩陣是無法表示平移的。

要加入平移,我們得用4x4的矩陣,如下圖:

image

藍色部分:我們知道旋轉(zhuǎn)、縮放等的線性變換只需要通過3x3的矩陣就可以。所以這里的藍色部分矩陣就代表線性變換(線性變換包括旋轉(zhuǎn),縮放等,表示的變換原點位置是不變的)。

紫色:表示投影相關(guān)參數(shù),暫不關(guān)注。

綠色:

image

看下面例子:

image

向量[Vx Vy Vz] 分別產(chǎn)生了 tx、ty、tz的平移量。比如原點[0 0 0]就變成了[tx ty tz]

下面我們通過幾個例子加深理解向量的仿射變換(仿射變換包括線性變換,可以理解為增加了平移的線性變換):

1、平移:

image

2、放大:

image

3、旋轉(zhuǎn)

image

4、組合

image

向量 v' = Mv

矩陣 M = TR T為平移矩陣,R為旋轉(zhuǎn)矩陣

所以 v' = (TR)v

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

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

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