Perché le coordinate omogenee sono utilizzate nella computer grafica?


Risposte:


12

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.


Che tipo di esempi stai cercando? Le matrici di traduzione e tutto ciò che riguarda le proiezioni prospettiche dovrebbe essere abbastanza facile da guardare?
Bart,

@Bart, analogia necessaria.

2
Mi dispiace @anonimo, ma questo non mi dice davvero nulla. Dovrai usare più parole per spiegare esattamente cosa stai cercando.
Bart,

Penso che questa risposta non sia così votata perché è troppo tecnica per noi principianti. Forse un semplice esempio con una semplice formulazione illustrerebbe meglio i principi
Nathan il

5

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


"La PS4 di Sony è in grado di eseguire enormi moltiplicazioni di matrice." Intendi il processore Cell della PS3, giusto? La PS4 ha un processore x86 piuttosto ordinario.
Wumpf,

Anche se questa è una buona risposta, non credo che risponda alla domanda dei PO e il tipo di suggerimento suggerisce che vengano utilizzati i cordoni omogenei perché l'hardware è ottimizzato per esso, piuttosto i cordoni omogenei sono più utili e l'hardware è stato infine sviluppato attorno a quello. Un altro argomento per vec4s è che sono allineati a 128 bit, il che rende più efficiente la lettura su bus di memoria di grandi dimensioni (GPU)
PaulHK

4

complemento:

coordinate omogenee consentono anche di rappresentare l'infinito: in 3D, ovvero il punto all'infinito nella direzionex,y,z(x,y,z,0)=x,y,z0x,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).


2

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.


1
In linea di principio, possono essere implementati tipi di dati che in realtà non memorizzano tali voci anche se si comportano come fanno.

1
@Hurkyl Ovviamente. Ciò avviene raramente, in quanto sono disponibili cassette degli strumenti a matrice generica.
Yves Daoust,

@YvesDaoust Potresti fornire un esempio plain Cartesian formulationo un collegamento a una risorsa che ne descriva l'utilizzo nella grafica 3D?
Dan,

@Dan: usa y = Ax + b dove A è una matrice 3x3 e vettore ba 3x1, invece di y '= Ax' dove y ', x' sono vettori aumentati e A una matrice 4x4.
Yves Daoust,

@YvesDaoust Quindi stai passando una matrice 3x3 e un vettore 3x1 ai tuoi shader invece di una matrice 4x4? Dove calcoli e memorizzi w?
Dan,

2

[xy]
[uv]=[cos(θ)sin(θ)sin(θ)cos(θ)][xy]
and scaling as
[uv]=[k100k2][xy]
These are known as linear transformations and they allow us to do transformations as matrix multiplications. But notice that you cannot do translations as a matrix multiplication. Instead you have to do
[uv]=[xy]+[st]
This is known as an affine transformation. However this is undesirable (computationally).

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:

p=SR(Sp+T)+T
Not too bad but imagine you had do this computation on a million points. What we would like is to represent rotation, scaling, and translation all as matrix multiplications. Then those matrices can be pre multiplied together for a single transformation matrix which is easy to do computations with.

Scale, translate, then rotate and scale, then translate again:

M=TSRTS
p=Mp

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

p=[xy1]
Rotation matrix:
R=[cos(θ)sin(θ)0sin(θ)cos(θ)0001]
Scale matrix:
S=[k1000k20001]
Translation matrix:
T=[10t101t2001]
You should work out some examples to convince yourself that these do in fact give you the desired transformation and that you can compose a series of transformations by multiplying multiple matrices together.

You could go further and allow the extra coordinate to take on any value.

p=[xyw]
and say this this homogeneous (x, y, w) coordinate represents the euclidean (x, y) coordinate at (x/w, y/w). Normally you cannot do division using matrix transformations, however by allowing w to be a divisor, you can set w to some value (through a matrix multiplication) and allow it to represent division. This is useful for doing projection because (in 3D) you will need to divide the x and y coordinates by -z (in a right handed coordinate system). You can achieve this by simply setting w to -z using the following projection matrix:
Q=[1000010000100010]

1

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.


"Calculations in affine coordinates often require divisions": I don't see why. In fact you compute exactly the same expressions.
Yves Daoust

@Yves: I'm responding to the more general "use in computer graphics" topic, not the specific "computing matrix transformations" question.

@Hurkyl: so do I. When rendering a scene, you compute exactly the same expressions, with the same amount of divisions (the difference lies in dummy terms with a 0 factor).
Yves Daoust

@Yves: Hrm. I'm used to doing calculations where the conversion back to affine can be deferred to some extent; I'll cede to your expertise if you say that doesn't come up often.

-1
  • simpler formulas
  • Fewer special cases
  • Unification and
  • Duality

2
The answer is very unclear. You should elaborate on each point.
Rotem
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.