Esta tarde de vuelta a casa me he colado en medio de una conversación entre Seronius y Mortarion acerca de la posibilidad de que el WoW tenga colisiones porque, por lo que cuenta Mortarion, en una misión de los goblins hay colisiones. Sero se preguntaba porque no tienen colisiones, cuando es un campo bastante estudiado (y de hecho en Blizzard trabaja Erin Catto que ha dado varias charlas de física en la GDC). A partir de aquí viene un tocho un pelín técnico y basado a medias entre mi experiencia personal programando, lo que he leído en libros de programación de juego y un poco de deducción y suposición.
Primero de todo, tenemos que darnos cuenta que WoW es un juego basado en el modelo cliente-servidor. Las responsabilidades del juego están divididas entre dos piezas de software que se ejecutan en dos ordenadores diferentes, el nuestro y uno de los más de 13.250 servidores blade que hay distribuidos por los varios data centers alrededor del mundo. En este modelo de desarrollo, la distribución de responsabilidades no es tan sencilla como la que pudiéramos pensar a priori: el cliente renderiza el 3D y gestiona la entrada y el servidor va enviando la información de lo que van haciendo los jugadores. El resultado de usar este modelo simple es un juego como Second Life.
El problema en Second Life (uno de ellos) es que tu te mueves hacia delante y, cuando el servidor actualiza tu posición, ves a tu personaje moverse. Para conseguir el nivel de “responsividad” de WoW lo que se hace es que, localmente, tu controlas a tu muñeco “en local” y vas enviando tus acciones. La ventaja de este modelo es que el cliente local responde a tus acciones. Cuando empiezas a castear un hechizo, ves a tu personaje hacer los aspavientos inmediatamente.
Evidentemente, “el servidor manda” y, todo lo que haces pasa la supervisión del servidor y, si por algún motivo, tus acciones no fuesen posibles (p.ej el enemigo se tira una pompa justo antes de que acabe el tiempo de casteo), no moriría. Es la forma que tiene el juego de “regularse”, todo se valida en servidor, en los tiempos y orden que le llegan “las acciones”. Normalmente, no nos damos cuenta porque ya se tiene en cuenta al diseñar el juego y, los aspavientos que tienen muchos de los hechizos sirven para darle tiempo a la petición a hacer una ida y vuelta (el roundtrip).
Ya nos acercamos al problema de las colisiones, tranquilos. Lo que se suele hacer para que los otros jugadores se muevan suavemente por nuestra pantalla es interpolar. El servidor no nos envía a cada frame la posición del jugador (o de los mobs), porque sería un desperdicio de ancho de banda considerable. Lo que se suele hacer es extrapolar en local la posición de cada jugador en función de los datos que nos envía el servidor. Y, cuando la extrapolación falla, se intenta corregir o, a malas, se fuerza la posición. Si podéis ver dos pantallas de juego una frente a otra, veréis que si hay un poco de lag, el otro personaje a veces hace cosas raras (y se mueve con algo de retraso).
Así pues, el único punto donde podríamos calcular unas colisiones “fiables” sería en el servidor. Pero, ¿como se vería desde el punto de vista del jugador? Tal como funciona el juego hoy en día, podría darse el caso que colisiones con un personaje que tu no ves y te vayas por el barranquillo. No se como es la quest goblin que comentaba Mortarion, pero es posible que se puedan activar colisiones en sitios puntuales, tipo PvP o mazmorras donde los jugadores, se envíen las posiciones directamente entre ellos. Lo que no creo que se pueda hacer es “empujar” a otro jugador.
Porque esta es la segunda parte de las colisiones, ¿que ocurre cuando un objeto colisiona con otro? A día de hoy en WoW existen colisiones (entre los personajes y el escenario) y, en este caso, es fácil resolverlo ya que el escenario no se mueve, lo que ocurre es que el personaje es “repelido” por el escenario. ¿Pero que pasa cuando una entidad aplica una fuerza sobre otra? Por no hablar de lo incomodo que sería navegar por ciertos hubs o entrar en tiendas superpobladas si no pudieras atravesar a otros jugadores. El juego tal como está hoy no esta pensado para que la gente se choque entre ellos. Necesitaríamos muchos más vendors para poder atender a todo el mundo sin que se aglomeren.

#1 by Whila on julio 6, 2010 - 1:06 am
Citar
Esto me recuerda al hecho de que según dicen, Carga lleva jodida desde que la inventaron: si cargas a algún enemigo (en concreto en pvp) y tenéis lag, puede ser que uno aparezca en la espalda del otro o en la conchinchina. No sé si es lo mismo pero amos, me ha recordado a esa situación cuando lo he leído.
#2 by Banthar on julio 9, 2010 - 1:13 pm
Citar
Las colisiones (o el body block) son interesantes en algunos combates, puede ser una característica que se active sólo en determinadas circunstancias pero en la práctica tiene el problema que comentas. Puedes desactivar la colisión si no estas en combate, pero imagina un campo de batalla con decenas de jugadores colisionando entre sí. También me puedo imaginar una escena divertida, un paso estrecho cerrado por los cuerpos de sus jugadores, monturas… de aplicarse la colisión tendrían que emular el resultado de sus impactos y desplazar a otros jugadores de su posición en base al número o su velocidad, demasiado complejo, saludos.