Suavizado de cámara

Una de las cosas mas chocantes a la hora de jugar algo es sentir que el movimiento de la cámara es demasiado rígido. Usualmente esto ocurre cuando hacemos que la cámara mantenga su posición exacta con respecto al jugador, una de las maneras mas básicas de hacer esto es hacer que la cámara sea hija de un ancla en la jerarquía. Idealmente la cámara debería tener al ancla centrada en su campo de visión.

anchor
El ancla se usa para evitar usar desplazamientos lineales en el código de la cámara

Y usar un script que setee la posición del ancla en la posición del usuario siempre.

rigid
Con este script rígido nos aseguramos que el ancla de la cámara siempre este en la posición del objetivo.

Esto genera un efecto de seguimiento rígido cuando el personaje se mueve, en este gif podemos ver cómo funciona el seguimiento rígido en el Public Space.

rigid
Cámara con seguimiento rígido

Como dije al principio del artículo, esto es satisfactorio, pero se siente rígido a la larga. Sin mencionar que no tenemos transición suave si queremos cambiar de objetivo en tiempo real. Durante el proceso de desarrollo del Public Space nos encontramos con el problema que, si la cámara siempre seguía al jugador, el combate se iba a ver extraño ya que la cámara se centraba en el personaje y no en el centro del combate. Y si hacíamos que la cámara cambiara de objetivo al centro del combate, íbamos a tener un salto horrendo en un frame.

Por ende, decidí implementar un suavizado de cámara, lo interesante es que requiere prácticamente nada de cambio al script original y funciona para 2D y 3D. Para implementar esto necesitamos conocer la función Lerp de la struct Vector3. Lerp es una interpolación vectorial, pasándole 2 posiciones y un factor entre 0 y 1, devuelve un Vector3 que existe en el segmento entre ambas posiciones y está ubicado en la división dada por el factor entre ese segmento. Por ejemplo, si tenemos un cubo azul y un cubo verde para designar nuestras posiciones, y hacemos un Lerp desde el cubo azul al cubo verde con factor 0.5, el resultado de ese lerp va a ser exactamente el punto medio entre ambos cubos. Si el factor es 0.3, la posición devuelta va a ser aproximadamente un tercio de la distancia entre ambos cubos.

lerp
La posición de la esfera roja está calculada como Vector3.Lerp(azul.position, verde.position, 0.3f);

Con el conocimiento de la función Lerp, podemos hacer un pequeño cambio en el script del ancla de la cámara:

smoothed
Movimiento de cámara con Lerp. En este caso, la primera posición de la interpolación es la posición del ancla mismo, esto genera un efecto elástico ya que cada vez que se mueva, la distancia se reduce.

El objetivo es lograr un suavizado simple para mover la cámara, si analizamos la posición del ancla afectada por esta función tenemos el deseado efecto elástico que da el efecto de suavizado.

inaction
Aquí se puede ver como el punto de anclaje de la cámara persigue al jugador con un movimiento muy elástico.

Finalmente, en el juego tenemos el resultado querido, y al iniciar el combate el objetivo de la cámara cambia para que este centrado el combate mismo y no el jugador. Como siempre, podemos hacer que este movimiento sea parametrizado, modificando el factor de lerp desde el editor podemos lograr transiciones mas agiles o más suaves.

smooth
El resultado final del suavizado, con cambio de objetivo y su transición adecuada.

2 comentarios sobre “Suavizado de cámara

Deja un comentario