求一个向量变换为另一个向量的矩阵_OpenGL里旋转等变换矩阵为什么是4x4的矩阵...
OpenGL ES 的很多教程里都會有這樣一個例子來講解紋理:將一張圖片作為紋理顯示在屏幕上。
因為紋理坐標和實際屏幕顯示的坐標不一樣,把圖片渲染在屏幕上后,圖片是上下顛倒的。
一個解決方法是對當前的頂點坐標,乘以繞 z 軸旋轉180度的矩陣,這樣圖片就能正確顯示了。
那么如何理解這個旋轉矩陣呢?
影響我們理解這個矩陣的第一個問題是:
為什么這個矩陣是 4x4 的? 而且我們發現旋轉,縮放、平移等變換矩陣都是 4x4 的。
在直觀上的認知里,表達一個三維空間的坐標用 x,y,z 就足夠了,那在三維空間里進行矩陣變換,用 3x3 的矩陣就夠了,為什么需要 4x4 呢?
為了回答這個問題,下面我們先在幾何意義上理解**向量和矩陣之間的關系,然后通過推導旋轉矩陣**和平移矩陣,一步步來解開這個疑惑。
向量和矩陣
在幾何平面上,我們可以把平面上任意一點,當作與原點組成的一個 向量 來理解。
如圖 ,A 點可以表示成向量 ? ?;在 x 軸和 y 軸上各有 i 點(1, 0)和 ?j 點(0,1),同樣的,讓它們與原點組成向量,為了簡化,我們用 ? ?和 表示這兩個向量。
向量和矩陣因為 A 點的坐標為 (3, 2),如果我們要用 ? ?和 ?表示 ,那是這樣的:
這里的幾何意義是 延展到 ?, 延展到 ,然后把這兩個向量相加即可得到
i ?坐標是 (1, 0),j 坐標是 (0,1),我們把上面這個等式轉換成豎列的形式:
這里其實是向量的簡單運算,運算過程如下:
看到運算過程是否有種似曾相識的感覺?這不就是矩陣與向量的乘法計算嗎?這個運算其實就是將向量左乘一個矩陣 的計算:
這里 ?其實就是單元矩陣,左乘一個單元矩陣并不會改變原來的值。而這個單元矩陣以兩個豎列來看,正是 i 和 j 點的坐標,也是向量 ? ?和 ? ,在數學上將 ? ?和 ? ?稱為此坐標系的 基向量。
推導旋轉矩陣
我們現在把整個坐標軸繞原點逆時針旋轉 ? :
推導旋轉矩陣旋轉后 ?i 點和 j 點對應 ? ?和 ? 位置。
通過簡單的三角函數計算得到: 坐標為 , 坐標為
旋轉后,A 點的坐標是多少呢?回顧上面的做法, 延展到 ?, 延展到 ,然后把這兩個向量相加即可得到 。結合上面一節矩陣和向量的推演,可以變成下面的形式:
我們發現,左邊的矩陣不正是開頭所看到的 旋轉矩陣 嗎?只不過這是二維平面上的旋轉矩陣:
結合圖形和計算,我們可以這樣理解這個二維矩陣:二維矩陣代表一個坐標系里的兩個基向量,而在這個坐標系里的點與原點組成的向量,都可以用這兩個基向量的變換來表示。那么旋轉一個點,可以轉換成旋轉這個點所在的坐標系,從而通過變化的基向量求出旋轉后的點的位置。
其實這種變換在數學上稱作 線性變換 ,線性變換是通過 矩陣乘法 來實現
線性變換:是在兩個向量空間(包括由函數構成的抽象的向量空間)之間的一種保持向量加法和標量乘法的特殊映射
線性變換在幾何直觀上有如下特點:
變換前后,直線仍然保持是直線的狀態
變換前后,原點保持固定,不會變化
我們從二維平面,推導到三維坐標也是同理,只不過是多了個 z 軸
豎著來看這個矩陣,是 x,y,z軸上的三個基向量,同時它又是一個單元矩陣。
同理上面二維平面的推導,三維坐標繞 z 軸的旋轉矩陣為:
推導平移矩陣
那么平移操作,能不能也用這種矩陣與向量相乘的形式呢?我們再次回到二維平面,看看將 A 點平移到 B 點的情況是怎樣的。
要將 A 點(3,2)平移到 B 點(4,5),實際上就是先將 A 點往右移動 1 ,再往上移動 3,即 x 坐標值增加 1,y坐標值增加 3
從上面的運算來看,平移這種操作實際上是 向量的加法,即:
我們可以通過向量加法的 平行四邊形法則 加深理解,如下圖:
對于平移這種操作,我們無法僅僅通過矩陣乘法來實現。
而實際上,平移這種操作屬于 仿射變換 。
仿射變換,又稱仿射映射,是指在幾何中,對一個向量空間進行一次線性變換并接上一個平移,變換為另一個向量空間。
仿射變換在幾何直觀上,相比線性變換,它不需要保證變換前后坐標原點不變。
如下圖,從 A 點平移到 B 點,我們換一個角度思考,這次不移動點,而是移動整個坐標軸,同樣可以達到平移 A 點到 B 點的需求,但是坐標原點移動到了 O' 點(1,3)。
我們希望構造的是像下面這種矩陣乘法的等式,這樣才能用一個通用的計算模式來處理坐標點的變換。
矩陣到這里,我們終于要請出 齊次坐標 了。
齊次坐標就是將一個原本是 n 維的向量用一個 n+1 維向量來表示,是指一個用于投影幾何里的坐標系統,如同用于歐氏幾何里的笛卡兒坐標一般。
用一個通俗的講法是,我們需要 升維 來處理這個問題。
通過增加一個維度,我們可以在高維度上,通過線性變換來處理低維度的仿射變換。
這句話咋一聽感覺很有哲理,但是通過下面的數學等式就能知道其中的奧妙:
觀察上面的運算過程,結果 不正是我們上面所得的 嗎?只不過多了一個 z 軸的坐標值。
我們通過升級一個維度,將在二維平面上的平移問題轉換成了在三維坐標的矩陣和向量乘法。那么在二維平面上,這個平移矩陣就為:
tx 和 ty 就對應在 x 軸 和 y 軸上的移動距離。
同理推廣到三維坐標系,要實現三維坐標的平移操作,同樣需要通過升維,引入齊次坐標來計算。那么三維坐標下的平移矩陣就為:
總結
至此,我們可以回答最開始的問題了,為什么 OpenGL 里的矩陣變換是 4x4 的矩陣呢?
我們來想象這樣一個場景:如果我要讓頂點坐標旋轉一定角度后,再平移一段距離,那么這里面的操作就涉及 3x3 矩陣的計算和 4x4 矩陣的計算,如果不統一起來,這種連續變換的計算操作將很復雜。
所以如果要用矩陣乘法來統一所有的平移、旋轉等等變換計算,為了照顧到平移這類仿射變換,統一用 4x4 矩陣來計算既能滿足場景又方便計算。
總結
以上是生活随笔為你收集整理的求一个向量变换为另一个向量的矩阵_OpenGL里旋转等变换矩阵为什么是4x4的矩阵...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yearning 2. 部署_对于企业来
- 下一篇: php异步方案,php 伪异步执行实现方