Câmera realista / tremor de tela de explosão

36

Eu gostaria de mexer um pouco a câmera durante uma explosão e tentei algumas funções diferentes para balançá-la, e nada parece realmente dar esse 'uau, que estrondo!' tipo de sentimento que estou procurando. Tentei alguns padrões arbitrários de ondas senoidais de frequência relativamente alta com um pouco de atenuação linear, bem como um padrão do tipo onda quadrada. Tentei mover apenas um eixo, dois e todos os três (embora o efeito dolly fosse quase imperceptível nesse caso).

Alguém sabe de um bom padrão de vibração da câmera?

falstro
fonte
2
Tente encontrar algumas filmagens de trepidações da câmera após explosões e assista em câmera lenta para ver como a câmera treme e basear seu código nisso.
Skizz 29/07
Eu tenho exatamente o mesmo problema - a oscilação parece muito suave
Iain
O maior problema que enfrento ao implementar uma trepidação da câmera é que parece que o personagem do jogador (no qual a câmera foca) se move em vez da câmera. O estranho é que é a câmera que se move, se você olhar para os arredores que você percebe, mas como você está tão focado no personagem do jogador, sua percepção fica ferida. Ainda estou tentando resolver isso - provavelmente alterando o campo de visão quando a câmera se afasta / em direção ao player.
Kaj

Respostas:

35

Eu tenho uma trepidação decente da câmera aplicando ruído Perlin na orientação da câmera. Dá-lhe uma grande sacudida decente com agitação de frequência mais alta incorporada e pode parecer realmente bom.

http://mrl.nyu.edu/~perlin/doc/oscar.html possui mais detalhes e código de amostra para gerar ruído.

James Sutherland
fonte
3
Oh, barulho, por que eu não pensei nisso ... Afinal, um estrondo, eu quase curto, não é ... Excelente ideia!
falstro 29/07/10
boa ideia, existe algo que você não possa usar o ruído perlin para resolver? : P
Cubed2D
1
O barulho é definitivamente o caminho a percorrer, se você imaginar o efeito após, suas breves mudanças de movimento aleatório em diferentes direções. Mas não pode ser um espasmo, então você precisa de breves seções de uniformidade. Soa como um uso perfeito para o ruído Perlin.
Deceleratedcaviar
17

Se você está se referindo àquele tremor de tela trêmulo causado por uma explosão, tentei implementar isso no meu jogo de protótipo (é 2D, mas deve se traduzir muito bem em 3D, espero). Dê uma olhada no vídeo do youtube e veja se é isso que você está procurando - a vibração da tela começa cerca de 1:35

De qualquer forma, a maneira como consegui isso foi criar uma janela de visualização para o cenário e armazenar o ponto central ( centre).

Quando uma explosão começa, eu crio um aleatório radiusde ~ 30px. Em seguida, desloco a janela de visualização centrepor tantos pixels em uma direção aleatória.

Para cada atualização subsequente (entre os desenhos na tela), reduzo radiusde 10 a 20% e desloco a janela de visualização por muitos pixels centrenovamente. No entanto, em vez de escolher um ângulo aleatório para esse deslocamento, retiro o ângulo da viewport anterior centree adicionei 180 +/- 60 graus a ele.

Então, basicamente, a cada atualização (ou 10-20ms ou mais), eu compenso a janela de exibição por um número decrescente de pixels da centretela.

Aqui estão alguns pseudocódigo:

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
}

Normalmente, paro a trepidação da tela quando o raio fica menor que 2,0, quando redefino a janela de exibição centre.

miklatov
fonte
4
Eu gosto muito dessa implementação, funciona perfeitamente para pequenos jogos 2D. Como comentário, é equivalente a fazer isso randomAngle += (150 + rand()%60)para se livrar de quaisquer problemas +/-.
Krøllebølle
2
Seu vídeo está inativo.
Tara
Que tipo de cálculo de "+/-"? Eu nunca vi esse tipo de coisa.
Yoo Matsuo
4

Fazer uma trepidação da câmera "parecer" correta é menos a direção do movimento e mais as curvas de aceleração.

Os tremores das câmeras estão mergulhando no reino da animação e, portanto, todas as regras de ação / reação se aplicam. Se você estiver se movendo de maneira linear de um ponto a outro, parecerá suave e uniforme e não causará impacto.

Se você balançar a cabeça para frente e para trás, notará que ela se move mais rapidamente no ponto médio entre a mudança de direção e diminui a velocidade de cada lado quando você primeiro desacelera e depois inicia na nova direção.

Aqui está uma lista de várias funções de atenuação a serem aplicadas ao seu movimento. Você pode querer apenas EaseOut o primeiro movimento para torná-lo um pouco mais abrupto e depois EaseInOut o resto para simular o movimento da cabeça / câmera.

wkerslake
fonte
1
Eu acho que facilitar ainda seria muito suave. O ruído perlin parece ser uma boa ideia, ou, de outra forma, um aleatório simples com o intervalo aleatório diminuindo para zero ao longo do tempo para fazê-lo desaparecer (prefiro experimentar diferentes funções de facilidade no raio decrescente do que no movimento real, facilitando o movimento por si só fará com que a câmera pareça estar em uma mola, não se sinta bem com a trepidação da câmera na minha experiência).
Kaj
3

wkerslake está certo, os movimentos da câmera parecem ser mais complexos do que você imagina.

Ao emular uma câmera trêmula, você deve pensar em que tipo de câmera (operador) deseja imitar. O peso da câmera afeta a inércia, por exemplo. câmeras mais pesadas suavizam pequenos movimentos 'aleatórios'. Um operador de câmera em um trilho ou em um carro acrescenta ruído adicional.

Usar o ruído Perlin ou Simplex é definitivamente uma opção, então é tudo sobre encontrar o equilíbrio certo entre diferentes proporções de ruído. Mas descobri que o uso da interpolação entre valores é menos intensivo em termos computacionais e pode ser igualmente eficaz.

Há um tempo atrás, encontrei um script maia que parece acertar muitas coisas. Você pode dar uma olhada nisso .

Além disso, você pode dar uma olhada no Gran Turismo (5) , a equipe deles fez um trabalho impressionante ao fazer vários tipos de trepidação de câmera em tempo real quando você assiste a uma repetição no jogo.


fonte
2

Se você tem uma física dinâmica de objetos [provavelmente não é a palavra certa, mas é o que eu quero dizer], onde qualquer objeto não corrigido seria "deslumbrado" pela explosão, você poderia ter a câmera afetada como um objeto como esse.
A única diferença seria apenas mudar a rotação / inclinação / guinada / rotação da câmera, e não a posição.
Fora isso, talvez gere uma sequência numérica aleatória e converta-a em rotação de alguma forma? Pense que mapas de altura e escala de cinza podem ser um exemplo; eles não são totalmente diferentes, mas são aleatórios.

O Pato Comunista
fonte
+1 de uma idéia interessante, acho que vou tentar o movimento do ruído e, quando estiver com essa execução, tentarei adicionar um efeito de boneca mais suave, como se a câmera estivesse conectada a uma mola e pressionada para trás pelo choque.
falstro 30/07/10