Chase camera o ChaseCam se refiere a la perspectiva de cámara que, a un objeto desde atrás, la idea es que la cámara siempre se posicione atrás del objeto y siempre mire hacia adelante del objeto. Comúnmente conocida como perspectiva de tercera persona, aunque técnicamente esa definición no siempre se refiere exclusivamente a una ChaseCam. Elástica se refiere a que la cámara no está adherida al objeto como si estuviera colocada al final de un soporte. En cambio, la cámara tiene un retardo de movimiento y giro, esto genera una percepción mas interesante del movimiento mismo del objeto en el mundo, le permite al jugador ver distintas perspectivas de su personaje y da un feedback visual al variar las velocidades.


Para lograr una cámara elástica vamos a usar cosas que se cubrieron en el post sobre Suavizado de cámara, principalmente el uso de la función lerp. El concepto principal es que nuestro objeto tenga 2 objetos hijos que marquen la posición donde la cámara debería estar ubicada, y la posición hacia donde la cámara debería ver.

También vamos a necesitar otro objeto que este siempre buscando arrimarse al frente del objeto, es decir, el diamante verde, este objeto es el diamante azul. A grandes rasgos, la cámara va a buscar siempre arrimarse al diamante rojo y siempre va a estar mirando el diamante azul. Tanto el diamante rojo como el verde son hijos de la nave, estos se van a mover rígidamente junto con la nave, la elasticidad viene de la necesidad que tienen nuestros 2 puntos elásticos de igualar su posición hacia la de su objetivo.

Objetivo de la cámara
Como menciona mas arriba, el objetivo de la cámara es el diamante azul, que busca perseguir el frente de la nave. Para este comportamiento podemos referirnos al script de SmoothMove del post Suavizado de cámara. Simplemente añadimos el script al objeto y marcamos ChaseTarget como objetivo.

Cámara
Cuando se trata de la cámara, haremos un nuevo script que se encargue de mover la cámara hacia ChasePos y mire siempre hacia CamTarget. Nuevamente, para el posicionamiento usaremos lerp y para la orientación usaremos la función LookAt.

Las últimas líneas del script es lo que se llama normalización angular. Es importante tener en cuenta cómo funciona la funcion LookAt(), utiliza la rotación Quaternian del objeto para que su vector forward este alineado con el punto objetivo. El problema con esto es cuando la rotación de este estilo genera un roll no querido, es decir una rotación en el eje frontal. Para eso hacemos la normalización, para que la perspectiva no haga roll indebido.

Movimiento de la nave
Si bien este tutorial está centralizado en el comportamiento de la cámara elástica, a modo de prueba podemos agregar el movimiento de la nave. Vale aclarar que el código no es súper limpio ni denota la forma correcta de manejar el input en Unity. Eso lo explicare en un futuro cercano.
Este código es una forma falsa de aplicar física, contiene aceleración tanto lineal como angular con máximos y perdida de momento.
Ventajas y alternativas
Como forma alternativa podríamos acudir a Posición relativa y seguimiento para hacer que la cámara gire de manera elástica, sin embargo requiere un poco mas de complejidad para manejar tridimensionalidad.
Las ventajas que esta solución brinda es que soporta tridimensionalidad nativamente, es decir no solo el movimiento de girar a la derecha e izquierda sino también arriba y abajo, e incluso si en vez de normalizar el roll con un cero absoluto usamos el euler.x de la nave, podemos soportar también roll. Otra ventaja y posiblemente una de mis favoritas es la independencia de offsets y números. La cámara se comporta universalmente con esos puntos, y esos puntos son parte del objeto controlable, quiere decir que desde el editor es sumamente fácil cambiar las perspectivas y como se siente el juego en general. No se necesita tocar código ni cambiar números para hacer que la cámara este en una posición diferente con respecto a la nave, solo mover un objeto.
Un comentario sobre "Chase camera elástica"