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 radius
de ~ 30px. Em seguida, desloco a janela de visualização centre
por tantos pixels em uma direção aleatória.
Para cada atualização subsequente (entre os desenhos na tela), reduzo radius
de 10 a 20% e desloco a janela de visualização por muitos pixels centre
novamente. No entanto, em vez de escolher um ângulo aleatório para esse deslocamento, retiro o ângulo da viewport anterior centre
e 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 centre
tela.
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
.