Cámara en tercera persona con vista libre

La cámara en tercera persona con vista libre la vi por primera vez en Mass Effect 1. Se diferencia de la tradicional, muy utilizada en MMORPGs en que la vista puede girar libremente en todas direcciones. Al desplazar el personaje, éste rota hacia la dirección en la cual la mámara mira. En cambio, la tradicional rota el personaje usando las teclas de dirección lateral A/D y la vista de la cámara es fija hacia adelante.

Desde hace tiempo que quería imlementarla en Unity3D, pero no encontraba la forma correcta de hacerlo (mayormente, falta de conocimientos de matemáticas), pero hace un par de días se me ocurrió una idea y me tomé un par de horas para implementarla.

editor

En la imagen anterior pueden ver que utilizo dos GameObjects: uno es el jugador (modelo, colliders, etc), el segundo es un punto de pivot, que a su vez es el padre de la cámara. Este objeto pivote lo mantengo sincronizado con la posición del jugador. En este caso, como fue unn prototipo muy chapucero, utilcé dos scripts. El script asociado al GameObject player se encarga de mover al personaje y “arrastrar” el pivote, además de determinar la orientación de la cámara (ojo, omití la definición de clase y faltan montones de cosas, com animación y desplazamiento lateral):

public GameObject pivot;

void Start () {
//ocultar el cursor y bloquearlo en ecentro de la pantalla
Cursor.visible = false;
Screen.lockCursor = true;
}

void Update () {
pivot.transform.position = gameObject.transform.position;
if (Input.GetKey (KeyCode.W)) {
Vector3 rot = gameObject.transform.localEulerAngles;
rot.y = pivot.transform.localEulerAngles.y;
gameObject.transform.rotation = Quaternion.Slerp (gameObject.transform.rotation, Quaternion.Euler (rot), 5f * Time.deltaTime);
gameObject.transform.Translate (0, 0, 20 * Time.deltaTime);
pivot.transform.Translate (0, 0, 20 * Time.deltaTime);
} else if (Input.GetKey (KeyCode.S)) {
//mover hacia atras, primero hay que rotar el personaje 180 grados
Vector3 rot = gameObject.transform.localEulerAngles;
rot.y = pivot.transform.localEulerAngles.y+180f;
gameObject.transform.rotation = Quaternion.Slerp (gameObject.transform.rotation, Quaternion.Euler (rot), 5f * Time.deltaTime);
gameObject.transform.Translate (0, 0, 20 * Time.deltaTime);
pivot.transform.Translate (0, 0, 20 * Time.deltaTime);
}
}

Por su parte, adjunté este script al objeto pivote:

float rotationY = 0F;
Camera cam;

void Start () {
cam = gameObject.GetComponentInChildren<Camera> ();
}

void Update () {
if (Input.GetAxis (“Mouse X”) != 0 || Input.GetAxis (“Mouse Y”) != 0) {
float rotationX = gameObject.transform.localEulerAngles.y + Input.GetAxis(“Mouse X”) * 2f;
rotationY += Input.GetAxis(“Mouse Y”) * 5f;
gameObject.transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
}

El mismo se encarga de mover la cámara siguiendo el mouse. Después de todo, no es tan complejo, aunque tal vez se pueda encontrar una solución más elegante.

One thought on “Cámara en tercera persona con vista libre

  1. Viking, puedes encerrar los fragmentos de código entre etiquetas pre o code? Es un poco difícil leerlo así sin un formato(también soy pythonero y la readability es unos de los goals :D).
    Saludos!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *