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.
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:
| Andar | Patrón de pisadas |
|---|---|
| Paso | Cuatro tiempos: trasera izquierda, delantera izquierda, trasera derecha, delantera derecha, a un cuarto de zancada entre sí |
| Trote | Pares en diagonal: trasera izquierda con delantera derecha, y luego el otro par media zancada después |
| Galope | El 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
- Cinco errores de complementos de Bedrock que fallan sin dar error Un caballo invisible, patas corriendo cuatro veces más rápido, una criatura que olvidó cómo saltar y un pack de magia que se rompió sin que nadie lo tocara. Cinco errores de complementos de Minecraft Bedrock con los que me topé haciendo LLS Equestrian y el Magic Pack, y cómo atraparlos.
- Hacer que nieve en una granja de planicie: cómo fingir clima invernal en Minecraft Bedrock Bedrock no tiene clima de nieve y decide entre lluvia o nieve según el bioma. Cómo LLS Seasons arma un día nevado con niebla, una partícula y una capa de nieve propia, y el congelamiento de verano que causó una limpieza de nieve.
- Cómo hacer que un portón gire en Minecraft Bedrock, cuando los bloques no se pueden animar Los bloques de Bedrock no se pueden mover, y la colisión de un bloque personalizado tiene que caber dentro de un bloque. Cómo los portones dobles de LLS Missing Blocks fingen las dos cosas, y los trucos de colisión que mantienen adentro a una vaca y dejan pasar a un caballo.