Come posso evitare la deformazione durante la rotazione attorno alla linea di vista in OpenGL?

StackOverflow https://stackoverflow.com/questions/79360

  •  09-06-2019
  •  | 
  •  

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 .

ellipse

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).

rotated ellipse

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)?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top