Perché le coordinate omogenee sono utilizzate nella computer grafica?
Quale sarebbe il problema se non si utilizzassero coordinate omogenee nelle trasformazioni di matrici?
Perché le coordinate omogenee sono utilizzate nella computer grafica?
Quale sarebbe il problema se non si utilizzassero coordinate omogenee nelle trasformazioni di matrici?
Risposte:
Semplificano e unificano la matematica utilizzata nella grafica:
Ti consentono di rappresentare traduzioni con matrici.
Ti consentono di rappresentare la divisione in profondità nelle proiezioni prospettiche.
Il primo è legato alla geometria affine. Il secondo è legato alla geometria proiettiva.
È nel nome: le coordinate omogenee sono ben ... omogenee. Essere omogenei significa una rappresentazione uniforme di rotazione, traduzione, ridimensionamento e altre trasformazioni.
Una rappresentazione uniforme consente ottimizzazioni. L'hardware grafico 3D può essere specializzato per eseguire moltiplicazioni di matrici su matrici 4x4. Può anche essere specializzato nel riconoscere e risparmiare sulle moltiplicazioni per 0 o 1, perché sono spesso utilizzate.
Non utilizzare coordinate omogenee può rendere difficile utilizzare l'hardware fortemente ottimizzato al massimo. Qualunque programma riconosca che è possibile utilizzare istruzioni ottimizzate dell'hardware (in genere un compilatore ma a volte le cose sono più complicate) per coordinate omogenee sarà difficile con l'ottimizzazione per altre rappresentazioni. Sceglierà istruzioni meno ottimizzate e quindi non utilizzerà il potenziale dell'hardware.
Come ci sono state richieste di esempi: la PS4 di Sony è in grado di eseguire enormi moltiplicazioni di matrice. È così bravo che è stato esaurito per un po 'di tempo, perché i cluster sono stati utilizzati al posto di supercomputer più costosi. La Sony ha successivamente richiesto che il loro hardware non potesse essere utilizzato a scopi militari. Sì, i supercomputer sono equipaggiamento militare.
È diventato abbastanza normale per i ricercatori utilizzare le schede grafiche per calcolare le loro moltiplicazioni di matrice anche se non è coinvolta alcuna grafica. Semplicemente perché sono di magnitudo migliore rispetto alle CPU per uso generico. Per fare un confronto, le moderne CPU multi-core hanno un ordine di 16 pipeline (x0.5 o x2 non contano molto) mentre le GPU hanno un ordine di 1024 pipeline.
Non sono tanto i core che le pipeline a consentire un'effettiva elaborazione parallela. I core funzionano sui thread. Le discussioni devono essere programmate esplicitamente. Le condutture funzionano a livello di istruzione. Il chip può parallelizzare le istruzioni più o meno da solo.
complemento:
coordinate omogenee consentono anche di rappresentare l'infinito: in 3D, ovvero il punto all'infinito nella direzionex,y,z . In genere, le sorgenti luminose in posizione finita o infinita possono essere rappresentate allo stesso modo.
Riguardo alla trasformazione prospettica, consente persino di interpolare correttamente senza distorsioni prospettiche (contrariamente ai primi hardware grafici su PC).
Come gusto personale mi sono sempre astenuto (quando possibile) dall'usare coordinate omogenee e ho preferito la semplice formulazione cartesiana.
Il motivo principale è il fatto che coordinate omogenee utilizzano 4 voci banali nelle matrici di trasformazione (0, 0, 0, 1), che coinvolgono l'archiviazione e il calcolo inutili (anche l'overhead delle routine di calcolo della matrice per scopi generici che sono "di default" utilizzate in questo caso).
Il rovescio della medaglia è che hai bisogno di più attenzione quando scrivi le equazioni e perdi il supporto della teoria delle matrici, ma finora sono sopravvissuto.
plain Cartesian formulation
o un collegamento a una risorsa che ne descriva l'utilizzo nella grafica 3D?
w
?
Let R and S be rotation and scaling matrices and T be a translation vector. In computer graphics, you may need to do a series of translations to a point. You could imagine how tricky this could get.
Scale, translate, then rotate and scale, then translate again:
Scale, translate, then rotate and scale, then translate again:
We can achieve this by adding another coordinate to our points. I'm going to show all this for 2D graphics (3D points) but you could extend all this to 3D graphics (4D points).
You could go further and allow the extra coordinate to take on any value.
Calculations in affine coordinates often require divisions, which are expensive as compared to additions or multiplications. One usually does not need to divide when using projective coordinates.
Using projective coordinates (and more generally, projective geometry) tends to eliminate special cases too, making everything simpler and more uniform.