2011-07-05 4 views
2

J'essaie de ne pas avoir de différence de taille avec les sprites, si vous augmentez z à plus loin.
Cependant, je n'ai pas de chance, il devient encore plus petit:OpenGL-ES Activer le mode orthographique 2D

|| EDIT ||

J'ai maintenant ces méthodes

public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    float _width = 320f; 
    float _height = 480f; 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0, _width, 0, _height, 1, 100); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    // Load textures , 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    for (int a = 0; a < squares.length; a++) { 
     squares[a].loadGLTexture(gl, context); 
    } 
} 

.

public void onDrawFrame(GL10 gl) { 
    //Clear Screen And Depth Buffer 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    gl.glLoadIdentity();     //Reset The Current Modelview Matrix 
    gl.glTranslatef(.0f, 1.0f, locZ); 
    squares[0].draw(gl); 
    gl.glLoadIdentity(); 
    gl.glTranslatef(0.5f, 0.f, locZ); 
    squares[1].draw(gl);   
    gl.glLoadIdentity(); 
    gl.glTranslatef(-0.5f, -0.5f, locZ); 
    squares[2].draw(gl); 
    gl.glLoadIdentity(); 
    gl.glTranslatef(-0.5f, -0.5f, locZ); 
    squares[3].draw(gl); 


    //change zvalues 
    if(locZ >= 4.0f){ 
     speedZ *= -1.0f; 
     locZ = 3.9f; 
    } 
    else if(locZ <= -4.0){ 
     speedZ *= -1.0f; 
     locZ = -3.9f; 
    } 

    locZ += speedZ; 

} 

Je change les valeurs z, et par conséquent la distance de la « caméra », et attendre que depuis que je ne veux pas utiliser la perspective (mode orthographiques), la taille des carrés doivent rester constant. Mais ils ne le font pas. J'espère que cela aide un peu plus.

+0

Comment êtes-vous intéressé par une nouvelle réponse? – kravemir

+0

@Miro désolé, ne fonctionne toujours pas. Edited ma question. – usealbarazer

Répondre

5

Vous avez mauvais paramètres glOrtho:

gl.glOrthof(0, width, 0, height, 0.01f, 100.0f); 

Ou

gl.glOrthof(0, width, height, 0, 0.01f, 100.0f); 

EDIT: à matrice oublier de remise à zéro - glLoadIdentity.

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    /* SET NEW PROJECTION HERE: ortho or perspective */ 
    gl.glOrthof(0, _width, 0, _height, 0.001f, 100); 

    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    /* SET NEW MODELVIEW MATRIX(space transformation) HERE and DRAW YOUR STUFF */ 

    //change zvalues 
    if(locZ >= 99.0f){ 
     speedZ *= -1.0f; 
     locZ = 99.0f; 
    } 
    else if(locZ <= 1.0){ 
     speedZ *= -1.0f; 
     locZ = 1.0f; 
    } 

} 

Ces étapes doivent être effectuées avant le rendu 2D, resp. passer de la projection 3D à la projection 2D, pas lors de la création de texture ou d'un objet. Ne sait pas beaucoup sur public void onSurfaceCreated, mais il ne semble pas faire partie de la boucle de rendu.

+0

En dehors de la taille des carrés, cela n'a pas supprimé la perspective. Une idée de ce que je pourrais essayer ensuite? – usealbarazer

+0

modifier, la matrice doit être définie sur l'identité lors de la définition d'une nouvelle projection – kravemir

+0

Veuillez vérifier ma modification. – usealbarazer

0

Ainsi, l'origine est au milieu de votre GLSurfaceView, ce n'est pas une mauvaise idée de faire quelque chose comme:

gl.glOrthof(-width/2, width/2, -height/2, height/2, 0.1f, 100.0f); 
0

ici vous pourriez avoir deux méthodes; un pour passer en vue orthoscopique dans laquelle un openGLUnit = un pixel d'écran pour dessiner en 2d sur l'écran. Ensuite, la méthode suivante permet de revenir au dessin 3D. Faites votre 2d dessin après le rendu 3D et d'abord appelez la méthode switchToOrtho et quand vous avez fini d'appeler la méthode switchBackToFrustum.

public void switchToOrtho() { 
    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glOrthof(0, self.view.bounds.size.width, 0, self.view.bounds.size.height, -5, 1);   glMatrixMode(GL_MODELVIEW); glLoadIdentity(); 
} 

public void switchBackToFrustum() { 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 
Questions connexes