GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ)
0> 如果沒有主動調用這個函數,系統預設相當於調用了GLU.gluLookAt(gl, 0, 0, 0, 0, 0, 0, 0, 1, 0);
調用gl.glTranslatef(0,0,-1); 這個API後看到的效果等同於調用了GLU.gluLookAt(gl, 0, 0, 1, 0, 0, 0, 0, 1, 0);但調用後者不會影響當前全景座標系。
1> eyeX, eyeY, eyeZ 是觀察者所在點對應於在當前全景座標系下的座標。
2> centerX, centerY, centerZ是觀察者的視線中心點在當前全景座標系下的座標。考慮你的手機螢幕這個平面,這個平面垂直於觀察者的視線,所有螢幕上顯示的物體形狀,大小,其實是在全景座標系下的物體沿視線投影到手機螢幕這個面的形狀和大小。
3> upX, upY, upZ代表從(0,0,0)到 (x,y,z)的直線,它表示了觀察者認為的“上”方向。改變這幾個值相當於觀察者的視線不變,自己的臉沿垂直於視線的平面旋轉。
gl.glTranslatef(0,0,-1);
改變當前的全景座標系, 使座標系整體向螢幕內平移一個單位,這樣所有的物體就看起來向螢幕內平移了一個單位。
glTexCoordPointer
座標決定紋理貼圖的大小,但是真正的紋理內容的左邊總是在(0,1)之間,所以這個貼圖越大,內容所佔的比例就越小.
然後glTexCoordPointer決定的紋理貼圖貼到glVertexPointer決定的”畫布”上.這個過程是一比一的,”畫布”是多大,紋理貼圖就做相應的變形適合”畫布”形狀.
最後把畫布顯示在glViewport決定的螢幕顯示地區,但是上面提到了,螢幕顯示地區是一個座標在(-1,+1)之間的一個正方形,所以”畫布”的面積越大,即座標範圍越大,在顯示這一步時是會被裁的,只剩(-1,+1)部分的映像.
貼圖的方法
首先圖片的操作依然是Bitmap作為圖片的元素,如何讀取Bitmap就不說了,在Opengl中準備可以貼的圖片需要一個過程,首先,需要申明你需要貼圖的圖名字,這個是一個unsigned int ,用未用過的int來標誌每一個你需要的texture,這個過程是通過:
gl.glGenTextures(1,
textures
, 0);
//1 代表制需要建立一個名字,textures 是個int 數組,用於把建立的名字儲存回這個數組中,0是說從第0個位置開始儲存。
再建立好Texture名字後,需要把對應的名字跟具體的Texture關聯,所謂的關聯其實就是為對應的Texture設定好屬性,此時名字的屬性已經設定好了,還有不少屬性可以設定,最關鍵的是要指明該Texture的類型,並且該Texture具體的圖片:
gl.glBindTexture(GL10.
GL_TEXTURE_2D
,
textures
[0]);
//此處是用於申明當前所有對
GL_TEXTURE_2D
的操作都是對
textures[0]
的操作,這兩個是一體。
GLUtils.
texImage2D
(GL10.
GL_TEXTURE_2D
, 0, bitmap, 0);
//為
GL_TEXTURE_2D
當前的Texture指定圖片,第一個0是指等級, 但是我換成1就顯示不出來了。第二個0代表border邊緣的寬度,此處只能為0(Opengl Es中對不少選擇做了限制)
其中還有一些關於邊緣的設定,例如當圖片小於目標時如何處理,圖片大於時如何處理之類的選項:
gl.glTexParameterf(GL10.
GL_TEXTURE_2D
, GL10.
GL_TEXTURE_MIN_FILTER
, GL10.
GL_NEAREST
);
此時,你已經為每一個名稱的Texture指定好了應該指定的參數,這些過程可能會比較慢,不能老做,應該放在一個地方統一進行。當所有Texture指定好了,就可以開始使用每一個Texture了,使用時是先通過
gl.glBindTexture(GL10.
GL_TEXTURE_2D
,
textures
[0]);
指定你當前準備使用的Texture,這個是非常快的,可以頻繁使用。
指定好後,通過為每一個目標Vertext 指定對應 貼圖中的位置來確定,該貼圖最終被貼上去的樣子,所以也需要準備一個Texture的FloatBuffer。其中因為貼圖是2d所以指定的是2緯座標,1為對應圖片的寬或者高,從0 到1之間取數。
啟用
gl.glEnableClientState(GL10.
GL_TEXTURE_COORD_ARRAY
);
gl.glTexCoordPointer(2, GL10.
GL_FLOAT
, 0,
textureBuffer
);
跟著畫出點的時候,就把貼圖給畫出來了。
貼圖時的座標問題
根據
Per-Erik Bergman的說明, UV maping的座標組應如下
所以頂點座標數組應該為
float textureCoordinates[] = { 0.0f, 1.0f, //
1.0f, 1.0f, //
0.0f, 0.0f, //
1.0f, 0.0f, //
};
繪圖平面有交疊時的遮擋問題
繪製A物體平面,在物體A所在平面的某一地區再繪製B平面。 當從平面的角度看時,B完全遮擋了A。 但是從遠處立體遠觀時,B和A的遮擋情況就不一定了,有時後B反而被A遮擋。
這個原因是
檢視區範圍的深度範圍太大,以至於在32位內無法判定深度值大小差別。
典型的修改方法是最近的z深度值放大。例如:
gluPerspective(...,...,10,100000000);
改為 gluPerspective(...,...,100,100000000);