2010-07-03 2 views
2

Je suis en train de mettre en place un jeu simple pour l'iPhone, et j'essaie de mettre en œuvre l'effet de déplacer la caméra autour de la GLView.Pourquoi mon objet disparaît-il après l'utilisation de gluLookat pour OpenGL ES 2.0?

Je dessine une centaine d'objets en utilisant glDrawArrays avec des pointeurs de vertex et de couleur. Après cela, je veux déplacer la caméra vers la droite d'1 unité. C'est l'extrait de code que j'ai dans ma méthode drawView. Je change le mode de la matrice à la pile de projection, et puis revenez au mode d'affichage de modèle après la manipulation du projet est terminée (je peux me tromper, je suis un débutant à OpenGL).

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glTranslatef(1.0, 0.0, 0.0); 
glMatrixMode(GL_MODELVIEW); 

Dans tous les cas, le résultat n'est certainement pas attendu. Ce qui se passe est que je vois mes objets très brièvement (pour peut-être un cadre), puis ils disparaissent. La même chose arrive si j'enlève le glTranslatef dans le bloc ci-dessus.

Qu'est-ce que je fais mal?

Merci d'avance!

Avant

alt text

Après

alt text

Répondre

6

L'un des aspects confus de OpenGL pour les débutants est la distinction entre ce qui se passe dans la matrice de projection par rapport à ce qui se passe sur la matrice modelview (et pourquoi auriez-vous besoin même les deux?)

La matrice de projection est en charge de transformer les coordonnées de vos sommets en points dans un système de coordonnées 2D (il éclabousse le monde sur votre film virtuel - la fenêtre). La matrice de projection ne spécifie que le comportement de votre caméra (par exemple: devrait-il s'agir d'un objectif grand angle, ou d'un téléobjectif, ou d'un objectif complètement orthogonal, comme des dessins architecturaux obliques?). D'autre part, la matrice modelview est chargée de spécifier où aller dans les espaces 3D. Ainsi, par exemple, pour spécifier où le bras d'un personnage est par rapport au corps du personnage, ou où ce personnage est par rapport au monde, vous voudrez changer la matrice modelview. Il est important de noter, en particulier, que les changements dans la position et l'orientation de la caméra appartiennent à la matrice de vue modèle (c'est la partie "vue")

La raison pour laquelle cela devient confus est qu'à la fin de le jour, les sommets que vous donnez OpenGL sont multipliés par la matrice modelview puis par la matrice de projection. En d'autres termes, étant donné une matrice de visualisation de modèle M, une matrice de projection P et un sommet v, la coordonnée finale du sommet est donnée par P M v. Cela signifie que certaines transformations semblent fonctionner quelle que soit la matrice que vous utilisez.Vous devriez faire attention à ce sujet - lorsque vous aurez recours à des techniques OpenGL plus sophistiquées, vous rencontrerez des situations dans lesquelles l'utilisation des bonnes matrices fera la différence. Jusqu'à ce que vous arriviez à ce point, cependant, permettez-moi de vous donner une bonne règle. Jusqu'à ce que vous vous habituiez à la distinction entre les deux matrices, n'utilisez que glOrtho ou glFrustum sur les matrices de projection (gluPerspective et leurs amis sont ok aussi). Tous les autres appels (glTranslate, glScale, glRotate, etc.) appartiennent à la classe de choses que vous devriez faire à la matrice modelview.

+0

J'aime vraiment cette réponse parce qu'elle donne une explication holistique de ce qui se passe dans les coulisses ici. Des livres que vous recommanderiez? –

+2

Le chapitre 3, "Affichage", du guide de programmation OpenGL ("Le Livre rouge") contient une discussion sur les transformations qui se produisent sur le pipeline OpenGL. –

4

Vous voulez probablement lire http://www.opengl.org/resources/faq/technical/viewing.htm (en particulier la section 8.080).

Utilisez quelque chose le long des lignes suivantes:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
// setup your projection matrix here, e.g. with glFrustum or gluPerspective 
glFrustum(...) 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(...) // with your gluLookAt parameters, of course 
glTranslatef(1.0, 0.0, 0.0); 
// your drawing code here 

Juste pour clarifier: gluLookAt crée une matrice qui est destinée à être multipliée par la matrice modelview. Si vous utilisez l'ordre des appels de fonction suggéré ci-dessus, les choses devraient fonctionner comme prévu. J'espère que cela aide.