Scuotimento realistico della fotocamera / dello schermo dall'esplosione


36

Mi piacerebbe scuotere un po 'la fotocamera durante un'esplosione, e ho provato alcune funzioni diverse per dondolarla, e nulla sembra davvero dare quel "wow, che botto!" tipo di sensazione che sto cercando. Ho provato alcuni schemi di onde sinusoidali con frequenza relativamente alta arbitraria con un po 'di attenuazione lineare, nonché un modello di tipo onda quadra. Ho provato a spostare solo un asse, due e tutti e tre (anche se l'effetto dolly era appena percettibile in quel caso).

Qualcuno sa di un buon modello di vibrazione della fotocamera?


2
Prova a trovare un filmato di vibrazioni della videocamera dopo le esplosioni e guardalo al rallentatore per vedere come la videocamera trema e basare il tuo codice su quello.
Skizz,

Ho lo stesso identico problema - l'oscillazione sembra troppo liscia
Iain,

Il problema più grande che devo affrontare durante l'implementazione di un tremolio della videocamera è che sembra che il personaggio del giocatore (su cui si concentra la videocamera) si muova invece della videocamera. La cosa strana è che è la telecamera che si muove, se guardi l'ambiente che noti, ma poiché sei così concentrato sul personaggio del giocatore, la tua percezione viene rovinata. Sto ancora cercando di risolverlo, probabilmente cambiando il campo visivo quando la telecamera si allontana / verso il giocatore.
Kaj,

Risposte:


35

Ho un discreto movimento della fotocamera applicando il rumore Perlin all'orientamento della fotocamera. Ti dà una grande scossa decente con scuotimento di frequenza superiore incorporato e può sembrare davvero buono.

http://mrl.nyu.edu/~perlin/doc/oscar.html ha più dettagli e un codice di esempio per generare rumore.


3
Oh, rumore, perché non ci ho pensato ... Dopotutto un botto ho praticamente un breve scoppio di rumore, non è vero ... Ottima idea!
falstro,

buona idea, c'è qualcosa che non puoi usare perlin noise per risolvere? : P
Cubed2D

1
Il rumore è sicuramente la strada da percorrere, se immagini anche l'effetto del tuo dopo, i suoi brevi cambiamenti di movimento casuale in diverse direzioni. Ma non può essere uno spasmo, quindi hai bisogno di brevi sezioni di uniformità. Sembra un uso perfetto per il rumore di Perlin.
deceleratedcaviar

17

Se ti riferisci a quel tremolio dello schermo da un'esplosione, ho cercato di implementarlo nel mio prototipo di gioco (è 2d ma dovrei tradurre abbastanza bene in 3d, mi aspetto). Dai un'occhiata al video di YouTube e vedi se è quello che stai cercando: lo scuotimento dello schermo inizia all'incirca all'1: 35

Ad ogni modo, il modo in cui l'ho raggiunto è stato quello di creare un viewport per lo schermo e memorizzare il punto centrale ( centre).

Quando inizia un'esplosione, creo un casuale radiusdi ~ 30px. Ho quindi spostato il viewport centreda questi pixel in una direzione casuale.

Per ogni aggiornamento successivo (tra i disegni sullo schermo), riduco radiusdel 10-20% e compenso di nuovo il viewport di questi pixel centre. Tuttavia, invece di scegliere un angolo casuale per questo offset, prendo invece l'angolo della vista precedente centree vi ho aggiunto 180 +/- 60 gradi.

Quindi, sostanzialmente, ogni aggiornamento (o circa 10-20ms) compenso il viewport di un numero decrescente di pixel rispetto centreallo schermo.

Ecco alcuni pseudocodici:

viewportCentre = (400,300) //Lets say screen size is 800 x 600
radius = 30.0
randomAngle = rand()%360
offset = ( sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
viewport.setCentre(viewportCentre + offset) // set centre of viewport
draw()  

while(true)  //update about every 10-20ms
{ 
    radius *=0.9 //diminish radius each frame
    randomAngle +=(180 +\- rand()%60) //pick new angle 
    offset = (sin(randomAngle) * radius , cos(randomAngle) * radius) //create offset 2d vector
    viewport.setCentre(viewportCentre + offset) //set centre of viewport
    draw() //redraw
}

Di solito interrompo il tremolio dello schermo quando il raggio scende al di sotto di 2.0, a quel punto ripristino il viewport centre.


4
Mi piace molto questa implementazione, funziona perfettamente per i piccoli giochi 2D. Come commento è equivalente a fare randomAngle += (150 + rand()%60)per sbarazzarsi di eventuali problemi +/-.
Krøllebølle

2
Il tuo video è inattivo.
Tara,

Che tipo di calcolo di "+/-"? Non ho mai visto questo genere di cose.
Yoo Matsuo,

4

Far vibrare la fotocamera "sentirsi" corretto è meno sulla direzione del movimento e più sulle curve di accelerazione.

Le vibrazioni della videocamera si stanno tuffando nel regno dell'animazione e quindi si applicano tutte le regole di azione / reazione. Se ti muovi in ​​modo lineare da un punto all'altro, sembrerà liscio e uniforme e non come un impatto.

Se scuoti la testa avanti e indietro, noterai che si muove più velocemente nel punto medio tra il cambio di direzione e rallenta su ciascun lato mentre devi prima rallentare e poi iniziare nella nuova direzione.

Ecco un elenco di varie funzioni di andamento da applicare al tuo movimento. Potresti voler solo EaseOut al primo movimento per renderlo un po 'più brusco, quindi EaseInOut il resto per simulare il movimento della testa / della fotocamera.


1
Penso che l'allentamento lo renderebbe ancora troppo fluido. Il rumore del perlin sembra una buona idea, o altrimenti un semplice casuale con la gamma casuale che si riduce a zero nel tempo per farlo svanire (preferirei sperimentare diverse funzioni di facilità sul raggio decrescente rispetto al movimento effettivo, facilitando il movimento stesso farà sentire la fotocamera come se fosse su una molla, non si sente bene con il tremolio della fotocamera nella mia esperienza).
Kaj,

3

wkerslake ha ragione, le vibrazioni della fotocamera sembrano essere più complesse di quanto si possa pensare.

Quando si emula una videocamera tremante, è necessario pensare al tipo di videocamera (operatore) che si desidera imitare. Il peso della telecamera influisce sull'inerzia, ad es. telecamere più pesanti appianano piccoli movimenti "casuali". L'operatore di una telecamera su un binario o in un'auto aggiunge ulteriore rumore.

L'uso del rumore Perlin o Simplex è sicuramente un'opzione, quindi si tratta di trovare il giusto equilibrio tra i diversi rapporti di rumore. Ma ho scoperto che l'uso dell'interpolazione tra valori è meno intensivo dal punto di vista computazionale e può essere altrettanto efficace.

Qualche tempo fa, ho trovato una sceneggiatura Maya che sembra avere molte cose a posto. Potresti dare un'occhiata a quello .

Inoltre, potresti dare un'occhiata a Gran Turismo (5) , il loro team ha fatto un lavoro impressionante nel fare vari tipi di scuotimento della videocamera in tempo reale quando guardi un replay nel gioco.


2

Se hai una fisica dinamica degli oggetti [probabilmente non la parola giusta, ma una specie di cosa intendo], in cui qualsiasi oggetto non riparato verrebbe "spazzato via" dall'esplosione, potresti avere la telecamera interessata come un oggetto del genere.
L'unica differenza sarebbe solo cambiare la rotazione / inclinazione / imbardata / rollio della telecamera e non la posizione.
A parte questo, forse generare una sequenza numerica casuale e convertirli in rotazione in qualche modo? Pensa che heightmap, elementi in scala di grigi possano essere un esempio; non sono totalmente diversi, ma sono casuali.


+1 idea interessante, penso che proverò il movimento del rumore e quando avrò funzionato, proverò ad aggiungere un effetto dolly più smoth, un po 'come se la fotocamera fosse attaccata a una molla e premuta all'indietro dallo shock.
falstro,
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.