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 radius
de ~ 30px. Luego compensé la ventana gráfica centre
por esta cantidad de píxeles en una dirección aleatoria.
Para cada actualización posterior (entre los sorteos en la pantalla), reduzco radius
en un 10-20% y compenso la ventana gráfica con esta cantidad de píxeles de centre
nuevo. Sin embargo, en lugar de elegir un ángulo aleatorio para este desplazamiento, tomo el ángulo de vista anterior centre
y 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 centre
la 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
.