2008-09-19 9 views
0

J'ai un jeu OpenGL ES que je pirate ensemble. Une partie de cela consiste à regarder une grande zone «semblable à une carte», puis à appuyer deux fois sur une partie pour la «zoomer». Comment utiliseriez-vous OpenGL ES pour fournir cet effet (étant donné qu'il peut avoir besoin de zoomer sur différentes parties de la carte).Comment créer un effet de zoom dans OpenGLES sur l'iPhone?

J'ai entendu parler de glScale et de glOrtho, mais je ne sais pas comment ils fonctionnent réellement, car tout le monde openGL est très nouveau pour moi.

Répondre

2

Le zoom 2D que vous décrivez pourrait être mieux réalisé avec Core Animation. NSView (et son homologue NDA'd iPhone) fournissent une animation implicite lorsque vous changez de cadre. Tout ce que vous auriez à faire dans ce cas serait de définir les cadres origin.x et origin.y et size.width et size.height du cadre à ces valeurs pour rendre la vue plus grande que l'écran. Si vous l'avez fait et l'avez enveloppé dans les appels appropriés pour démarrer et valider une animation, vous obtiendrez une animation de zoom gratuite. Core Animation utilise OpenGL en coulisses pour ses animations.

Si, cependant, vous pensez que vous devez faire cela en OpenGL, puis-je suggérer un peu d'écriture que j'ai fait au http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es? Je suis l'auteur de Molecules, un visualiseur moléculaire 3D gratuit pour l'iPhone, et je ne connaissais rien à OpenGL ES avant de commencer ce projet. Trois semaines plus tard, c'était dans l'App Store au lancement.

Les appels OpenGL sont assez simples, c'est le calcul qui les entoure qui peut vous donner des maux de tête. Zoomer sur des objets est en fait assez simple, et peut être fait soit en déplaçant la caméra ou en mettant à l'échelle physique des objets. Pour Molecules, j'ai fait la mise à l'échelle de l'objet en utilisant la fonction glScalef (x, y, z), où x, y et z sont les facteurs d'échelle que vous souhaitez appliquer à votre objet modèle. Je fais ma mise à l'échelle de façon incrémentielle. C'est-à-dire que je ne réinitialise pas la matrice de transformation au début de chaque image rendue (en utilisant glLoadIdentity()), mais juste l'échelle un peu en fonction de l'entrée de l'utilisateur. Si l'utilisateur écarte ses doigts de 5%, j'augmente l'échelle de 5%.

Encore une fois, je suggère Core Animation pour le zoom 2D que vous décrivez, mais il n'est pas trop difficile d'obtenir les mêmes résultats dans OpenGL ES.

+0

J'aurais pensé que la mise à l'échelle des molécules est beaucoup plus lente que le déplacement de la caméra car les molécules d'échelle signifient que toutes les données doivent être modifiées, mais le déplacement de la caméra change juste une matrice qui sera envoyée au processeur graphique. – danio

+0

@danio Je ne pense pas que ce soit nécessairement vrai. La mise à l'échelle de tous les objets entraînerait une modification ponctuelle de la matrice de transformation modèle-monde appliquée à ces objets. Transformer chaque objet d'un modèle en coordonnées mondiales ne serait encore qu'une seule multiplication matricielle. –

0

Respectueusement, la réponse est de prendre quelques jours pour apprendre les bases d'OpenGL, et il y a beaucoup de meilleurs endroits pour cela sur le net qu'ici.

+0

J'ai tendance à apprendre en essayant de répondre à quelques questions de base. Cela semble être un bon endroit pour répondre à cette question spécifique, car il est, selon toute vraisemblance, 1-4 lignes de code. –

+0

Assez juste, mais la réponse à votre question est nécessairement un tutoriel long sur les transformations OpenGL et autres. ça vaut la peine de prendre le temps de faire tomber les fondamentaux; http://nehe.gamedev.net/ est un bon point de départ. –

Questions connexes