2009-03-11 8 views
5

Im en utilisant glScalef() pour zoomer dans mon programme, maintenant quand je revenir en arrière à la taille d'origine avec le code:comment inverser glScalef()?

glScalef(1.0f/ZOOM, 1.0f/ZOOM, 1); 

cela ne fonctionne pas très bien élevé ... zooms (peut-être à cause de la perte décimales?)

Comment puis-je revenir parfaitement à la taille d'origine sans calculs comme ci-dessus?

Répondre

8

Vous pouvez soit le faire comme ceci:

ZOOMSQRT = sqrt(ZOOM); 
glScalef(1.0f/ZOOMSQRT, 1.0f/ZOOMSQRT, 1); 
glScalef(1.0f/ZOOMSQRT, 1.0f/ZOOMSQRT, 1); 

ou utiliser glPushMatrix/glPopMatrix pour restaurer la matrice d'origine avant le zoom:

glPushMatrix(); 
glScalef(ZOOM, ZOOM, 1); 
[do whatever you like here...] 
glPopMatrix(); // now it's at normal scale again 
[do other things here...] 
+0

merci! J'ai complètement oublié glPushMatrix(): $ –

+0

Vous ne devriez pas - c'est très important :) Mais je suppose que cela n'arrivera plus;) – schnaader

2

magasin la taille précédente quelque part, par exemple dans une pile, et utilise ça.

(animant la transition vers un zoom précédent, panoramique et le réglage rotate est assez amusant plutôt que le zoom)

5

Vous pouvez simplement enregistrer votre matrice de projection. glPushMatrix(), glScalef(), ..., glPopMatrix()

4

Utilisez glPushMatrix() avant votre première glScalef() pour insérer la matrice du modèle en cours sur la pile, puis glPopMatrix() lorsque vous voulez revenir l'échelle d'origine, de cette façon il n'y aura pas d'erreurs d'arrondi car il n'y a pas de calculs en cours.