2011-02-24 6 views
4

J'ai déjà vérifié les autres questions sur ce sujet et leurs solutions n'ont pas fonctionné pour moi. Je suis un peu perdu. J'ai les fonctions suivantes dans mon implémentation de GLEventListener.GLU.gluLookAt dans les liaisons OpenGL Java semble ne rien faire

public void init(GLAutoDrawable gl) { 
    GL2 gl2 = gl.getGL().getGL2(); 

    gl2.glMatrixMode(GL2.GL_PROJECTION); 
    gl2.glLoadIdentity(); 
    GLU glu = GLU.createGLU(gl2); 
    glu.gluPerspective(45.0f, 1, 0.1f,100.0f); 
    gl2.glMatrixMode(GL2.GL_MODELVIEW); 
    gl2.glLoadIdentity(); 
    gl2.glViewport(0, 0, width, height); 
    gl2.glEnable(GL.GL_DEPTH_TEST); 
} 

private void render(GLAutoDrawable drawable) { 

    GL2 gl = drawable.getGL().getGL2(); 
    GLU glu = GLU.createGLU(gl); 

    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    glu.gluLookAt(5, 0, 20, 
        0, 30, 0, 
        0, 1, 0); 

    gl2.glPushMatrix(); 
    gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);     
    gl2.glLoadIdentity(); 
    gl2.glTranslatef(x, y, z);   
    gl2.glBegin(GL2.GL_QUADS); 
     gl2.glColor3f(1, 0, 0); 

     //24 glVertex3f calls & some colour changes go here. 
     gl2.glVertex3f(...) 

    gl2.glEnd(); 
    gl2.glPopMatrix(); 

    gl.glFlush(); 
} 

Peu importe quelles sont les valeurs que je mets dans la matrice gluLookAt(), la vue ne change pas. Je finis toujours par regarder le même visage d'un cube.

Des idées?

Merci

+0

Utilisez-vous des shaders pour dessiner votre cube? – kvark

+0

Je suis nouveau à cela et je ne sais pas ce que cela signifie. Le cube ne contient que 24 appels glVertex3f() et quelques changements de couleur entre glBegin (quads) et glEnd(). Je vais éditer mon post pour montrer un peu plus de mon code de dessin. – Joel

+0

vérifiez la réponse ci-dessous - Je pense que vous avez un bug dans votre code de dessin. –

Répondre

6

EDIT: Répondant à la modifier dans la question initiale. Laissant le texte original ci-dessous parce que les gens semblent le trouver utile. Je pense que votre problème est dans votre code de dessin de cube. Vérifiez le commentaire ci-dessous: l'appel glLoadIdentity fait exactement ce que vous attendez - forcer le cube à être là devant vous:

gl2.glPushMatrix();  
gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
/** Try removing the following glLoadIdentity call below. 
    * That call was blowing out the MODELVIEW matrix - it's removing your 
    * gluLookAt call and returning to the identity. 
    * As a result, the cube will always be right there in front of you. 
    */ 
// gl2.glLoadIdentity(); 
gl2.glTranslatef(x, y, z); 
gl2.glBegin(GL2.GL_QUADS); 
gl2.glColor3f(1, 0, 0); //24 glVertex3f calls & some colour changes go here. 
gl2.glVertex3f(...) 
gl2.glEnd(); 
gl2.glPopMatrix(); 

Voici une explication très rapide sur ce que feront les appels liés. Consultez la documentation pour plus d'informations:

gl2.glPushMatrix(); // This preserves current MODEL_VIEW matrix so you can get back here. 
        // Think of it as a checkpoint save in a game. 
        // Most of your objects will be wrapped in push and pop. 
gl2.glLoadIdentity(); // This erases the MODEL_VIEW and replaces it with an identity. 
         // This un-does your previous gluLookAt call. You will rarely use 
         // this inside an object (but it's not impossible). 
         // Does not apply here so don't use. 
gl2.glTranslatef(x, y, z); // This is what puts your object out in space for you to find 
          // as opposed to putting it at the origin. Most objects will 
          // have a translate (and likely a rotate as well). 
          // Note that the order of operations matters: 
          // translate and then rotate != rotate and then translate. 
// QUAD strip code with vertices and colors - you're okay with these. 
gl2.glPopMatrix(); // This brings back the MODEL_VIEW that you originally saved by pushing 
        // it. 

La grande chose au sujet du code de matrice dans OpenGL est qu'une fois que vous obtenez un portefeuille de code exemple que vous comprenez, vous aurez toujours comme référence. Lorsque je suis passé de IrisGL à OpenGL dans la journée, il m'a fallu un peu de temps pour mettre mes utilitaires sur et puis je n'ai jamais regardé en arrière.

ORIGINAL: Vous devez ajouter votre code de dessin de cube - si vous placez le cube à proximité de (0, 30, 0), il est très probable que le code fasse ce que vous lui avez demandé.

En vérifiant la FAQ OpenGL, il y a une question et une réponse spécifique qui est probablement pertinente à ce que vous faites: 8.080 Why doesn't gluLookAt work? Je vais citer toute la réponse car il n'y a vraiment pas une bonne pause mais s'il vous plaît visitez le OpenGL FAQ , la réponse est probablement là:

Ceci est généralement causé par des transformations incorrectes.

En supposant que vous utilisez gluPerspective() sur la pile de la matrice de projection avec zNear et zFar comme les troisième et quatrième paramètres, vous besoin de mettre gluLookAt sur la pile de la matrice MODELVIEW et passer des paramètres afin la géométrie entre zNear et zFar.

Il est généralement préférable d'expérimenter avec un simple morceau de code lorsque vous êtes essayer de comprendre l'affichage transformations. Disons que vous êtes en essayant de regarder une unité de sphère centrée sur l'origine.Vous voulez configurer vos transformations comme suit:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(50.0, 1.0, 3.0, 7.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(0.0, 0.0, 5.0, 
      0.0, 0.0, 0.0, 
      0.0, 1.0, 0.0); 

Il est important de noter comment la projection et MODELVIEW transforme le travail ensemble.

Dans cet exemple, la transformation de Projection définit un champ de vue de 50,0 degrés , avec un rapport d'aspect de 1,0. Le plan de découpage zNear est 3,0 unités devant l'œil et le plan de coupe zFar est de 7,0 unités devant de l'œil. Cela laisse un volume Z distance de 4,0 unités, amplement d'espace pour une sphère unité.

La MODELVIEW transformée définit la position des yeux à (0,0, 0,0, 5,0), et le look au point est l'origine au centre de notre sphère unité. Notez que la position des yeux est de 5,0 unités à partir du point de vue. C'est important, car une distance de 5,0 unités en face de l'œil est dans le milieu du volume Z que la transformation de projection définit. Si l'appel gluLookAt() avait placé l'œil à (0.0, 0.0, 1.0), cela produirait une distance de 0 à de l'origine. Ce n'est pas assez long pour inclure la sphère dans le volume de la vue, et serait découpé par le plan zNear clipping .

De même, si vous placez l'oeil à (0,0, 0,0, 10,0), la distance de 10,0 à l'aspect au point entraînera la sphère unité étant 10,0 unités de distance de l'œil et loin derrière la zFar plan de coupe placé à 7,0 unités. Si cela vous a rendu confus, lisez les transformations dans le livre rouge OpenGL ou la spécification OpenGL. Après avoir comprendre l'espace de coordonnées de l'objet, espace de coordonnées œil, et l'espace de coordonnées clip , le ci-dessus devrait devenir clair. En outre, expérimenter avec petits programmes de test. Si vous rencontrez des problèmes pour obtenir les bonnes transformations dans votre projet d'application principale, il peut être éducatif pour écrire un petit morceau de code qui tente de reproduire le problème avec une géométrie plus simple.

+0

J'ai déjà lu cette partie de la FAQ et je n'ai rien trouvé pour vous aider. Les nombres que j'ai entrés dans la matrice gluLookAt() ici sont arbitraires. Le cube est centré à (0, 0, -5.0) et a des côtés de longueur 1. Quand mon programme commence, je regarde toujours directement la face avant, quelles que soient les coordonnées de gluLookAt(). – Joel

+0

Ça a marché! Cela m'apprendra à ne pas laisser de côté ce que je pense être le code standard ... Une question cependant.Je pensais que loadIdentity() ne s'appliquait qu'au sommet de la pile. Depuis que j'ai poussé une matrice avant de l'appeler, ne devrait-il pas avoir eu aucun effet après avoir éclaté la pile? – Joel

+0

@Joel, je vais ajouter à la réponse. Attendre. –

Questions connexes