Come posso evitare la deformazione durante la rotazione attorno alla linea di vista in OpenGL?
Domanda
Ho disegnato un'ellisse sul piano XZ e ho impostato la prospettiva leggermente in alto sull'asse Y e di nuovo sull'asse Z, guardando il centro dell'ellisse da un angolo di 45 gradi, utilizzando gluPerspective() per impostare il tronco di visualizzazione .
Senza rotazione, l'asse maggiore dell'ellisse copre la larghezza del mio viewport.Quando ruoto di 90 gradi attorno alla mia linea visiva, l'asse maggiore dell'ellisse ora copre l'altezza della mia finestra, deformando così l'ellisse (in questo caso, facendola apparire meno eccentrica).
Cosa devo fare per prevenire questa deformazione (o almeno tenerne conto), in modo che la rotazione attorno alla linea di vista preservi l'asse maggiore percepito dell'ellisse (in questo caso, facendolo andare oltre il punto di vista)?
Soluzione
Sembra che tu stia utilizzando 1.0 come aspetto quando chiami gluPerspective().Dovresti usare larghezza/altezza.Ad esempio, se il tuo viewport è 640x480, utilizzeresti 1.33333 come argomento dell'aspetto.
Altri suggerimenti
Secondo le specifiche OpenGL:
void gluPerspective( GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar )
L'aspetto dovrebbe essere una funzione della larghezza e dell'altezza della finestra.Nello specifico larghezza divisa per altezza (ma attenzione alla divisione per zero).
Forse stai usando 1 come aspetto che non è accurato a meno che la tua finestra non sia un quadrato.
Sembra che il parametro aspetto sulla tua chiamata gluPerspective debba essere modificato.Vedere La pagina man.Se la tua finestra fosse fisicamente quadrata, le proporzioni sarebbero 1 e il tuo problema scomparirebbe.Tuttavia, la finestra è rettangolare, quindi il tronco di visualizzazione deve essere non quadrato.
Imposta le proporzioni su window_width / window_height e la tua ellisse dovrebbe apparire corretta.Tieni presente che dovrai aggiornarlo ogni volta che la finestra si ridimensiona;se usi GLUT imposta a glutReshapeFunc e ricalcolare la matrice di proiezione lì dentro.