Uso del suavizante, movimientos y cámaras
La ropa, además de limpia, debe estar suave. Para ello hay mil trucos y productos estupendos que no enumeraremos ahora precisamente. Pero lo que si haremos, amigos y amigas, es contar los secretos para que vuestros movimientos y animaciones sean tan suaves como las del propio Fregocles.
En la última entrada se dieron unas pinceladas sobre cómo encontrar el camino para llegar de un sitio a otro. Ésta se centrará por un lado en el movimiento del personaje a lo largo de ese camino y por otro en el movimiento que se produce cuando hay una transición de cámara.
El Personaje
Fregocles se mueve principalmente en dos dimensiones (X y Z o largo y ancho). Todo movimiento en su componente Y es “automático” adaptándose a la altura del terreno. De forma que inicialmente se mueve al personaje en X y Z y posteriormente se le coloca a la altura del suelo (Y). Como contrapartida con este sistema Fregocles no anda más lento o más rápido por subir o bajar cuestas, pero era el comportamiento que se buscaba.
Para ese movimiento en el plano transversal (el suelo) se diferenciaron dos cosas:
- La trayectoria entre puntos de la búsqueda de caminos, es decir, las posiciones por las que pasaría el personaje de Fregocles. Para generar la trayectoria, inicialmente se usó un algoritmo basado en curvas Bézier, pero se descartó al ver que no respondía todo lo bien que se esperaba en curvas muy cerradas. Posiblemente se podría haber ajustado para que funcionara bien… pero se optó por la premisa “vamos a no complicarnos la vida”.

Finalmente se generó de una forma mucho más sencilla. Partiendo de la posición y orientación inicial de Fregocles, se da un «paso» (se avanzan x unidades) hacia adelante. Posteriormente la trayectoria gira un poco para ir orientándose hacia su futuro destino (la siguiente casilla calculada en la búsqueda de caminos). A cada «paso» se orienta más hacia su destino, llegando un momento en el que ya va en línea recta hacia él. Esas pequeñas correcciones del ángulo van determinadas por la fórmula:angle = oldAngle + ( (newAngle - oldAngle) / speed )que da un movimiento suave y que nos permite controlar la velocidad de esa corrección. Se puede ver un ejemplo de la trayectoria en el caso 1 de la imagen. Cuando el personaje está muy cerca de la pared (caso 2 en la imagen), esa velocidad de corrección del ángulo se hace mucho mayor para que la trayectoria no penetre en el muro.
- El ángulo del personaje durante la trayectoria. Mientras Fregocles se mueve a velocidad constante por el recorrido, va modificando su ángulo. Lo normal sería que el ángulo de Fregocles fuera similar a la tangente del camino, asi miraría siempre hacia delante.
El problema es que en algunas curvas, el giro del personaje se hacia demasiado brusco. Por esto se decidió dar un cierto retardo al movimiento angular de Fregocles. El sistema es similar al anterior, el personaje va cambiando su ángulo poco a poco para ir orientándose hacia la posición final, usando la misma fórmula y una velocidad algo más lenta. En el dibujo se puede ver como el personaje tarda más en estar completamente orientado hacia el destino que la propia trayectoria.
La Cámara
Otro movimiento «suavizado» fue el de la cámara. La cámara cambia de posición según la situación de Fregocles o el contexto del juego, y muchas veces lo hace con transiciones a modo de «scroll». Estas transiciones modifican la posición y el FOV de la cámara.
Cada posición de la camara (cada «plano») tiene un FOV distinto. La transición de una camara a otra cambia el FOV siguiendo una fórmula similar a la descrita para el movimiento del personaje.
Por otro lado, el cambio de posición de la camara sigue una fórmula diferente. Si se hubiera usado la misma fórmula que en el FOV (en un principio fue así), el movimiento habría sido inicialmente muy brusco, y habría ido decelerando conforme llegaba al final.
Como la pretensión era que acelerase poco a poco y se frenara al final, se recurrió a la función coseno. Esta función devuelve, entre 0 y pi (Π) radianes, valores de 1 a -1 de forma gradual, similar a lo que se buscaba.
Para aplicarla, se partió de un movimiento de cámara uniforme, en el que cada frame el incremento en el movimiento de la camara era el mismo. Luego ese incremento se «ponderó» según la función coseno para que fuera pequeño al principio, grande a mitad de camino y de nuevo pequeño al final. Aunque finalmente se añadieron algunas constantes para que el movimiento quedara mejor, el código se simplifica en:
coeficiente = (Cos ( pi * abs( oldCoor - actualCoor / newCoor - oldCoor ) ) + 1) / 2
incremento = incremento * coeficiente
coorFinal = actualCoor + incremento
Todo podría haber estado mucho más suave, pero siempre hay que encontrar ese punto intermedio en el que la toalla está gustosa pero a la vez tiene la dureza necesaria para exfoliar la piel.
Muy interesante :)
javi
9 d+02:00 abril, 2007 a las 23:32