Qual è lo scopo del volume della vista canonica?


15

Attualmente sto imparando OpenGL e non sono stato in grado di trovare una risposta a questa domanda.

Dopo che la matrice di proiezione è stata applicata allo spazio della vista, lo spazio della vista è "normalizzato" in modo tale che tutti i punti rientrino nell'intervallo [-1, 1]. Questo è generalmente indicato come "volume della vista canonica" o "coordinate del dispositivo normalizzate".

Mentre ho trovato molte risorse che mi dicono come questo accade, non ho visto nulla sul perché accada.

Qual è lo scopo di questo passaggio?

Risposte:


7

Il più importante è che converte i tuoi punti (vertici) dallo spazio del mondo 3D allo spazio dello schermo 2D.

Ciò significa che dopo che il vertice si moltiplica con questa matrice, le coordinate X e Y sono posizionate sullo schermo (tra [-1, 1]) e Z è la profondità. Z viene utilizzato per il buffer di profondità e identifica quanto è distante il vertice (o il frammento) dalle telecamere vicino al piano.

Proiezione significa che i vertici che sono più vicini al piano vicino sono più lontani dal centro dello schermo -> il triangolo più vicino alla telecamera sembra essere più grande di quello lontano. E questo si basa sul tuo campo visivo: lo stai inserendo in alcune funzioni createProjectionMatrix o createFrustum. Funziona in modo da tranciare e ridimensionare il frustum della fotocamera e i vertici in esso nel cubo dell'unità. I valori maggiori di 1 e inferiori a -1 non vengono visualizzati.

Mantiene anche le proporzioni dei pixel, quindi i pixel possono essere quadrati. È semplice. Trancia solo il frustum della fotocamera in questo modo: schermo più ampio -> più taglio verticale e viceversa.

Risposta semplice:
definisce il frustum della fotocamera ed è buono per:

  • fai sembrare gli oggetti più vicini a te più grandi degli oggetti che sono lontani da te.
  • mantenere le proporzioni dei pixel: a tutti piace il pixel quadrato, giusto? :)

Non vedo nessuna parte in cui chiede cosa fa la matrice di proiezione. Sembra solo chiedersi a cosa servano le coordinate del dispositivo normalizzate.
Chris dice di reintegrare Monica il

La matrice di proiezione definisce il frustum della telecamera. Ma questo non spiega il motivo per avere [-1,1] come volume di visualizzazione canonico. Perché non avere invece [-100.100]?
bobobobo,

1
perché 1 è "numero più comune" di 100: D (0 è ancora più comune, ma il cubo 0x0x0 non è molto interessante ...)
Ivan Kuckir,

5

Questa risposta è molto lontana dal fatto, ma dal momento che l'ho trovata su Google forse questo aiuterà ancora qualcuno. Voglio solo chiarire cosa dicevano JasonD e Notabene: è molto più facile fare calcoli di ritaglio (capire cosa dovresti vedere e cosa non dovresti vedere a causa di come stai guardando, quanto è lontano, ect .). Invece di verificare se le cose si intersecano con i piani sui bordi del tuo frustum di vista, devi semplicemente confrontare x, y, z di tutto con xMax, xMin, yMax, ect. , poiché hai semplicemente un cubo. È un po 'più complicato se vuoi avere solo una parte di qualcosa che mostra, ma la matematica è ancora meglio con un cubo unità che con un frustum.

Un paio di cose che ho trovato fuorvianti in altre risposte:

-Non stai tagliando i lati fuori dal frustum della vista, lo stai deformando in un cubo usando trasformazioni di matrice omogenee.

-Non stiamo convertendo in uno schermo 2D con questo passaggio. Questo passaggio non è necessario per farlo. Teoricamente potremmo fare tutto il nostro lavoro senza convertire prima il frustum in un cubo, il che sarebbe più intuitivo ma più difficile per la matematica - ma la grafica consiste nel fare calcoli molto velocemente poiché ci sono MOLTI calcoli al secondo per il gioco medio / qualunque cosa.

Maggiori dettagli: non è necessariamente un cubo di unità in cui ci stiamo convertendo, deve solo essere una scatola rettangolare per far funzionare i nostri calcoli max-min. In effetti in classe abbiamo usato un riquadro in cui la telecamera è rivolta verso il basso sull'asse z, z va da 0 a 1, x va da -1 a 1 e y va da -1 a 1. In generale in matematica 1, 0, e -1 sono buoni numeri per facilitare i calcoli, presumo sia per questo che non passiamo da -100 a 100 o qualcosa del genere.

TLDR: semplifica il ritaglio.

Modifica: bobobobo ha l'essenza di esso. Tutto è triangoli, in generale: D.

Fonte: partecipazione a un corso di grafica universitaria


Sebbene interessanti, sembra che i tuoi punti siano parzialmente veri. Non stai usando una matrice omogenea, è solo che nello spazio della clip, i punti sono definiti in uno spazio omogeneo. 2) vero, nello spazio clip i caratteri non sono ancora proiettati sullo schermo. Succede dopo la divisione della prospettiva, sebbene si noti che ciò accade necessariamente quando si ritorna dallo spazio della clip allo spazio cartesiano. 3) sì e no. La conversione delle coordinate dei punti nello spazio NDC è ancora in qualche modo necessaria. Ciò che non è necessario è lo spazio della clip, specifico per la GPU. ...
user18490

... Non è necessario il palco dello spazio clip, non il rimappatura sul cubo unità. Anche la tua ultima ipotesi non è corretta. Rimappa da -1 a 1 perché è più semplice passare dallo spazio NDC allo spazio raster (la trasformazione della finestra). In realtà è ancora più semplice se lo spazio NDC è compreso nell'intervallo [0,1], il che è il caso di un'implementazione. Alla fine è tutto matematica, quindi è possibile utilizzare altre convenzioni. vedi il buon sito scratchapixel per maggiori dettagli.
user18490


1

Credo che ciò sia dovuto al fatto che OpenGL non può fare ipotesi su come deve essere visualizzata l'immagine (proporzioni o risoluzione, dettagli hardware, ecc.). Esegue il rendering e l'immagine in una forma intermedia che il sistema operativo o il driver o qualunque altra scala alla corretta risoluzione / dimensione.


Non hai ragione quando stai cercando i dettagli dell'hardware. Ci sono non. Anche se stai scrivendo il tuo rastarizator su cpu (perché farlo? Per sapere come funziona questa roba :)) stai usando le stesse matrici di gpu. Sei fortunato a non avere ancora i privilegi per votare verso il basso :)
Notabene,

Non è necessario conoscere le proporzioni? Da quello che ho capito, memorizza i fattori di ridimensionamento per X e Y in modo che l'immagine abbia le proporzioni corrette in seguito.
breadjesus,

3
Correggimi se sbaglio, ma sta parlando dopo che hai proiettato punti, e quindi stiamo parlando in 2D. In questo caso, OpenGL non sa dove sullo schermo stai posizionando questa immagine, né su come verrà visualizzata. Crea un'immagine che è quindi facile da ridimensionare e posizionare correttamente, ma non lo fa per te. Sono d'accordo sul fatto che i dettagli hardware fossero un brutto nome, intendevo semplicemente quanto sopra. Inoltre, è possibile specificare una matrice di proiezione con un formato, ma tale rapporto non deve essere uguale a quello del monitor.
Chewy Gumball,

3
Devo dire che mi piace molto questa conversazione. Sei vicino ad avere ragione. Andiamo più in profondità. Non ci sono immagini dopo i vertici di multiplacation di projMat. Il risultato è solo un insieme di punti 2D con profondità. Quindi inizia la rastarizzazione e crea immagini. (se su CPU disegnerebbe linee tra i verbi di triangoli e lo riempirebbe (e lo sfumerebbe, qualunque cosa) ... su GPU viene eseguito appena prima dello shader pixel / frammento). E le proporzioni mettono i punti che dovrebbero essere "ridimensionati" su valori maggiori di 1 o inferiori a -1 e non verranno visualizzati.
Notabene,

2
AHHH! Vedo il problema qui. Ha detto "Questo è generalmente indicato come" volume della vista canonica "o" coordinate del dispositivo normalizzate "." Stavo rispondendo come se stesse chiedendo delle coordinate del dispositivo normalizzate, tuttavia in realtà non le stava chiedendo affatto. Sono, in effetti, due cose completamente diverse ed è per questo che qui siamo in contrasto. Forse questo dovrebbe essere chiarito in modo che le persone non commettano lo stesso errore che ho fatto.
Chewy Gumball,

1

Prendo atto che una risposta è già stata accettata, ma è generalmente utile per il ritaglio trasformare la vista frustum in un cubo unitario.


È vero, ho modificato leggermente la mia risposta per essere più chiaro su questo.
Notabene,

A proposito, un cubo unità è un cubo del lato 1. Quindi il nome è inappropriato. Dovrebbe invece essere chiamato volume di visualizzazione canonico.
user18490

1

Mi sono anche chiesto questo. Ci sono un paio di cose da considerare.

Primo, sì, tutto nel mondo viene trasformato in quel cubo unità [-1,1] centrato attorno all'origine. Se qualcosa non è nel cubo di quell'unità, non verrà visualizzato.

La cosa bella di questo è che ora puoi tagliare i triangoli abbastanza facilmente. (Se tutti e 3 i vertici di un triangolo hanno x > 1o x < -1allora quel triangolo può essere abbattuto).


0

Consiglierei di controllare la lezione sulla matrice di proiezione prospettica su Scratchapixel

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/build-basic-perspective-projection-matrix

Spiega chiaramente che il motivo è di deformare lo spazio del frustum della vista su un cubo unitario. Perché? Essenzialmente perché il processo di proiezione di punti 3D sulla tela comporta la conversione di uno spazio NDC che è uno spazio in cui i punti sullo schermo vengono rimappati nell'intervallo [-1,1] (supponendo che lo schermo sia quadrato). Ora rimappiamo anche la coordinata Z del punto nell'intervallo [0,1] (o talvolta [-1,1]), quindi alla fine si finisce con un cubo. Il fatto è che quando i punti sono contenuti in un cubo, è più facile elaborarli rispetto a quando sono definiti nella vista frustrum (che è uno spazio strano, una piramide troncata). Un altro motivo è che porta una sorta di trasformazione proiettiva che puoi immaginare in CG nello stesso spazio (il cubo unità). Quindi, indipendentemente dal fatto che tu usi una prospettiva o una proiezione ortografica, ad esempio,

Anche se forse ti concentri troppo sul perché. Il cubo unità è in realtà solo il risultato del processo matematico coinvolto o utilizzato per proiettare i vertici su uno schermo e quindi rimappare le loro coordinate nello spazio raster.

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.