2010-08-09 2 views
3

J'essaie d'utiliser gluLookAt dans une application Android pour déplacer la "caméra", mais je ne vois aucun résultat. J'ai regardé autour de moi et j'ai compris que tous les appels de glLoadIndentity() vont réinitialiser la matrice, annulant l'effet du gluLookAt.gluLookAt ne fonctionne pas malgré l'utilisation de Push/PopMatrix pour les transformations

Problème, peu importe ce que je mets dans mon appel gluLookAt, rien ne bouge.

Alors, voici la partie pertinente de ma configuration de surface:

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); 
} 

Et puis ma méthode cadre dessin est:

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(); 

    } 

} 

Et voici un exemple de la fonction draw() de mes objets , qui dessine essentiellement un tas d'éléments:

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); 
    } 
} 

Répondre

4

Donnez à cette version un tir:

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

Aargh, je suis un idiot. Toujours le coup de ces glLoadIdentities :) Tout le modèle d'état, la séquence de transformation de la matrice est nouveau pour moi. Je vous remercie! – Cylindric

+0

Pas de problème, content que ce soit une solution facile :) – genpfault

Questions connexes