Animación Roblox (R6 / R15)
Crear un movimiento como una pequeña especificación de movimiento en JSON: un puñado de poses clave escritas en términos anatómicos ("brazo superior derecho 90° hacia adelante", "rodilla doblada 60°"). El motor incluido hace todo lo que es propenso a errores a mano: matemáticas de las articulaciones Roblox para ambos rigs, interpolación, mantener los pies en el suelo, un visor 3D, advertencias de cordura y la exportación de keyframes horneados.
El usuario juzga el resultado viéndolo, así que el bucle es: planificar las fases → escribir la especificación → construir → mirar el storyboard tú mismo → corregir → entregar vista previa + keyframes. No omitas el paso de mirar; los números de pose que parecen correctos en papel a menudo son visiblemente incorrectos (un brazo a través del pecho, una patada que nunca alcanza el balón).
Flujo de trabajo
- Fijar el movimiento. Rig (R6 o R15; pregunta solo si realmente no se puede inferir, de lo contrario predetermina R15 y dilo), lateralidad, bucle o de un solo disparo, duración aproximada y qué ganchos de juego se necesitan (fotograma de golpe, lanzamiento de balón, pasos de pies). Empieza a construir directamente para una solicitud clara.
- Dividir en fases antes de escribir números. Casi cualquier acción es: preparación → anticipación → acción → seguimiento → recuperación. Lee
references/motion-cookbook.mdpara el género que estés haciendo (combate, deportes, bucles de locomoción, acrobacias, detalles específicos de R6); tiene tablas de tiempos y recetas de poses. - Escribir la especificación en
<nombre>.json. Empieza desde el archivo más cercano enexamples/en lugar de desde cero. - Construir:
node <skill>/scripts/ranim.cjs <nombre>.json --out out(se pueden pasar varias especificaciones; se convierten en pestañas en una vista previa). Solo necesita Node, sin paquetes. - Leer el informe impreso en stdout. Enumera dónde están la cabeza, las manos y los pies en cada clave (studs: R = a la derecha del personaje, U = sobre el suelo, F = al frente) e imprime líneas
WARN. Usa las posiciones para verificar la intención: ¿está realmente el puño frente al pecho, está el pie a la altura del balón? - Mirar
out/storyboard-<Nombre>.pngcon la herramienta Leer (cada clave desde una vista 3/4 y una vista lateral). Si no se produjo PNG, capturaout/preview.htmlcon un navegador sin interfaz gráfica o lee el SVG. Compara cada panel con la fase que pretendías. - Corregir y reconstruir hasta que las poses se lean claramente y las advertencias hayan desaparecido o se acepten conscientemente. Son normales dos o tres rondas.
- Entregar: el
out/preview.htmlinteractivo (publícalo como artefacto o envía el archivo), másout/<Nombre>.rbxmxyout/<Nombre>.lua. Muestra la imagen del storyboard en línea si puedes. Explica al usuario brevemente cómo llevarlo a Studio (abajo) y qué eventos de animación existen.
Especificación de movimiento
{
"name": "JabCross", // se convierte en el nombre de KeyframeSequence y del archivo
"title": "Combo jab-cross", // se muestra en el visor
"rig": "R15", // "R15" o "R6"
"priority": "Action", // Idle | Movement | Action | Action2..4 | Core
"loop": false,
"description": "Una o dos oraciones que se muestran junto a la vista previa.",
"keys": [
{ "t": 0, "label": "guardia", "note": "Se muestra en la lista de fases.",
"pose": { "UpperTorso": { "turnR": 10, "bendFwd": 8 },
"LeftUpperArm": { "fwd": 50, "out": 8 }, "LeftLowerArm": { "bend": 120 },
"LeftFoot": "flat" } },
{ "t": 0.1, "label": "jab", "ease": "out", "copy": "guardia",
"pose": { "LeftUpperArm": { "fwd": 86, "in": 22 }, "LeftLowerArm": { "bend": 6 } } },
{ "t": 0.8, "label": "recuperación", "copy": "guardia" }
],
"markers": [ { "t": 0.1, "name": "Hit", "value": "jab" } ],
"props": [ { "type": "ball", "radius": 0.6, "color": "#e07a2c", "keys": [ ... ] } ]
}
(Los comentarios son solo para explicación; el archivo debe ser JSON plano.)
Campos opcionales de nivel superior: fps (por defecto 30; usa 60 para movimientos muy rápidos), duration (por defecto la última clave), grounding ("off" para controlar la altura manualmente), mirror: true (invierte todo el clip izquierda/derecha, por ejemplo, una versión zurda), endKeyframe: true.
Claves
tsegundos (ajustado a un fotograma). La primera clave es en 0.poseasigna nombre de articulación → canales en grados. Una articulación omitida en una clave simplemente se interpola a través de esa clave, por lo que las claves intermedias pueden mencionar solo las articulaciones que importan. Una articulación nunca mencionada permanece en reposo y no se exporta; una que se menciona por primera vez después de la clave 0 comienza desde el reposo (0°).copy: la etiqueta o índice de una clave anterior. La pose comienza como una copia yposesobrescribe partes de ella."mirror": trueconcopyintercambia izquierda y derecha, así es como se hacen los ciclos de caminar/correr a partir de medio paso.easeda forma al segmento que sale de esta clave:smooth(por defecto, alisa naturalmente sin sobrepaso),linear,in(comienza lento, termina rápido: cargas que se liberan en un golpe),out(comienza rápido, se asienta: impactos),inOut,hold,overshoot,anticipate,bounce,elastic.lift: altura en studs del punto más bajo del cuerpo sobre el suelo en esta clave (por defecto 0). Así es como se hacen los saltos; ver Grounding.
Articulaciones y canales
Los ángulos son anatómicos y la misma palabra significa lo mismo en ambos lados del cuerpo, por lo que una pose reflejada no necesita cambios de signo. Cada canal tiene un alias de dirección opuesta; usa el que se lea de forma natural.
| Articulaciones | Canales (alias para la dirección opuesta) |
|---|---|
Raíz: LowerTorso (R15), Torso (R6) | bendFwd (bendBack), turnL (turnR), leanR (leanL), moveFwd (moveBack), moveR (moveL), moveUp (moveDown) en studs |
Columna: UpperTorso, Head | bendFwd (bendBack), turnL (turnR), leanR (leanL) |
Extremidades superiores: Left/RightUpperArm, Left/RightUpperLeg; R6 Left Arm, Right Arm, Left Leg, Right Leg | fwd (back) balancea el miembro hacia adelante/arriba, out (in) alejándose del / cruzando el cuerpo, twistOut (twistIn) lo gira sobre su propia longitud |
Left/RightLowerArm, Left/RightLowerLeg | bend: codos y rodillas en su dirección natural (0 = recto) |
Left/RightHand, Left/RightFoot | fwd (back), out (in), twistOut (twistIn). Los pies también aceptan la cadena "flat" |
Puntos de referencia: brazo fwd: 90 apunta recto hacia adelante, fwd: 180 recto hacia arriba, out: 90 es una pose en T. Pierna fwd: 90 es una patada frontal a la altura de la cintura. Las rotaciones se componen de padre a hijo, por lo que el giro del pecho lleva los brazos con él; gira la Head en la dirección opuesta para mantener los ojos en el objetivo.
R6 tiene seis partes y no tiene codos, rodillas, manos ni pies, por lo que la silueta proviene del torso y los ángulos de las extremidades completas; exagera un poco. Los nombres de las extremidades R6 contienen un espacio ("Right Arm").
Grounding
Por defecto, el motor baja o sube la raíz en cada fotograma para que el punto más bajo del cuerpo esté exactamente lift studs sobre el suelo. Consecuencias:
- Las sentadillas, estocadas y splits bajan automáticamente las caderas; nunca ajustes manualmente la altura de la cadera para una pose de pie.
"flat"en un pie R15 resuelve el tobillo para que la planta quede plana independientemente de lo que haga la pierna. Úsalo para cada pie plantado; da ángulos explícitos ("back": 40= dedos apuntando) para pies en el aire o de puntillas.- Un salto son valores
liften las claves aéreas (despegue pequeño, ápice más grande, 0 en el aterrizaje). La rotación del cuerpo en el aire va en la raíz: un backflip es elbendBackde la raíz que va de 0 a 360 a través de las claves (los ángulos son continuos, así que 360 es un giro completo, no "volver a 0"). moveUpen la raíz se ignora mientras el grounding está activado. Pon"grounding": "off"solo para cosas como nadar o escalar donde el suelo es irrelevante.- Los saltos y dashings en el juego normalmente los mueve el controlador del personaje, no la animación. Para una animación que se reproduce durante un salto de juego, posa el cuerpo y deja
liften 0. UsaliftymoveFwdpara emotes independientes, ataques con un salto y volteretas. Si el clip termina desplazado de donde empezó, el informe advierte, porque Roblox devuelve el cuerpo a su lugar cuando la pista se detiene.
Marcadores y props
markersse convierten enKeyframeMarkers, que se leen en el juego contrack:GetMarkerReachedSignal("Hit"). Pon uno en cada fotograma que importe para la jugabilidad: ventanas de golpe, contacto o lanzamiento de balón, pasos de pies, señales de sonido.propsson solo para vista previa (no se exportan) y existen para que el movimiento pueda juzgarse contra lo que interactúa.type: "ball"conradius, o cualquier otro tipo para una caja consize: [x, y, z](una espada es una caja larga y delgada).atpuede ser un nombre de parte (el prop sigue esa parte;offset: [right, up, fwd]en los ejes propios de la parte) o un punto fijo[right, up, fwd]en studs desde el punto del suelo debajo del personaje. Con varioskeys, el prop se mueve entre anclajes;arcañade una subida parabólica al segmento que sale de esa clave (un tiro o un pase). Verexamples/jump_shot.jsonyexamples/soccer_kick.json.
Cómo se ve un buen resultado
- Siluetas legibles. En el storyboard, cada clave debe ser reconocible solo por su contorno. Si dos claves vecinas se parecen, una de ellas no está haciendo ningún trabajo.
- Contraste en el tiempo. Anticipación lenta, acción muy rápida (2 a 4 fotogramas), una pausa breve en el seguimiento, recuperación más lenta. La separación uniforme entre claves es la razón más común por la que un movimiento se siente sin peso.
- Todo el cuerpo participa. La potencia comienza en los pies y las caderas, luego el pecho, luego el hombro, luego la mano o el pie. Dale a las caderas y al pecho una contrarrotación en la carga y deja que el brazo lejano equilibre el cercano.
- Los pies se quedan quietos. Un pie plantado mantiene sus números R y F en el informe de una clave a otra. Si debe moverse, levántalo en una clave intermedia (un paso).
- Cero advertencias, o una razón para cada una que conserves. Los límites son rangos articulares naturales; excederlos generalmente significa que se pretendía un canal diferente.
Cómo llevarlo a Roblox Studio
Dale al usuario ambas rutas y los nombres de los eventos.
- Barra de comandos (más rápido): selecciona el rig en el Explorador, abre Ver → Barra de comandos, pega todo el contenido de
<Nombre>.lua, presiona Enter. El KeyframeSequence aparece en losAnimSavesdel rig (o en ServerStorage si no hay nada seleccionado), donde el Editor de Animaciones puede cargarlo para ajustes. - Archivo: arrastra
<Nombre>.rbxmxa la ventana de Studio, o haz clic derecho en un servicio → Insertar desde Archivo. - Publicación: para reproducirlo en un juego en vivo, debe subirse: ábrelo en el Editor de Animaciones y publica, o haz clic derecho en el KeyframeSequence → Guardar en Roblox, luego usa el id de asset resultante en un objeto
AnimationyAnimator:LoadAnimation. Para pruebas locales rápidas en Studio,game:GetService("KeyframeSequenceProvider"):RegisterKeyframeSequence(seq)devuelve un id temporal. Los menús de Studio cambian de vez en cuando; si un paso no coincide con lo que el usuario ve, dilo y busca la redacción actual en lugar de insistir.
La exportación está horneada: un keyframe por fotograma con easing lineal, por lo que Studio reproduce exactamente lo que muestra la vista previa en cualquier rig de ese tipo. Solo se escriben las articulaciones que anima la especificación, por lo que una animación solo de la parte superior del cuerpo deja las piernas libres para la caminata predeterminada. La salida R15 lleva AuthoredHipHeight para que se reoriente a avatares de otras proporciones.
Archivos
scripts/ranim.cjs— motor, visor y exportador en un solo archivo. También utilizable como módulo:const R = require('.../ranim.cjs'); const c = R.compile(spec); R.report(c); R.sample(c, t).scripts/selftest.cjs— verifica las matemáticas de las articulaciones contra la fórmula Motor6D de Roblox. Ejecútalo después de editar el motor.examples/—soccer_kick,jump_shot(deportes con props de balón),jab_cross(combate R15),r6_sword_slash(combate R6 con arma),backflip(rotación de cuerpo completo y salto),r6_run(bucle reflejado).references/motion-cookbook.md— tablas de tiempos y recetas de poses por género. Lee la sección relevante antes de crear.