miércoles, 8 de octubre de 2014

Ragdolls en Unity3D

La entrada de hoy es una introducción y un pequeño tutorial al uso de un elemento muy habitual en juegos, el ragdoll. ¿Y eso qué es? Físicamente lo más parecido que podemos pensar son los dummys para las pruebas de choque en vehículos. 


En un juego, si tiramos a un personaje desde 1000 metros y hay gravedad caerá, pero depende como esté hecho, caerá de pie, o rebotará y caerá de lado, pero como un todo, como si fuera una estatua. Es muy poco realista. Imaginemos que un personaje recibe un tiro, y cae como un pisapapeles al suelo, la risión. Y ahí es donde entran los ragdoll, son sistemas que se encargan de hacer que las caídas de un cuerpo no animado sean naturales, que un brazo vaya por un lado y el otro por el otro, que se le doblen las rodillas al caer...




Aunque hay métodos más sofisticados que mezclan animación y el movimiento físico del ragdoll, con blending de posturas y otras cosas que todavía no domino, por ahora voy a explicar lo básico. Tener un personaje que se mueve, y que llegue un momento en que pierde su autonomía de movimiento y cae como un saco de patatas. Esto puede ser porque muera, como cuando se acaba la vida en Temet Nosce, porque se va a dar un leñazo, como cuando se tropieza en Las Zamburguesas, o por exigencias del guión como en la intro de Temet Nosce, donde el protagonista cae por efecto del veneno.



Menú ragdoll Unity

En Unity, un ragdoll es un elemento más que se crea con el menú de gameobject. Aparece un menú donde tenemos que rellenar una serie de elementos. Básicamente decirle al ragdoll cuales son las partes del cuerpo para que las mueva. Los esqueletos que llevan los personajes son jerárquicos. Por ejemplo el fémur cuelga de la cadera, y la pantorilla del fémur. Así pues lo que se nos pide es el nodo padre de todos (habitualmente la cintura), y aunque va pidiendo articulaciones, si lo tenemos hecho con huesos, también se puede usar, los equivalentes son: hips= fémur, knee=pantorrilla, foot=pie, arm= húmero, elbow= antebrazo, middle spine= caja torácica, head=cabeza.



Después hay 3 opciones, una es la masa del cuerpo, te suelen decir que lo pongas a unos 80 kilos, pero depende de como tengas configurado todo y el efecto que busques. No he encontrado por ningún lado explicación bien dada de qué son las otras 2 opciones, la fuerza y eso de Flip Forward. Sospecho que es para que se caiga hacia atrás como si hubiera recibido un tiro por delante, pero no puedo confirmarlo.



Y una de las razones por las que no puedo confirmarlo es que una vez que creas el ragdoll, no he visto ninguna forma de volver a esa ventana y editarlo, si algo va mal, tiras el modelo y creas un ragdoll nuevo. Espero que si haya forma de editar y el inútil sea yo.



Colliders Ragdoll

Para controlar el personaje físicamente le añade automáticamente unos colliders, en la imagen las líneas verdes, que aquí ya tengo bien ajustados, pero es probable que sean muy amplios por defecto. Esto hace que haya un espacio vacío entre la parte del cuerpo y el objeto con el que colisiona. Incluso si jugamos con cadáveres que han caído como ragdoll, podemos ponernos encima y ver como nuestro personaje vuela unos centímetros por encima del cadáver. Los colliders se ajustan igual que cualquier objeto, escalando y moviendo, con buena mano y tiento.



Esto hace que nuestro personaje sea un muñeco de trapo, pero seguramente no querramos que sea así todo el rato, sino que funcione normal, saltando, corriendo y esas cosas y ante cierto evento sea cuando se desplome. En los primeros tutoriales que usé te recomendaban duplicar el modelo. Es decir tener un personaje en movimiento, y cuando lo maten cambiarlo por el ragdoll. Me pareció siempre un poco burrada de base, ya que de repente tienes que mandar a la gráfica un modelo diferente completo, aunque sea el mismo para nosotros, para el ordenador no lo es. Además tienes que colocar todas las partes del cuerpo en la posición que tuviera, imaginemos que a un personaje le han pegado un tiro mientras saltaba, pues hay que colocar el ragdoll en el momento del salto exacto que estuviera el personaje.



Encontré otra forma de hacerlo, tomando las partes del cuerpo afectadas (el ragdoll normalmente tiene menos partes del cuerpo que el modelo completo), decimos que no son Kinematic, ni que salte eventos (isTrigger), y desactivo las animaciones. Pego aquí el pequeño método que transforma un personaje animado en un pelele, para que se entienda, partesCuerpo es un array de gameobjects, y en el editor lo he rellenado con las partes del personaje que están afectadas por el ragdoll:



void ponerRagdoll(){

for (int i=0;i<partesCuerpo.Length;i++){

partesCuerpo[i].collider.isTrigger=false;

partesCuerpo[i].rigidbody.isKinematic=false;

}

_animation.enabled=false;

ragdollPuesta=true;

}




Dejo un vídeo de la escena de la intro de Temet Nosce, donde paso de personaje corriendo a Ragdoll y se pueden ver los distintos resultados.

No hay comentarios :

Publicar un comentario