2010-11-15 6 views
1

J'ai des difficultés à configurer une vue Ortho pour dessiner 2D sur une scène 3D.Tentative d'utilisation d'Ortho pour le dessin 2D

Je mis en place mon point de vue comme celui-ci:

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, 45.0f, ((float)width/(float)height), 0.1f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

et je mis en place mon avis Ortho comme ceci:

public void onSurfaceOrtho(GL10 gl) { 
    gl.glOrthof(0.0f, 100.0f, 100.0f, 0.0f, -0.1f, 0.1f); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
} 

Ensuite je dessine mon cadre comme celui-ci:

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    scene.onDrawFrame(gl); 
    gl.glPushMatrix(); 
    onSurfaceOrtho(gl); 
    screen.onDrawFrame(gl); 
    gl.glPopMatrix(); 
} 

Les objets de scène et d'écran dessinent des objets pour 3D et 2D. L'objet screen ne dessine rien car je ne fais que commencer avec les vues 2D Ortho. Cependant les objets de la scène dessinent un cube. Donc, tout fonctionne bien jusqu'à ce que j'ajoute le nouveau code pour le dessin 2D Ortho - de glPushMatrix() à glPopMatrix(). Maintenant, je ne vois rien d'autre que ma couleur claire.

Alors, quel est le code dans la fonction onSurfaceOrtho() cela efface-t-il mon écran?

Je m'attendrais à ce qui a été dessiné à la vue avant l'appel pour mettre en place une vue Ortho, pour être laissé seul. Je n'appelle aucun bit explicite clair, mais il semble que quelque chose efface ma vue - et c'est le code de la fonction onSurfaceOrtho().

Comment puis-je configurer correctement une vue Ortho 2D afin de pouvoir dessiner 2D sur mon vue 3D?

+0

Les troisième et quatrième paramètres de glOrtho ** bottom ** et ** top ** ne sont-ils pas respectivement? Si oui, vos valeurs ne sont-elles pas inversées? –

+0

@Martinho Fernandes: Je m'attendrais à ce que haut/gauche soit 0,0 et bas/droite à 100, 100 si je le fais comme ça. Mais je ne pense pas que cela a quelque chose à voir avec pourquoi ça ne marche pas, ou? – Espen

+0

Oui, cela fonctionnera probablement comme ça. Mais votre problème vient probablement de votre méthode onSurfaceOrtho parce que vous êtes en train de visser la matrice de projection et de la laisser comme mode en cours avant de redessiner votre cadre ... –

Répondre

1

Alors j'ai trouvé quoi faire avec un peu d'aide de Martinho Fernandes.

Je mis en place deux fonctions:

public void onSurfaceOrtho(GL10 gl) { 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0.0f, 100.0f, 0.0f, 100.0f, -0.1f, 0.1f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

public void onSurfacePerspective(GL10 gl) { 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45.0f, aspect, 0.1f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

Ensuite, lorsque le cadre est dessiner:

public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glLoadIdentity(); 
    onSurfacePerspective(gl); 
    scene.onDrawFrame(gl); 
    onSurfaceOrtho(gl); 
    screen.onDrawFrame(gl); 
} 

Donc, pour chaque image que je dois appeler ma fonction pour régler la perspective avant de dessiner en 3D, et puis appelle ma fonction pour ortho avant de dessiner 2D.

Je ne suis pas sûr si cela a des problèmes de performance, ou s'il y a quelque chose que je peux faire à ce sujet. Je sais que OpenGL a des listes qui peuvent aider un peu ici ...

+0

Rien de mal à la performance, les opérations matricielles sont une partie normale des opérations de dessin. En outre, vous pourriez envisager d'utiliser un VBO si vous pensez que votre dessin est lent. – fabspro

Questions connexes