Come posso evitare che il viewport si allunghi / distorca?


13

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)

Nessuna distorsione

Immagine distorta / allungata (finestra rettangolare)

Con Distorsione

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/heightsono 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.

Proiezione prospettica

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.

Risposte:


14

In effetti, la domanda originale è 1 cast di distanza dalla soluzione.

Codice originale

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, window.width/window.height, 0.01f, 100.0f)

Codice fisso

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60, (float)window.width/window.height, 0.01f, 100.0f)

Il problema era quello window.widthe window.heightsono numeri interi, che hanno causato le proporzioni come il risultato di una divisione di numeri interi.

Se si esegue il cast di una delle dimensioni su un float, il risultato utilizza invece la divisione in virgola mobile.

Poiché le proporzioni sono ora corrette, non vi è più allungamento come visto nel post originale.

EDIT: il codice nel post originale (e la risposta) è semplicemente pseudo-codice per le chiamate alla GPU; il programma effettivo utilizzato per generare le immagini sopra è scritto in Java. Per coloro che non lavorano con Java, non ho fatto ricerche per vedere se la divisione intero / in virgola mobile è implementata allo stesso modo. Indipendentemente da ciò, la soluzione consiste nell'assicurarsi che le proporzioni siano effettivamente calcolate correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.