Movimiento realista de cámara / pantalla de explosión

36

Me gustaría sacudir un poco la cámara durante una explosión, y he probado algunas funciones diferentes para balancearla, y nada parece realmente dar ese '¡guau, qué explosión!' tipo de sentimiento que estoy buscando. He intentado algunos patrones arbitrarios de onda sinusoidal de frecuencia relativamente alta con un poco de atenuación lineal, así como un patrón de onda cuadrada. Intenté mover solo un eje, dos y los tres (aunque el efecto dolly apenas se notó en ese caso).

¿Alguien sabe de un buen patrón de movimiento de la cámara?

falstro
fuente
2
Trate de encontrar algunas imágenes de película de sacudidas de la cámara después de las explosiones y mírelas en cámara lenta para ver cómo tiembla la cámara y basar su código en eso.
Skizz
Tengo exactamente el mismo problema: el bamboleo se ve demasiado suave
Iain
El mayor problema que enfrento al implementar un movimiento de cámara es que parece que el personaje del jugador (en el que se enfoca la cámara) se mueve en lugar de la cámara. Lo extraño es que es la cámara la que se mueve, si miras los alrededores te das cuenta, pero como estás tan concentrado en el personaje del jugador, tu percepción se arruina. Todavía estoy tratando de resolver esto, probablemente cambiando el campo de visión cuando la cámara se aleja / se acerca al jugador.
Kaj

Respuestas:

35

Tengo un movimiento de cámara decente al aplicar el ruido Perlin a la orientación de la cámara. Te da una gran sacudida decente con una sacudida de frecuencia más alta incorporada, y puede verse realmente bien.

http://mrl.nyu.edu/~perlin/doc/oscar.html tiene más detalles y código de muestra para generar ruido.

James Sutherland
fuente
3
Oh, ruido, ¿por qué no pensé en eso? Después de una explosión, hice una breve ráfaga de ruido, ¿no es así? ¡Excelente idea!
falstro
buena idea, ¿hay algo que no puedas usar para resolver el ruido perlin? : P
Cubed2D
1
El ruido es definitivamente el camino a seguir, si incluso imaginas el efecto que deseas después, son pequeños cambios de movimiento aleatorio en diferentes direcciones. Pero no puede ser un espasmo, por lo que necesita breves secciones de uniformidad. Suena como un uso perfecto para el ruido de Perlin.
deceleratedcaviar
17

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.

miklatov
fuente
44
Me gusta mucho esta implementación, funciona perfectamente para pequeños juegos 2D. Como comentario, es equivalente a hacerlo randomAngle += (150 + rand()%60)para deshacerse de cualquier problema +/-.
Krøllebølle
2
Tu video está caído.
Tara
¿Qué tipo de cálculo de "+/-"? Nunca he visto este tipo de cosas.
Yoo Matsuo
4

Hacer que una cámara se mueva "se sienta" correctamente es menos sobre la dirección del movimiento y más sobre las curvas de aceleración.

Las sacudidas de la cámara se están sumergiendo en el ámbito de la animación, por lo que se aplican todas las reglas de acción / reacción. Si se mueve de manera lineal de un punto a otro, se sentirá suave y uniforme y no como un impacto.

Si sacude la cabeza de un lado a otro, notará que se mueve más rápido en el punto medio entre el cambio de dirección y disminuye la velocidad en cada lado, ya que primero tiene que desacelerar y luego comenzar en la nueva dirección.

Aquí hay una lista de varias funciones de aceleración para aplicar a su movimiento. Es posible que solo desee EaseOut el primer movimiento para que se sienta un poco más abrupto, y luego EaseInOut el resto para simular el movimiento de la cabeza / cámara.

Wkerslake
fuente
1
Creo que la relajación aún lo haría demasiado suave. El ruido perlin parece una buena idea, o de lo contrario, un azar simple con el rango aleatorio disminuyendo a cero con el tiempo para que se desvanezca (preferiría experimentar con diferentes funciones de facilidad en el radio decreciente que en el movimiento real, facilitando el movimiento hará que la cámara se sienta como si estuviera en un resorte, no se siente bien con el movimiento de la cámara en mi experiencia).
Kaj
3

wkerslake tiene razón, las sacudidas de la cámara parecen ser más complejas de lo que piensas.

Al emular una cámara temblorosa, debe pensar qué tipo de cámara (operador) desea imitar. El peso de la cámara afecta la inercia, p. Ej. Las cámaras más pesadas suavizan los pequeños movimientos 'aleatorios'. Un operador de cámara en un riel o en un automóvil agrega ruido adicional.

Usar el ruido Perlin o Simplex es definitivamente una opción, entonces se trata de encontrar el equilibrio correcto entre diferentes relaciones de ruido. Pero descubrí que usar la interpolación entre valores es menos computacionalmente intensivo y puede ser igual de efectivo.

Hace un tiempo, encontré un script maya que parece hacer muchas cosas bien. Podrías echarle un vistazo a eso .

Además, es posible que desee echar un vistazo a Gran Turismo (5) , su equipo hizo un trabajo impresionante al hacer varios tipos de sacudidas de la cámara en tiempo real cuando ve una repetición en el juego.


fuente
2

Si tienes física de objetos dinámicos [probablemente no sea la palabra correcta, pero más o menos a lo que me refiero], donde cualquier objeto que no esté fijo sería 'volado' por la explosión, podrías hacer que la cámara se vea afectada como un objeto como ese.
La única diferencia sería simplemente cambiar la rotación / inclinación / guiñada / balanceo de la cámara, y no la posición.
Aparte de eso, ¿tal vez generar una secuencia de números aleatorios y convertirlos en rotación de alguna manera? Piense que el mapa de altura, las cosas en escala de grises pueden ser un ejemplo; No son totalmente diferentes, pero son al azar.

El pato comunista
fuente
+1 idea interesante, creo que probaré el movimiento de ruido, y cuando lo haga funcionar, intentaré agregar un efecto de carro más suave, como si la cámara estuviera unida a un resorte y presionada hacia atrás por el susto.
falstro