Chase camera elástica

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.

rigid
Ejemplo de una cámara rígida, esta cámara no tiene ningún script, simplemente es hija de la nave en la jerarquía de la escena.
elastic
Resultado de aplicar una cámara elástica.

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.

2017-10-30 00_27_48-Unity 2017.2.0f3 Personal (64bit) - Chasecam.unity - UnityLab - PC, Mac & Linux
Verde es el punto que simboliza el frente de la nave, rojo seria la posición de la cámara y azul la dirección hacia donde mira la cámara.

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.

2017-10-30 00_41_18-Unity 2017.2.0f3 Personal (64bit) - Chasecam.unity - UnityLab - PC, Mac & Linux
Jerarquia de referencia

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.

2017-10-30 00_40_20-UnityLab - Microsoft Visual Studio
El factor lerp en este caso va a afectar que tan rápido la cámara pueda girar hasta alinearse con la nave.

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.

2017-10-30 00_44_54-UnityLab - Microsoft Visual Studio
El script completo de la chase camera.

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.

2017-10-30 00_40_49-UnityLab - Microsoft Visual Studio
El script de chase camera integrado a la cámara.

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.

El pase de diapositivas requiere JavaScript.

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.

One thought on “Chase camera elástica

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s