Question

J'ai récemment eu quelques problèmes de mise en œuvre d'une fonction de zoom dans une application de peinture. S'il vous plaît laissez-moi commencer par vous donner quelques informations de base.

D'abord, je commence par modifier glPaint l'application de démonstration d'Apple. Je pense qu'il est une grande source, car il vous montre comment configurer le EAGLView, etc ...

Maintenant, ce que je voulais faire ensuite, était de mettre en œuvre des fonctionnalités de zoom. Après avoir fait quelques recherches, j'ai essayé deux approches différentes.

1) l'utilisation glOrthof

2) modifier la taille du cadre de mon EAGLView.

Alors que les deux façons me permettent de zoomer parfaitement in / out, j'éprouve des problèmes différents, quand il est en fait à la peinture en zoomant.

Quand j'utiliser (1), je dois rendre la vue comme ceci:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(left, right, bottom, top, -1.0f, 1.0f); //those values have been previously calculated
glDisable(GL_BLEND);
//I'm using Apple's Texture2D class here to render an image
[_textures[kTexture_MyImage] drawInRect:[self bounds]];
glEnable(GL_BLEND);
[self swapBuffers];

Maintenant, supposons que je zoome un peu, puis je peins et après cela, je veux effectuer un zoom arrière. Pour obtenir ce travail, je dois faire en sorte que « kTexture_MyImage » contient toujours les dernières modifications. Pour ce faire, je dois capturer le contenu de l'écran après que les modifications ont été apportées et les fusionner avec l'image originale. Le problème ici est que quand je zoome, mon écran ne montre une partie de l'image (agrandie) et je n'ai pas trouvé une bonne façon de traiter ce encore.

J'ai essayé de calculer quelle partie de l'écran a été agrandi, puis faire la capture. Après que je remets à la côte cette partie à sa taille d'origine et l'utilisation encore une autre méthode pour le coller dans l'image originale à la position correcte.

Maintenant, je pourrais aller plus en détail sur la façon dont j'ai réalisé, mais il est vraiment compliqué et je me suis dit, il doit y avoir un moyen plus facile. Il existe déjà plusieurs applications là-bas, que parfaitement faire, ce que je suis en train de réaliser, il doit être possible.

En ce qui concerne l'approche (2) va, je peux éviter la plupart de ce qui précède, puisque je change seulement la taille de la fenêtre de ma EAGLView. Toutefois, lorsque la peinture, les coups sont loin de leur position attendue. Je probablement besoin de prendre le niveau de zoom en compte lors de la peinture et re-calculer les Points Cg d'une manière différente.

Cependant, si vous avez fait des choses semblables dans le passé ou peut me donner une idée, comment je pourrais mettre en œuvre un zoom sur mon application de peinture, je l'apprécie vraiment.

Merci à l'avance.

Était-ce utile?

La solution

Oui, il est certainement possible.

En ce qui concerne la peinture des programmes, vous devez tenir une liste liée ou un arbre d'objets à dessiner pour l'insertion / retrait facile. Lorsque l'utilisateur cesse de peindre, (à savoir touchesEnded), vous ajoutez des objets à la structure de données contenant votre scène.

Lorsque vos zooms utilisateur vous devez moduler les coordonnées des objets que vous dessinez par rapport à la fenêtre actuelle, projection et transforme MODELVIEW. Dans votre cas, vous ne changez pas la fenêtre ou les transformations de MODELVIEW si vous avez besoin que compte pour la transformation de projection. Vous pouvez également mettre en œuvre votre zoom à l'aide d'une traduction et d'échelle sur la matrice modelview mais je vais ignorer ce cas pour la simplicité car elle implique l'inversion des transformations.

Les bonnes nouvelles sont que vous utilisez une projection orthographiques si les coordonnées du monde correspondent à des coordonnées de la fenêtre lorsqu'aucun zooming est en vigueur. Le cas dans votre « monde » est une toile simple qui correspond probablement à la taille du dispositif en coordonnées de la fenêtre.

Avant d'ajouter un objet à votre structure de données de la scène, convertir toutes les coordonnées, en utilisant la projection en cours de transformation (à savoir les paramètres à l'appel glOrthof ()) en coordonnées du monde (à savoir les coordonnées complètes de toile). Vous ne restez sain d'esprit si vous gardez toutes les choses dans votre modèle dans le même espace de coordonnées.

Pour convertir les coordonnées, en supposant ne pouvez jamais effectuer un zoom arrière passé dimensions de l'appareil complet dans votre appel glOrtho (), vous devrez les réduire proportionnelles aux rapports de vos dimensions ortho zoomées à vos dimensions zoomée ortho puis les biais par la différence entre votre zoomé en bas ortho, les valeurs de gauche et celles des valeurs ortho zoomée d'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top