2009-11-17 5 views
2

Je travaille sur un petit jeu sous OpenGL ES.OpenGL ES - comment garder certains objets à une taille fixe?

En arrière-plan, il y a un monde/carte. La carte est juste une grande texture. Zoom/Pincée/Pan est utilisé pour se déplacer. Et j'utilise glOrthof (gauche, droite, bas, haut, zNear, zFar) pour implémenter le zoom/pincement. Lorsque j'effectue un zoom avant, les sprites situés en haut de la carte sont également agrandies. Mais j'aimerais que certains sprites restent à une taille fixe.

Je pourrais probablement calculer un facteur d'échelle, en fonction des paramètres à glOrthof, mais il doit y avoir une façon plus naturelle et simple de le faire, au lieu de mise à l'échelle les sprites vers le bas quand je zoome.

Si je ajouter du texte ou des éléments de GUI au-dessus de la carte, ils devraient certainement avoir une taille fixe.

Existe-t-il une solution pour cela, ou dois-je laisser des valeurs fixes dans glOrthof et implémenter le zoom/pincement d'une autre manière?

EDIT: Pour être plus clair: je veux des sprites qui font un zoom avant/arrière avec la carte, mais restent à la même taille. J'ai quelques éléments qui sont comme les broches sur l'application cartographique de l'iPhone. Lorsque vous zoomez, les broches restent de la même taille, mais vous vous déplacez sur l'écran pour rester au même endroit sur la carte. C'est principalement ce que je veux une solution. Des solutions pour cela sont déjà venues ci-dessous, merci!

Répondre

0

une solution dans trouvé ce fil: Drawing "point-like" shapes in OpenGL, indifferent to zoom

sprites point ... L'exemple GLPaint d'Apple utilise également cela. Assez simple à utiliser. Utilise la texture actuelle.

glEnable(GL_POINT_SPRITE_OES); 
glTexEnvf(GL_POINT_SPRITE_OES, GL_COORD_REPLACE_OES, GL_TRUE); 
glPointSize(40.0f); 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_POINTS, 0, 4); 

Ils se déplacent lorsque la carte se déplace, mais ne changent pas de taille.

Éditer: Un petit conseil: Rappelez-vous que la coordonnée du point est le milieu de la texture, pas un coin ou quoi que ce soit. J'ai lutté un peu avec mes sprites apparemment "en mouvement", parce que j'ai utilisé seulement les pixels 35x35 en haut à gauche dans une texture 64x64. Déplacez vos graphiques au milieu de la texture et tout ira bien.

1

Appelez d'abord le glOrthof avec les paramètres que vous avez, puis dessinez les éléments qui évoluent. Puis faites un autre appel à glOrthof avec différents paramètres (après glLoadIdentity probablement), puis dessinez les choses qui ne devraient pas être mises à l'échelle.

+0

A fait un test rapide avec ceci. Les sprites conservent la même taille/position lorsque je zoome sur la carte. Cette solution fonctionnera bien pour les éléments qui devraient rester sur une position fixe sur l'écran de l'iPhone, comme les éléments de l'interface utilisateur et le texte. Mais j'aimerais avoir des sprites pour rester sur la même position sur la carte. Un peu comme les broches sur l'application cartographique de l'iPhone.Lorsque vous effectuez un zoom/un panoramique sur la carte, les broches restent sur la même position par rapport à la carte, mais la taille de la broche reste la même. Existe-t-il une solution rapide pour cela? :-) – OMH

+0

Poussez une matrice d'échelle sur la pile (avec 'glScalef' ou une autre) pour inverser la mise à l'échelle du monde, avant de dessiner vos sprites. – Thomas

+0

Intéressant, mais je ne comprends pas très bien. Pourriez-vous élaborer un peu, s'il vous plaît? – OMH

0

vous pouvez utiliser quelque chose comme ceci pour dessiner des éléments de taille fixe à une position 3D donnée, en gardant les paramètres de projection actuels:

// go to correct coordinates 
double v[3] = { x , y , z }; 
glRasterPos3dv(v); 
glBitmap(0 , 0 , 0 , 0 , -center_pix_x , -center_pix_y , NULL); 

// and draw pixels 
glPixelStorei(GL_PACK_LSB_FIRST , true); 
glPixelStorei(GL_PACK_ALIGNMENT , 1); 
glDrawPixels(img_width , img_height , GL_RGBA , GL_UNSIGNED_BYTE , img_data_ptr); 

center_pix les coordonnées du point de référence dans l'image-objet qui correspondra à la 3D point.