Come fondere due telecamere quando si viaggia attraverso un portale in Unity3D


18

Prima di arrivare alla mia domanda, so che la soluzione più ovvia sarebbe quella di utilizzare la vista normale port rect, tuttavia ho bisogno di forme più complesse di un rettangolo, e ho cercato di usare la vista port rect e sembra non farlo sii la mia soluzione.

EDIT: Alcune persone erano confuse dalla mia domanda, lasciami entrare un po 'più in dettaglio. inserisci qui la descrizione dell'immagine Quello che sta succedendo è quando il giocatore si sposta su un portale, creo un controller FPS clone e lo sposto dall'altro. Questo mi dà due telecamere e la vista che vedi a destra sopra. Mostra solo una videocamera e sfoglia il portale. Quello che voglio è qualcosa di simile a questodove le telecamere si fondono per creare l'illusione di una transizione graduale. Quello che voglio fare è cancellare tutto dall'immagine del quadrante verde a sinistra nell'immagine qui sotto e sostituirla con l'altra fotocamera. In questo modo si ottiene la parte della vista della telecamera A che sta raggiungendo il picco dal portale, unita alla parte della vista della telecamera B che sta raggiungendo il picco dall'altro portale, per ottenere un'immagine completa. E mentre ti muovi attraverso il portale, il taglio cambia in modo appropriato.

Ho progettato un sistema di portale, ho tutto giù, incluso far muovere il giocatore senza intoppi attraverso il portale. Il mio problema principale ora è ottenere l'effetto di fusione della fotocamera Valve. Ho bisogno di due telecamere che si fondano senza soluzione di continuità, come se stessi spingendo la testa attraverso il portale. E non può essere solo un rettangolo, deve corrispondere tuttavia il giocatore sta guardando attraverso il portale.

Il mio miglior vantaggio in questo momento è probabilmente proiettare uno shader con maschera di profondità dietro ogni portale, quindi rendere la telecamera dal portale che stai viaggiando per essere solo di profondità. Quindi in qualche modo mescola le due telecamere. Il mio problema principale è capire esattamente come farei questo, come fare in modo che la seconda videocamera renda solo ciò che è al di fuori del portale e avere il resto predefinito sulla videocamera 1 per ottenere una proiezione a schermo intero.

Se potessi darmi delle idee o spiegare come potrei farlo con lo shader con maschera di profondità, sarebbe di grande aiuto. Continuerò a lavorare su questo e aggiornerò mentre faccio delle scoperte.


5
Riesci a elaborare qual è "l'effetto valvola di fusione della fotocamera"? Ho capito che nel rendering del portale è sufficiente una singola telecamera. Nei giochi in prima persona è attaccato al giocatore e viene automaticamente trasformato nella nuova posizione quando si passa attraverso il portale insieme al giocatore. Per il rendering dell'effetto portale, viene eseguita una copia trasformata della scena. Ciò può essere ottenuto anche con una seconda fotocamera, ma non dovrebbe esserci alcuna necessità di miscelazione tra queste fotocamere.
msell,

1
Ho già perfettamente gli effetti visivi. Quello che sto cercando di fare è capire come ottenere l'effetto di camminare attraverso il portale. Ho già tutta la grafica dei personaggi e mi muovo così bene, ho solo bisogno che appaia liscio dal punto di vista in prima persona.
Timothy Williams,

1
Sono sicuro che molte persone vorrebbero aiutarti con il problema se capissero cosa fosse. Devi davvero spiegare meglio il problema, magari aggiungere foto o persino un video per visualizzare ciò che è sbagliato.
msell,

2
Potresti aggiungere un link a un video di esempio dell'effetto?
Mike Baxter,

2
Cosa succede se si utilizza solo una videocamera / controller FPS? Quando la telecamera si sposta attraverso il portale, è possibile trasformarla nella nuova posizione e orientamento. Se il rendering del portale è corretto, la transizione dovrebbe essere perfetta e non è necessaria alcuna fusione.
msell

Risposte:


6

Comprensione del problema

Da quello che vedo il problema che stai descrivendo è il risultato del piano vicino della telecamera che interseca il piano definito dal portale. Mentre si verifica questo incrocio, è possibile vedere dietro il muro su cui si trova il portale.

Questo è simile a un problema riscontrato in altri giochi quando il giocatore sta solo passando dall'acqua all'acqua. Se la videocamera è appena sopra l'acqua, non viene applicato alcun effetto di post elaborazione per offuscare la vista dei giocatori (renderla scura, sfocata e blu). Quindi se la parte inferiore dell'aereo vicino è appena sotto l'acqua, il giocatore può vedere chiaramente sott'acqua.

Se ho ragione, puoi confermarlo cambiando la posizione di questo piano quando definisci la matrice di proiezione. All'aumentare della distanza tra l'origine della telecamera e il piano vicino, dovrebbe aumentare anche il problema.

La soluzione facile

Rendere il piano vicino molto vicino alla telecamera dovrebbe quasi sradicare questo problema. Questa soluzione non è completa, ma produrrà un risultato abbastanza buono nella stragrande maggioranza dei casi ed è efficiente.

La soluzione completa

Se il solo avvicinamento del piano vicino alla telecamera non è soddisfacente, è possibile creare una "maschera" per fondere le immagini generate dal rendering della scena dal punto di vista del giocatore e del portale.

Supponendo che si consenta di applicare solo i portali su superfici piane, è possibile calcolare la linea di intersezione tra il piano vicino della telecamera e il piano definito dal portale (o il muro su cui giace). Questa linea dividerà lo schermo in due parti. Determinare da quale parte della linea si trova un pixel dello schermo ti farà sapere quale immagine di rendering usare, l'immagine del portale o l'immagine della telecamera del lettore.

Tieni presente che se si verifica questo problema, il frustum della telecamera deve trovarsi completamente all'interno del portale in modo che la linea di intersezione taglierà sempre completamente da un bordo dello schermo all'altro.

Questo link dovrebbe aiutare con la matematica a trovare la linea. Il codice seguente dovrebbe essere approssimativamente corretto.

La linea di intersezione viene definita utilizzando un punto sulla linea e la direzione della linea. Sotto la direzione dell'intersezione viene calcolata utilizzando il prodotto trasversale della normale portale e la direzione di visualizzazione della telecamera (vicino al piano normale). Un punto sulla linea viene dato lanciando un raggio da un punto sul piano vicino direttamente verso il piano del portale (lungo il portale normale) e trovando il punto di intersezione.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

Assicurarsi che viewDir sia un vettore unitario. portalVert1, 2 e 3 sono solo 3 dei 4 vertici utilizzati per l'etichetta del portale o la superficie su cui si trova. Esistono altri modi per definire il piano su cui si trova il portale, ma suppongo che questa sia l'informazione più facilmente disponibile.

Una volta che hai questi due vettori per definire la linea di intersezione, moltiplica ciascuno per la vista e quindi le matrici di proiezione per farle nello spazio dello schermo.

È quindi possibile utilizzare uno shader post process per fondere queste immagini. È possibile selezionare l'immagine da utilizzare per ciascun pixel determinando da quale lato della linea di divisione si trova il pixel corrente. Questo viene fatto prendendo la posizione del pixel (che è anche la posizione che usi per cercare il texel di destinazione del rendering) e facendo;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

Il lato è dato dal fatto che d sia maggiore o minore di 0. Se è esattamente 0, allora sei sulla linea.

Per riferimento sulla matematica sopra vedi questo .

Questo metodo può essere utilizzato anche durante la creazione di una maschera di profondità / buffer stencil da utilizzare prima del rendering dalla prospettiva del portale. Puoi creare un quad a schermo intero e utilizzare la linea per tagliarlo.


L'aereo clip vicino era una buona idea, ma non è esattamente quello che sto cercando. Quella seconda parte è comunque un approccio interessante. Attualmente sto usando uno shader con maschera di profondità su tutto ciò che si trova dietro il piano del portale in uscita, quindi impostando le bandiere chiare della videocamera in uscita solo sulla profondità. Questo lo rende così qualsiasi parte della videocamera in uscita che sta sporgendo dal portale disegna sullo schermo e la videocamera in entrata attinge alla maschera di profondità, quindi crea un'immagine mescolando le parti di ogni videocamera che sta raggiungendo il picco rispettivo portale. L'unico problema è che sto riscontrando alcuni piccoli problemi di ritaglio e come
Timothy Williams,

leggero sussulto mentre il giocatore attraversa. Questa idea che hai sollevato sembra abbastanza promettente. Quindi essenzialmente quello che devo fare è calcolare la linea lungo lo schermo su cui la telecamera vicino al piano e il piano portale si intersecano, la direzione mi dà in quale direzione sta andando la linea e il punto sono i vari punti della linea. Come definirei quindi in uno shader / script quale lato della linea di demarcazione su cui poggia un pixel?
Timothy Williams,

Ho aggiornato un po 'la risposta per dare un po' di codice di base. Assicurati di provare a cambiare la vista vicino alla distanza del piano di ritaglio per confermare il problema. Renderlo il più piccolo possibile può anche essere sufficiente. Ricorda, fallo funzionare, fallo funzionare bene, quindi fallo funzionare velocemente.
OriginalDaemon


Ho fatto il test cambiando la distanza del piano di ritaglio vicino, ha reso il problema leggermente migliore, ma come l'articolo pubblicato da Mell afferma che non risolve il problema quando si passa attraverso. Sento comunque che la linea di intersezione potrebbe funzionare, quindi lo proverò. Guarderò anche un po 'di più in quell'articolo pubblicato da Mell. Alla fine dipenderà se una maschera di profondità è più veloce o questa linea di intersezione è più veloce
Timothy Williams

3

Le risposte suggerite erano molto buone, ma alla fine ho optato per una tecnica diversa usando una maschera di profondità.

Quello che fai è prendere QUESTO script e shader, metti lo script su ogni oggetto con un renderer nella tua scena e imposti la coda di rendering su 3020 (posterò uno script per renderlo più facile in seguito).

Quindi, crei una scatola di piani (tutti rivolti verso l'interno, nella foto non puoi vedere il lato della scatola più vicino a te, ma quando sei dentro la scatola tutto ciò che dovresti vedere è grigio) dietro ENTRAMBI i tuoi portali in questo modo: inserisci qui la descrizione dell'immagine e posizionali su un livello speciale (ho scelto "DepthMask" per il mio), quindi aggiungi un materiale con lo shader sopra a loro. inserisci qui la descrizione dell'immagine

Quindi prendi la fotocamera principale e deselezioni il tuo livello speciale dalla sua maschera di abbattimento (ho deselezionato il livello DepthMask) e hai impostato la profondità su 0. inserisci qui la descrizione dell'immagine

Quindi, quando stai teletrasportando e clonando la videocamera, imposta le bandiere chiare dell'altra videocamera su "Solo profondità" e la profondità è 1. inserisci qui la descrizione dell'immagine

Quindi si ottiene uno schermo uniforme miscelato tra le due viste della telecamera.

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.