以下文字有點長,因爲我想確保遇到類似問題的人,例如谷歌這個頁面可以很容易地跟蹤確切的問題和解決方案。但現在我的問題:Android OpenGL ES - 我無法使gluLookAt/glu工作
我最近開始在Android智能手機上編程OpenGL ES,並遇到了解gluPerspective和gluLookAt如何使用的問題。我認爲我明白他們做什麼,但我看不到我繪製的三角形。我在我的活動的onDrawFrame方法中運行以下代碼。所述活動實現帶有@Override標記的onDrawFrame的GLSurfaceView.Renderer。我的代碼是:
gl.glViewport(0, 0, screen_width, screen_height);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); //set background to black
gl.glClearDepthf(1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION); // Change PROJECTION matrix
gl.glLoadIdentity();
float aspect_ratio = (float) screen_width/screen_height;
GLU.gluPerspective(gl, 67, aspect_ratio, 1, 100);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glMatrixMode(GL10.GL_MODELVIEW); // Change MODELVIEW matrix
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, 20, 0, 0, 0, 0, 1, 0);
// make triangle with vertices (-2,0,0), (2,0,0), and (0,.5,0)
float[] vertices = { -2f, 0, 0, 2f, 0, 0, 0, .5f, 0 };
ByteBuffer buffer = ByteBuffer.allocateDirect(vertices.length * 4);
buffer.order(ByteOrder.nativeOrder());
FloatBuffer vertex_buffer = buffer.asFloatBuffer();
for (int i = 0; i < 9; i++) {
vertex_buffer.put(vertices[i]);
}
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertex_buffer);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_DEPTH_TEST);
下面的幾點是關於我在上面的代碼中關於攝像頭設置的假定的簡短說明。如果我在以下解釋中遇到了問題,請糾正我,因爲這可能已經解決了我所有的問題!
- glMatrixMode(GL10.GL_PROJECTION)切換到改變相機矩陣(針對我加載單位矩陣直接事後)
- GLU.gluPerspective(GL,67,ASPECT_RATIO,1,100)設置一個透視投影在y維上具有67度視角的視野。使用「aspect_ration =(float)width/height」OpenGL計算x維中的視角。此外,「1」是近剪裁平面,而「100」是在這種情況下的遠剪裁平面的值。
- 據我所知無關緊要,在代碼gluLookAt被調用的地方,只要它是在實際繪圖之前完成的(我對此不確定)。在這個例子中,我首先轉換到MODELVIEW矩陣,加載一個單位矩陣,然後調用gluLookAt。 「GLU.gluLookAt(gl,0,0,0,0,0,0,0,1,0)」實際上由三個3元素向量組成。最初的一個(在本例中爲(0,0,20))設置相機在世界座標中的位置(即正Z軸上的20個單位,這意味着它在手機屏幕的正面「伸出」 )。第二個矢量確定相機看到的世界座標系中的點(在此示例中爲座標系的原點,即相機沿着負z軸看)。第三個矢量是向上矢量,它定義了攝像機座標系統的y軸方向(因此也是通過與攝像機位置到它所看點的矢量交叉乘積得到的x軸)。
三角形繪圖代碼是從教程中複製的(但我在其他教程中也發現了類似的代碼,所以我認爲這不是問題)。
據我所知,相機現在位於(0,0,20)上並朝向座標系的原點。它的繪製截止點開始於z值19並且最高達-80(相機在z軸點20並且沿着負z軸看;其觀看截錐在1和100處具有近平面和遠平面沿着這種情況下的負z軸))。因此,三角形應該是可見的,因爲其頂點位於z軸= 0平面(即xy平面)上的原點周圍,這明顯位於觀察截錐內。此外,所繪製的頂點按逆時針順序排列;在OpenGL中的默認值。
因此,經過這麼長時間的介紹後,我的一個簡單問題是:我搞砸了什麼,以致於這些代碼不能達到我期望的效果?
你試過完全禁用深度測試嗎?你是否在任何地方設置頂點顏色或照明,例如你是否可以在黑色背景上畫一個黑色的三角形? – bosmacs 2010-09-21 20:33:17
gluPerspective和gluLookAt都將當前矩陣(由glMatrixMode設置)相乘。儘管 – dave 2010-09-21 20:35:43
我已經嘗試過禁用深度測試 - >沒有改變任何東西。我不設置頂點顏色或光照以儘可能簡化示例。有關我所嘗試的更多細節,請參閱brone的答案。 – delirium 2010-09-22 06:19:18