2010-08-09 23 views
3

我試圖在Android應用程序中使用gluLookAt來移動「相機」,但我沒有看到任何結果。我環顧四周,我發現任何glLoadIndentity()調用都會重置矩陣,取消gluLookAt的效果。儘管使用Push/PopMatrix進行轉換,gluLookAt不工作

問題是,無論我放在我的gluLookAt調用中,什麼都不會移動。

因此,這裏是我的表面設置的相關部分:

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearColor(0f, 0f, 0f, 0.5f); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
} 

public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 

    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45f, (float) width/(float) height, 0.01f, 200f); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
} 

然後我幀繪製方法是:

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    GLU.gluLookAt(gl, 0, 0, 100, 0, 0, 0, 0, 1, 0); 

    for (int i = 0; i < obj.size; i++) { // obj is an array of positions 
     obj = mObj[i]; 

     gl.glPushMatrix(); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(obj.position.x(), obj.position.y(), obj.position.z()); 
     gl.glRotatef(obj.rotation.x(), 1f, 0f, 0f); 
     gl.glRotatef(obj.rotation.y(), 0f, 1f, 0f); 
     gl.glRotatef(obj.rotation.z(), 0f, 0f, 1f); 
     obj.draw(gl); // the objects 'draw' themselves 
     gl.glPopMatrix(); 

    } 

} 

這是我的對象的draw()函數的例子,這本質上吸引了一堆元素:

class SomeObject { 

    public void draw(GL10 gl) { 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glEnableClientState(GL10.GL_NORMAL_ARRAY); 

     gl.glEnable(GL10.GL_CULL_FACE); 
     gl.glFrontFace(GL10.GL_CCW); 
     gl.glCullFace(GL10.GL_BACK);    

     gl.glColor4f(1f, 0f, 0f, 1f); 
     gl.glDrawElements(GL10.GL_TRIANGLES, SomeObject.fCount, GL10.GL_UNSIGNED_BYTE, faceBuffer); 
     gl.glColor4f(1, 1, 1, 1); 

     gl.glDisableClientState(GL10.GL_NORMAL_ARRAY); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    } 
} 

回答

4

給這個版本一個鏡頭:

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    GLU.gluLookAt(gl, 0, 0, 100, 0, 0, 0, 0, 1, 0); 

    for (int i = 0; i < obj.size; i++) { // obj is an array of positions 
     obj = mObj[i]; 

     gl.glPushMatrix(); 
     gl.glTranslatef(obj.position.x(), obj.position.y(), obj.position.z()); 
     gl.glRotatef(obj.rotation.x(), 1f, 0f, 0f); 
     gl.glRotatef(obj.rotation.y(), 0f, 1f, 0f); 
     gl.glRotatef(obj.rotation.z(), 0f, 0f, 1f); 
     obj.draw(gl); // the objects 'draw' themselves 
     gl.glPopMatrix(); 
    } 
} 
+1

啊,我是個白癡。仍然得到那些glLoadIdentities :)整個狀態模型,矩陣轉換序列的東西對我來說是新的。謝謝! – Cylindric 2010-08-10 10:34:05

+0

沒問題,很高興這是一個簡單的修復:) – genpfault 2010-08-10 14:35:09