2010-11-22 22 views
2

Je travaille sur une application Java OpenGL décrite ci-dessous. L'application montre une grande texture 2D d'une carte du monde. Certaines informations doivent être représentées comme des légendes sur la carte (par exemple, une légende près de l'Espagne qui montre sa population). Les légendes sont des objets GL composés de polygones et de texte. L'utilisateur doit être capable de naviguer sur la carte (gauche, droite, haut et bas) ainsi que de zoomer (+) et de zoom arrière (-). Lorsque l'utilisateur effectue ces opérations, la carte doit être déplacée ou redimensionnée et les légendes doivent se déplacer avec la carte mais conserver les mêmes dimensions.OpenGL: Dessiner des objets (taille fixe, indifférente au zoom et position relative) sur une carte

Je fais la vue 2D avec glOrtho, le mouvement avec glTranslate et le zoom avec glScale. Au début, lors du zoom, les légendes sont redimensionnées avec la carte, de sorte que les légendes sont devenues trop grandes ou trop petites. Pour résoudre ce problème, j'ai affiché les légendes [1]. Avec le billboard, les légendes ne sont pas redimensionnées mais ne gardent pas leur position relative sur la carte en zoomant sur & (j'ai besoin de la légende de l'Espagne restant toujours près de l'Espagne). En résumé, j'ai besoin que les légendes se déplacent avec la carte, en conservant une taille fixe et une position relative par rapport à la carte.

Y at-il un moyen de faire ce que j'ai besoin de faire?

[1] http://www.lighthouse3d.com/opengl/billboarding/index.php3?billCheat

Répondre

0

Je pense que point sprites vous servirais bien ici. Un point d'éclair est un point texturé que vous pouvez rendre dans l'espace 3D directement avec votre carte. La texture du point est simplement rendue "plate", pas déformée comme vous l'avez dessinée sur un quad. Vous pouvez même définir la fonction de mise à l'échelle afin que le "panneau d'affichage" varie avec la distance.

+0

Pour le moment, je n'ai pas besoin de mapper des textures. J'ai besoin de placer les légendes, qui sont construites par des lignes et des polygones, sur la carte. Ces légendes ont une taille fixe, mais leur position est relative à la carte. Donc, si la carte est agrandie, la légende doit être traduite dans sa nouvelle position relative en gardant sa taille. Ici (http: // stackoverflow.com/questions/850988/dessin-point-like-formes-in-opengl-indifférent-to-zoom/851007 # 851007), il y a un problème similaire, mais rappelez-vous que mes formes "ponctuelles" sont des lignes et des polygones. – txedo

0

Je cherchais quelque chose de similaire à votre question, je devais rendre un cercle en pointillés qui pourrait rester fixé sur l'écran quelle que soit la rotation/vue/mise à l'échelle

Après quelques tentatives, je réussi à le faire fonctionner, peut-être ne pouvait pas être le meilleur en terme de performances, mais si vous n'êtes pas le rendu d'objets lourds pour le GPU moderne, ce ne devrait pas être un problème:

dispay().. 

// set modelview Matrix 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     glu.gluLookAt(0, 0, 2, 0, 0, 0, 0, -1, 0); 

    gl.glMatrixMode(GL2.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrtho(-1.2, 1.2, -1.1, 1.1, 0, 100); 
     renderDashedCircle(gl); 
     if(activatePerspectiveView) { 
      gl.glLoadIdentity(); 
      aspect = gLAutoDrawable.getWidth()/gLAutoDrawable.getHeight(); 
      glu.gluPerspective(60, aspect, 1, 100); 

le rendu est critique dans « renderDashedCircle (gl); »

soins Dont au sujet Ortho/perspective, qui est quelque chose qui appartient à mon programme (fondamentalement, il est en mesure de passer à la volée entre eux)

0

J'ai eu un problem similaire

Nous avons fini de répondre à ma propre question;)
Mon approche utilise un shader de géométrie (opengl 3 est donc un minimum). Il crée un quad à partir d'un point; Le quad est rendu dans une projection de perspective - pas ortho. Cela permet des tests de profondeur faciles (en fait, je ne fais même pas de calculs de profondeur - ils sont tous automatiques). J'ai modifié un peu le shader pour que le quad reste constant quel que soit le zoom. Je veux que vous vérifiez d'abord si cette solution est faisable pour vous et puis je mettrai à jour ma réponse et posterai le code de shader et l'expliquerai.