OpenGL ES學習教程 座標系統變換

2021-09-25 05:43:16 字數 3238 閱讀 5097

經過前面幾節的學習,我們能畫乙個簡單的影象,並且也可以上一些顏色,但是如果我們需要在2維螢幕上畫乙個3維影象,這就需要對物體座標進行變換,3維是有xyz軸的,而螢幕上的座標只有xy軸(opengl的螢幕座標稱為歸一化座標,也有z軸只是螢幕上的物體z軸為0),那3維座標轉換為二維座標的過程是如何實現的呢?這就是今天的主題

乙個三維物體最終轉換到歸一化座標上去,大致會經過以下幾個過程(借用大神的圖):

4個空間3個矩陣

每個空間的座標系是不同的,空間轉換實質就是座標轉換,通過矩陣左乘(線性代數)座標實現空間的轉換,不用擔心矩陣如何生成以及矩陣怎麼去左乘,這些在opengl es的提供的matrix類幫我們實現,我們只需要掌握他的原理即可:

opengl的原點(0,0,0)繪製的乙個物體,任何物體都是以這個為基礎進行座標定位

與區域性空間類似,也是在opengl原點進行繪製,這個空間存在很多物體,可能許多物體重合在一塊,我們可以通過translate、rorate防止重合

世界空間的所有物體擺放好後,假設在某個位置擺放乙個相機,從這個相機視角(叫做視點)觀察出的所有物體,這個空間就叫觀察空間;觀察空間的座標不在是opengl座標了,它的座標是以相機位置為原點(0,0,0)而產生的座標系,那麼它的xyz軸如何確定呢?

推導觀察空間座標系

這裡直接複製大神的推導過程,看之前你最好先複習下什麼是向量、法向量、向量乘積和向量的叉乘:

而在實際開發中,我們只需要使用matrix.setlookatm函式,他幫助我們實現觀察矩陣,左乘就能夠進行空間轉換,這個矩陣實質就是上面推導內容推導出來的

public

static

void

setlookatm

(float

rm,int rmoffset,

float eyex,

float eyey,

float eyez,

float centerx,

float centery,

float centerz,

float upx,

float upy,

float upz )

引數解釋:rm: 生成的觀察矩陣

rmoffset : 矩陣偏移

eyex、eyey、eyez:相機的位置,相對於opengl座標原點

centerx、centery、centerz:相機觀察的點的位置

upx、upy、upz:推導過程中的向上的輔助量,這3個引數如理解不好可以點這裡

因為opengl規定在螢幕上的座標範圍是【-1,1】的,超過這個範圍是無法顯示,所以需要乙個裁剪矩陣對影象物體進行裁剪,那如何確定物體的哪些部分可以裁剪,哪些不能裁剪呢?

投影由觀察空間到裁剪空間在公式上左乘乙個投影矩陣,這個投影矩陣的產生分為兩種:正交投影和透視投影,不管是正交投影還是透視投影,最終都是將視景體內的物體投影在近平面上,這也是 3d 座標轉換到 2d 座標的關鍵一步。

正交投影

正交投影產生的效果無論你離物體多遠多近,都不會產生近大遠小的效果,大致如下圖,視點作為觀察點,視椎體由前後左右上下6個面包裹而成,物體在視椎體內部,最後投影到near近平面,視椎體範圍之外將無法顯示到螢幕上來

正交投影矩陣,由matrix.orthom這個方法產生

public

static

void

orthom

(float

m,int moffset,

float left,

float right,

float bottom,

float top,

float near,

float far)

可以把近平面看作螢幕,left、right、top、bottom都是以近平面中心相對的距離,由於手機螢幕的長寬一般不相等,以短邊為基準1,長邊取值為長/寬,所以如果乙個豎屏的手機使用這個正交投影產生的矩陣應該是:

float ratio =

(float

)height / width;

matrix.

orthom

(projectmatrix,0,

-1,1

,-ratio, ratio,1,6);

透視投影

透視投影會產生近大遠小的效果,產生的視椎體如下圖:

他也有響應的函式產生投影矩陣:

matrix.frustumm(float m, int offset, float left, float right, float bottom, float top, float near, float far);

其引數意義同上乙個orthm一樣,使用投影矩陣後就轉換到了裁剪空間去了,歸一化座標可以直接把圖形畫在opengl座標螢幕上去

經過上述的講解,我們要完成4個空間轉換,需要用到了3個轉換矩陣:

從區域性空間轉換到世界空間,我們需要用到模型矩陣modematrix,這個矩陣就是我們通常對物體進行translate、rorate換後產生的矩陣

從世界空間到觀察空間,我們需要用到觀察矩陣viewmatrix,這個矩陣可以setlookat方法幫我們生成

從觀察空間到裁剪空間,我們可以用到投影矩陣projectmatrix,使用orthm、frustum還有乙個perspectivem方法產生投影矩陣

最後以上幾個座標依次左乘我們的定義的座標position就可以得到歸一化座標了

所以,總結出來的公式

gl_position = projectmatrix * viewmatrix * modematrix * g_position

最後,也獻上我學習此過程練習的demo

效果圖

OpenGL ES學習系列教程

分享乙個opengl es學習系列教程,學opengl es時,這個系列文章不失是乙個好的入口 opengl es for iphone drawing a circle part1 circle part i.html part2 circle part ii.html part3 ircle p...

大地座標系 地理座標系 投影座標系

大地座標系 是大地測量中以參考橢球面為基準面建立起來的座標系。地面點的位置用 大地經度 大地緯度和大地高度 表示。大地座標系的確立包括選擇乙個橢球 對橢球進行定位和確定大地起算資料。乙個形狀 大小和定位 定向都已確定的地球橢球叫參考橢球。參考橢球一旦確定,則標誌著大地座標系已經建立。大地座標系是一種...

geopandas 座標系學習

先上圖,預告一下邏輯框架!這啥?別問,問就是參考橢球之間的區別!面為基準面建立起來的座標系。地面點的位置用大地經度 大地緯度和大地高度表示 l,b,h 大家都知道地球它就是個橢球?地球表面坑坑挖挖,高低不平,高有喜馬拉雅山 低有馬里亞納海溝。所以這個地球是無法用完美的數學橢球進行描述的,只能力求誤差...