2009-03-11 6 views
5

Im usando glScalef() per eseguire lo zoom nel mio programma, ora quando ho tornare indietro al formato originale con il codice:come ripristinare glScalef()?

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

doesnt lavoro molto bene in alto zoom ... (forse a causa della perduta decimali?)

Come posso ripristinare indietro perfettamente alla dimensione originale senza calcoli come sopra?

risposta

8

Si potrebbe o fare in questo modo:

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

o utilizzare glPushMatrix/glPopMatrix per ripristinare la matrice originale prima dello zoom:

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

grazie! ho completamente dimenticato glPushMatrix(): $ –

+0

Non dovresti - è molto importante :) Ma immagino che questo non accadrà di nuovo;) – schnaader

2

Conservare le dimensioni precedenti da qualche parte, dice in una pila, e usalo

(animare la transizione di nuovo ad un precedente zoom, pan e rotazione impostazione è abbastanza divertente, piuttosto che lo zoom)

5

Si può semplicemente salvare la matrice di proiezione. glPushMatrix(), glScalef(), ..., glPopMatrix()

4

Usa glPushMatrix() prima del tuo primo glScalef() per spingere la matrice del modello corrente nello stack e poi glPopMatrix() quando vuoi tornare indietro la scala originale, in questo modo non ci saranno errori di arrotondamento in quanto non vengono eseguiti calcoli.