Rendering del cartellone senza distorsione?


8

Uso l'approccio standard al billboarding in Unity che è OK, ma non ideale:

transform.LookAt(camera)

Il problema è che ciò introduce una distorsione verso i bordi della finestra, specialmente quando l'angolo del campo visivo aumenta. Questo è diverso dal cartellone perfetto che vedresti ad es. Doom quando si vede un nemico da qualsiasi angolazione e indipendentemente da dove si trovano nello spazio dello schermo.

Ovviamente, ci sono modi per aggiungere un'immagine direttamente al viewport, centrata su un singolo vertice, ma non sono entusiasta degli shader.

Qualcuno ha qualche esempio di questo approccio (GLSL se possibile) o qualche suggerimento sul perché in genere non viene fatto in questo modo (rispetto al suddetto metodo di trasformazione quad)?

EDIT: ero confuso, grazie Nathan per il testa a testa. Ovviamente, indurre i quad a guardare la telecamera non li rende paralleli al piano di visualizzazione, che è ciò di cui ho bisogno.

Risposte:


4

Sono confuso dalla tua domanda perché in una proiezione prospettica standard, disegnare un cartellone parallelo al piano della vista non comporta distorsione. È equivalente a unire l'immagine al viewport con un certo ridimensionamento, in cui il ridimensionamento dipende dalla profondità (distanza perpendicolare dal piano della vista).

La "distorsione" che si sta verificando potrebbe verificarsi se il sistema sta effettivamente orientando le particelle verso la telecamera anziché sul piano di visualizzazione; ciò provoca l'inclinazione vicino ai bordi dello schermo. Oppure, potresti vedere che la scala dello sprite cambia mentre ruoti la videocamera, poiché quando la distanza viene misurata sul piano della vista anziché sulla videocamera, lo sprite si "avvicina" e quindi diventa più grande man mano che si allontana dallo schermo.


1
@NickWiggill Non ho familiarità con Unity in particolare, ma se si desidera che i quadranti siano rivolti verso il piano della vista anziché verso la telecamera, si imposta essenzialmente la matrice di rotazione del quadruplo uguale alla matrice di rotazione della videocamera. Potresti aver bisogno di una rotazione extra di 180 gradi lì dentro a seconda di come sono costruiti i quad.
Nathan Reed,

1

Credo che puoi impostare la matrice 3x3 in alto (nella colonna maggiore) sull'identità per farlo. Non vedo alcun motivo per cui non puoi farlo nello shader, ma potresti fare più lavoro in quel modo. In questo modo perdi la scala (nella tua matrice di xformazioni).

Modifica: questo articolo mi è stato utile per affissione e promozione:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Non so quanto sia convenzionale, ma lo chiamo "incoraggiante" quando viene mantenuta la prospettiva e "cartellone" quando non lo è.


Ho realizzato qualcosa. Sto utilizzando Unity iOS / Android e alcuni dei dispositivi più vecchi sono OpenGL ES 1.1, quindi pipeline fissa. Quindi farlo senza shader è la chiave qui. Come potrei fare questo senza farlo nello shader?
Ingegnere

1
Questo è probabilmente il modo più economico per farlo comunque. Nel mio codice, ho una bandiera sui miei sprite che determina se fare affissioni o impostori prima di effettuare chiamate di estrazione. In questo caso, prendo semplicemente la matrice corrente, imposto l'identità 3x3 superiore sull'identità e quindi aggiorno la matrice corrente.
notlesh,

Ah ... apprezzo i dettagli extra, ma dal momento che non ho accesso alle chiamate GL (Unity lo astrae), penso di essere piuttosto incasinato su questo approccio.
Ingegnere

Non riesci a ottenere o impostare la matrice corrente? Non ho mai usato l'unità ... Altrimenti, forse prova a cercare "cartellone unitario" o "unità impostering"
notlesh
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.