Patas que se quedan en el suelo: IK de dos huesos en Molang para el Doggoyle

Cómo el Doggoyle del LLS Magic Pack mantiene las patas en el suelo al paso, al trote y al galope: un reloj de zancada a partir de la velocidad en el suelo, pisadas planeadas sobre el piso, y cinemática inversa resuelta en cada cuadro en el Molang de Bedrock.

· 8 min de lectura

El Doggoyle del LLS Magic Pack acurrucado y dormido

Casi todas las criaturas de Minecraft caminan balanceando las patas hacia adelante y hacia atrás con una onda senoidal. Es barato y en una vaca se ve bien, pero los pies se deslizan: una pata se balancea a una velocidad, el cuerpo se mueve a otra, y las patas patinan sobre el suelo. En un sabueso de piedra grande y pesado, con patas largas y con garras, ese patinaje es lo primero que se nota.

El Doggoyle, el perro guardián de los hoggoyles en el Magic Pack, lo hace al revés. Primero se planea en el suelo dónde va cada pata, y la pierna se dobla para ponerla ahí. Eso es cinemática inversa, y en Bedrock tiene que correr en Molang, el lenguaje de expresiones del pack de recursos, en cada cuadro, en el dispositivo del jugador.

Por qué hay que resolver la pierna

Animar una pierna normalmente significa poner ángulos en las articulaciones: tanto en el hombro, tanto en el codo. La pata termina donde la pongan esos ángulos. La cinemática inversa lo voltea: dices a dónde va la pata, y resuelves los ángulos.

La pata delantera y la trasera de un perro son, cada una, dos huesos largos con una articulación en medio, que es el caso clásico de dos huesos:

  • Pata delantera: el hombro arriba, el codo detrás de él, y el antebrazo inclinado hacia adelante hasta la muñeca.
  • Pata trasera: la cadera, la babilla hacia adelante, la tibia hacia atrás hasta el corvejón, y luego un metatarso casi vertical hasta la pata.

Con la raíz (hombro o cadera), el objetivo (muñeca o corvejón) y el largo de los dos huesos, el doblez tiene exactamente una respuesta de cada lado. Hacia qué lado se dobla es lo que la hace de perro y no de pájaro: los codos se doblan hacia atrás, las babillas hacia adelante.

La resolución en sí son dos funciones de Molang: math.atan2 para la dirección de la raíz al objetivo, y math.acos con la ley de los cosenos para cuánto se dobla cada articulación para cubrir la distancia. El Molang de Bedrock trabaja en grados, lo que ayuda; la rotación del hueso es entonces el ángulo de reposo, menos la inclinación del padre, menos el ángulo resuelto. Cuatro patas, cuatro resoluciones, en cada cuadro.

Paso 1: un reloj de zancada que sabe qué tan rápido va

Antes de planear pisadas necesitas saber en qué parte de la zancada está el perro. La entrada obvia es q.modified_distance_moved, el contador de balanceo de extremidades que usan las criaturas normales. No está en bloques: corre a más o menos cuatro veces la distancia y tiene tope. Una zancada medida con él sale mal a cualquier velocidad. (Ese está en un artículo anterior sobre errores silenciosos de Bedrock.)

Así que el reloj del Doggoyle corre con q.ground_speed, la velocidad real sobre el suelo, integrada en una fase de zancada. El contador es solo un respaldo. El andar también sale de la velocidad:

AndarPatrón de pisadas
PasoCuatro tiempos: trasera izquierda, delantera izquierda, trasera derecha, delantera derecha, a un cuarto de zancada entre sí
TrotePares en diagonal: trasera izquierda con delantera derecha, y luego el otro par media zancada después
GalopeEl galope rotatorio de un perro: trasera izquierda, trasera derecha, delantera derecha, delantera izquierda, alrededor del cuerpo

Cambiar de andar mueve cada pata hacia adelante en su ciclo hasta el nuevo tiempo, nunca hacia atrás, así que no hay una pata que tiemble hacia atrás al cambiar de andar.

Paso 2: planear la pata en el suelo

Cada pata tiene una fase en la zancada. Parte de la zancada está abajo (el apoyo), el resto está arriba (el vuelo).

  • Abajo: la pata barre hacia atrás en línea recta, exactamente a la velocidad a la que el suelo se mueve bajo el perro. El barrido es el largo de la zancada por la fracción de la zancada que la pata está abajo. Si coinciden, una pata apoyada no se mueve respecto al suelo. De eso se trata todo.
  • Arriba: la pata viaja hacia adelante en una curva de Hermite cuyas velocidades en cada extremo coinciden con el apoyo, así que no hay sacudida al despegar ni al tocar el suelo.

La pata también se inclina: el talón se levanta al final del apoyo mientras los dedos se quedan abajo, y regresa en el vuelo. Estas patas son largas (las garras llegan siete unidades por delante de la muñeca), así que una pata doblada necesita levantar la muñeca para librar el piso. Lo que se levanta se calcula a partir del doblez, no se adivina, más un poco de margen.

Luego la IK toma los objetivos de la muñeca y el corvejón y dobla las patas para alcanzarlos.

Lo revisé fuera del juego con las mismas matemáticas que corre el Molang, en cada andar: una pata apoyada se mueve menos de 0.4 unidades durante un apoyo.

Qué salió mal, y cómo se atrapó cada cosa

Cada una de estas se encontró con una revisión numérica (un quiebre en la curva de una articulación, una pata debajo del piso) y no a ojo. Ver una animación a toda velocidad esconde mucho.

Un límite duro de alcance quiebra el codo

A galope completo, el objetivo de una pata puede estar más lejos de lo que la pierna alcanza. El arreglo obvio, math.clamp sobre la distancia, traba el codo totalmente recto y luego lo suelta: un tirón visible al final de cada alcance.

El arreglo es un límite suave. A menos de una unidad del alcance completo, la distancia se va frenando de forma exponencial en vez de detenerse en seco:

reach = d < dmax - 1 ? d : dmax - math.exp(dmax - 1 - d)

La pierna se estira suave y nunca llega a trabarse.

Una pata que se dobla de más se dobla dos veces

Las patas largas tienen una propiedad incómoda: las puntas de las garras cuelgan más bajo alrededor de los 70 grados de doblez. La primera versión levantaba el talón, doblaba y alzaba la pata con tres curvas separadas unidas con max(), y el doblez pasaba los 70 grados dos veces por vuelo. Así que lo que necesitaba alzar la muñeca tenía dos jorobas, y el codo se doblaba dos veces por zancada.

Ahora toda la flexión de la pata es una sola joroba suave, un coseno elevado: empieza cuando se levanta el talón, llega a su punto máximo temprano en el vuelo, y ya se aplanó al 85% del vuelo para que la pata caiga plana. El doblez tiene tope para que nunca pase el punto más bajo.

Si alzas demasiado una pata trasera, el muslo da un latigazo

La pata trasera se dobla mucho menos que la delantera. Alzada tan alto como la de adelante, ponía el corvejón justo al lado de la cadera, y cerca de una línea recta que pasa por la raíz la resolución es hipersensible: el muslo giró 50 grados en dos cuadros.

El balanceo del cuerpo hunde las patas de un lado

Un perro al trote se balancea, lo que baja un hombro y sube el otro. Con una sola altura de raíz compartida, las patas del lado bajo se metían en el piso. Ahora cada pata recibe su propia altura de raíz según el balanceo, así que el lado bajo se dobla más y el lado alto se estira.

Hombros que se balancean como una puerta

El primer modelo hacía el hombro como una sola pieza con el brazo, una plancha hasta la cruz. Cada paso balanceaba toda la plancha a través del cuerpo como un péndulo. El hombro y el anca ahora son bloques fijos en el cuerpo, con la extremidad metida dentro de ellos.

Mezclar poses: mezcla a dónde va la pata, no los ángulos

El Doggoyle salta, aterriza, se sienta, se echa y nada en el agua. El primer salto mezclaba dos juegos de ángulos de articulación: la pose corriendo y la pose en el aire. Mezclar ángulos produce una pierna más larga que cualquiera de las dos, así que en los primeros cuadros de cada aterrizaje las patas se metían 1.4 unidades en el piso.

Ahora la mezcla es de a dónde va la pata, y la misma IK resuelve la pierna en cada cuadro a partir de eso. La inclinación de la pata funciona igual: se cancela la rotación de toda la cadena y luego se suma una sola inclinación mezclada en el mundo, así que una pata nunca pasa por la posición de dedos hacia abajo mientras está cerca del suelo.

Barbillas atravesando el piso

Sentarse, echarse y acurrucarse se posaron a mano, y cada una se veía bien por su cuenta. Luego el cuerpo bajaba para echarse y la barbilla atravesaba el suelo. Las poses de reposo ahora se resuelven contra el piso (una búsqueda por bisección de la altura donde la barbilla apenas libra), y hay un protector de barbilla en cada cuadro: sea cual sea la mezcla de estados en que esté el perro, la altura de la barbilla se calcula a partir del cuerpo, y nunca baja del piso.

Todo corre en Molang

Todo esto está en los scripts pre_animation de la entidad del cliente, que corren en cada cuadro antes de las animaciones. Molang tiene funciones con número fijo de argumentos (math.max acepta exactamente dos, y con tres rompe toda la entidad sin avisar) y se detiene si lees una variable antes de asignarla, así que el orden de las líneas importa tanto como las matemáticas. El modelo, la animación y el Molang se generan juntos con un solo script, que también corre las revisiones de arriba antes de escribir nada.

Conoce al Doggoyle en las mazmorras de azufre del Magic Pack. Domestica uno con una manzana de oro normal; la guía del Magic Pack explica cómo encontrar una mazmorra.

El mod

Más del devlog

← Todo el devlog