OpenGL ES 矩陣變換及其數學原理
阿新 • • 發佈:2018-11-01
矩陣變換及其數學原理
引子
推薦這篇文章線性代數的本質,這篇文章挺不錯的,揭示了矩陣和向量的內涵。首先概要性的提一下
- 向量刻畫的是線性空間中的物件。
- 矩陣刻畫的是向量線上性空間中的運動(變換,躍遷),相似矩陣本質上就是同一個線性變換的不同的描述。
- 在一個線性空間中,選定了一組基,對於任何一個線性變化都可以用一個確定的矩陣來描述
- 矩陣不僅可以作為線性變換的描述,而且可以作為一組基的描述,作為變換的矩陣,不但可以把線性空間中的一個點給變換到另一個點去,而且也能夠把線性空間中的一個座標系(基)表換到另一個座標系(基)去。
- 當我們談到向量時,一定要指定它所在的座標系才有意義,比如向量b=(1,2,3)實際上指的是在單位座標系I下有一個向量的度量為b。
- 就可以理解Ma=b就可以看成Ma=Ib,就是說在座標系M中度量出來的向量a和在座標系I裡面度量出來的b實際上就是同一個向量。
- 對於矩陣而言,他表示出來的那個座標系也是由一組基(向量)組成的,同樣存在這組基實在哪個座標系下度量的問題。對於矩陣M,將其理解成IM,即M中的那組向量是在I座標系中得出的。
- MxN本質是聲明瞭一個在M座標系中量出的另一個座標系N,其中M本身是在I座標系中度量出來的。
- 對座標系施加變換的方法,就是讓表示那個座標系的矩陣與表示那個變化的矩陣相乘。
因此我們來理解這樣一個式子,ACb,AC為矩陣,b為一個向量
- b是一個向量,他是在I座標系下度量的,a = Cb也就是在I座標系下將向量b變換到向量b,d=ACb=Aa的含義就是繼續在I座標系下將向量a變換到向量d。即在同一個座標系I下面進行了兩次變換操作。
- 另一種理解方式是ACb=IACb,那麼IAC三個矩陣相乘就表示了座標系的變換,在I座標系中度量處新的座標系IA,再在IA座標系下度量出IAC,然後這裡最終的座標系中的向量b和在1中在I座標系中經過兩次變換得到的向量是同一個向量。
上面的兩種理解方式也揭示了對向量的變換和對座標系的變換是等價的,這一點也可以通過後面旋轉變換的圖示中看出來。
各種變換
平移矩陣
縮放矩陣
平移矩陣和縮放矩陣很容易理解,並且從矩陣形式我們也可以看到為什麼用四維的向量表示一個頂點了,除了w分量用來做透視除法以外,另一個作用不也正好是為了把平移整合進來嗎,都做乘法而不做加法。在數學上也就是將三維空間的座標表示成其齊次形式.
旋轉變換
旋轉變換相對來說較為複雜,對繞x、y或z軸旋轉的情況比較好理解。
以繞z軸旋轉為例
於是
寫成矩陣形式為
繞任意軸旋轉的 旋轉矩陣為
同理,前面學到的正交投影矩陣,透視矩陣以及攝像機矩陣,本質上和上面的變換都是一樣的。
前面可以看到一般傳入渲染管線的是一個由攝像機矩陣,投影矩陣,變換矩陣相乘得到的總的變換矩陣,
在頂點著色器中一般是這樣的形式
gl_Position = uMVPMatrix * vec4(aPosition,1);
上面的程式碼中的變數uMVPMatrix表示了模型(M)、檢視(V)、投影(P)三中變換綜合,
對每個點所做的綜合變換本質上就是對這個點進行矩陣相乘,然而就我們傳入的是最終的綜合變換矩陣而言,剛才的理解不是特別準確,換個思路理解成綜合變換矩陣就是對座標系的變換會更好,因為畢竟我們是一次性將這個相乘後的綜合矩陣傳進去的。