Fondamentalmente, voglio sapere come posso rimuovere la distorsione o lo stiramento dell'immagine renderizzata quando cambiano le dimensioni della finestra / finestra.
Le seguenti immagini esemplificano la distorsione / stiramento di cui sto parlando:
Immagine originale (finestra quadrata)
Immagine distorta / allungata (finestra rettangolare)
Idealmente, la seconda immagine dovrebbe mostrare la sfera senza lo stiramento orizzontale e esporrebbe una parte maggiore della scena all'utente per tenere conto della dimensione della finestra più grande.
Come si può fare?
Sto lavorando con OpenGL per il rendering dell'immagine e utilizzo la proiezione prospettica tramite le chiamate:
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)
Le proporzioni width/height
sono conformi a tutti i documenti / tutorial che ho incontrato, quindi non mi aspetto che sia errato. Tuttavia, il mio sospetto è che stia influenzando il problema dello stretching.
Dopo aver pensato
Onestamente, mentre penso più al problema, ho portato a credere che la soluzione implichi una relazione direttamente proporzionale tra l'angolo fovy (campo visivo nella direzione y) e le proporzioni.
Usando l'immagine sopra come riferimento, se la larghezza aumenta (causando un allungamento orizzontale), sembra molto plausibile che l'angolo fovy debba aumentare per causare un allungamento verticale che "fissa" la proporzionalità dell'immagine renderizzata.
Allo stesso modo, una riduzione della larghezza richiede una diminuzione dell'angolo fovy.
Aggiornare:
Quindi, dopo aver indagato ulteriormente, ho deciso di cambiare il modo in cui ho impostato il frustum di visualizzazione in questo modo:
gluPerspective(60 * (float)window.width/window.height, (float)window.width/window.height, 0.01f, 100.0f)
E le mie aspettative erano corrette, ciò ha risolto il problema della proporzionalità. Tuttavia, non raggiunge i risultati desiderati. Quando la larghezza della finestra aumenta, l'immagine renderizzata diventa più piccola (ma la sfera è effettivamente circolare). Invece, la sfera non dovrebbe cambiare affatto dimensione; solo la quantità di scena visualizzata dovrebbe cambiare.