1. 程式人生 > >OpenGLES座標變換

OpenGLES座標變換

OpenGLES是針對嵌入式裝置而設計的,其實際是OpenGL的裁剪版本。

變換流程包括:物體座標系->世界座標系->攝像機座標系->裁剪空間->標準裝置空間->實際視窗空間

這裡面有時會用座標系,有時會用空間,這主要是側重點不一樣。當使用座標系時,是因為我們關注點的座標和它的變換,當使用空間時,是為了強調這是一個有限的空間,超出空間的點會被裁剪。

物體座標系是指繪製物體的座標系。

世界座標系是指擺放物體的座標系。其實這和物體座標系是同一個座標系,因為我們在世界座標系裡新增物體時,會做兩件事:1、(習慣)在原點附近繪製物體。2、旋轉、平臺物體到某個位置,做第一步時叫物體座標系,做第二步時叫世界座標系。物體座標系到世界座標系的變換就是"擺放"。為什麼要分兩步?因為當我們要再放一個同樣的物體到世界座標系時,可以重用第一步的程式碼。

攝像機座標系是攝像機位置為原點,Z軸負方向和視線方向一致,Y軸正方向和攝像機上方向一致的座標系。攝像機位置、攝像機上方向和視線方向都是通過呼叫setLookAtM設定的,呼叫這個方法時,這些座標和方向還是相對於世界座標系的,畢竟攝像座標系還沒出來呢。世界座標系到攝像座標系的變換在設定完攝像機座標系後就確定了,不需要手動去設定。

裁剪空間是攝像機座標系中的一個六面體空間。通過設定正交投影或透視投影來確定裁剪空間,只有裁剪空間裡面的物體才可能被使用者看到。當然物體現在還是在攝像機座標系中,可以理解成沒有對物體做變換。

標準裝置空間是一個3軸的座標範圍都是-1~1的3維空間。標準裝置空間是由裁剪空間變換得來的,不管是透視投影設定的四稜臺,還是正交投影設定得長方體,都會變成一個正方體。這裡不單包含一個形變,還包括一個座標系的變換,不過這個變換也不需要手動去設定,在設定投影時這個變換就確定了。

實際視窗空間是在實際視窗座標系中設定得視口區域。視窗座標系是由使用的控制元件(SurfaceView或TextureView……)決定的,並不是手機螢幕,因為控制元件可以小於螢幕、等於螢幕甚至大於螢幕。視窗座標系是以控制元件的左下角為原點的座標系。實際視窗空間是這個座標系裡的一塊區域。

 

在使用固定管線時,座標系和座標系之間變換,就像設定環境變數一樣,設定好這些變數,繪製物體,然後物體就會出現在我們期望的地方。

在使用可程式設計管線時,這些變換會變成一個MVP矩陣,繪製物體的頂點和這個矩陣相乘,然後它們就會變換到相應的位置。

 

PS:整理這個,是因為在看專案程式碼時,沒理解:有將MVP矩陣直接設定成單位矩陣的程式碼,而且跑出正常的效果。將MVP矩陣設定成單位矩陣,其實就是直接在標準裝置空間裡繪製物體。