Si te refieres a ese tembloroso temblor de pantalla debido a una explosión, he intentado implementar esto en mi prototipo de juego (es 2d, pero debería traducirse a 3d bastante bien, supongo). Eche un vistazo al video de YouTube y vea si eso es lo que está buscando: el movimiento de la pantalla comienza aproximadamente a las 1:35
De todos modos, la forma en que lo logré fue crear una ventana gráfica para la pantalla y almacenar el punto central ( centre).
Cuando se inicia una explosión, creo un azar radiusde ~ 30px. Luego compensé la ventana gráfica centrepor esta cantidad de píxeles en una dirección aleatoria.
Para cada actualización posterior (entre los sorteos en la pantalla), reduzco radiusen un 10-20% y compenso la ventana gráfica con esta cantidad de píxeles de centrenuevo. Sin embargo, en lugar de elegir un ángulo aleatorio para este desplazamiento, tomo el ángulo de vista anterior centrey le agrego 180 +/- 60 grados.
Básicamente, en cada actualización (o 10-20 ms o menos), compensé la ventana gráfica con un número decreciente de píxeles desde centrela pantalla.
Aquí hay un 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
}
Por lo general, detengo el movimiento de la pantalla cuando el radio es inferior a 2.0, momento en el que restablezco la ventana gráfica nuevamente centre.