// Guía visual interactiva

CEM Animation
para Blockbench

Aprende a animar mobs de Minecraft con resource packs. Catálogo completo de animaciones, graficador en tiempo real, simulador 3D y traductor de Blockbench a CEM.

01

¿Qué es CEM Animation?

Imagina que quieres que el cerdo de Minecraft mueva las patas al caminar de una forma distinta a la del juego. Con CEM puedes reemplazar esas animaciones usando solo un archivo de texto, sin programar ni modificar el juego.

🎬

Analogía: una partitura musical

CEM es como darle a un músico instrucciones escritas en lugar de tocar para él. En lugar de mostrarle el movimiento directamente, le escribes: "cuando el personaje dé un paso, mueve el brazo 45 grados hacia adelante". El juego lee esas instrucciones y las ejecuta en tiempo real, cada fotograma.

El archivo .jem
La forma del personaje

Define cómo se ve: dónde están los huesos, qué texturas usar, cómo están conectadas las piezas.

Las animaciones
Cómo se mueve

Fórmulas matemáticas dentro del .jem. Cada fórmula le dice a un hueso cuánto rotar o moverse en cada momento.

OptiFine / EMF
El lector del archivo

Sin estos mods el juego ignora tus archivos. EMF es el recomendado — funciona mejor y es compatible con Sodium e Iris.

Variables del juego
Datos en tiempo real

Minecraft te dice cosas como "el personaje camina a velocidad 0.7". Usas esos datos en tus fórmulas.

Diferencia con Blockbench normal: En Blockbench colocas poses en momentos específicos (keyframes). En CEM no hay keyframes — escribes una fórmula que calcula la posición del hueso en cualquier momento.
02

Jerarquía del modelo

🪆

Analogía: muñecas rusas

Los huesos están anidados como muñecas rusas. Si mueves el cuerpo (la muñeca grande), los brazos y piernas (las pequeñas dentro) se mueven con él. Esto se llama jerarquía padre-hijo.

Cada mob tiene huesos predefinidos que no puedes eliminar. Solo puedes agregar piezas dentro de esos huesos.

Regla de oro: No puedes agregar piezas directamente a la raíz del modelo — solo dentro de los huesos vanilla (body, head, leg1…). Para un personaje completamente personalizado, mete todo dentro de body.
Modelo del cerdo
  └─ body ← hueso vanilla ← aquí metes todo ✓
    ├─ Cabeza ← tu pieza
    ├─ Torzo ← tu pieza
    ├─ Brazo Izq / Der
    └─ Pierna Izq / Der
  └─ mi_pieza_nueva ← NO funciona aquí

¿Por qué "this.rx": 0?

El cerdo tiene su body rotado -90° en X para que las patas apunten hacia abajo. Si metes tu personaje dentro heredará esa rotación. La línea "this.rx": 0 cancela esa rotación y te da un espacio limpio.

03

Estructura del archivo

📋

Analogía: una receta de cocina

Cada línea dice: "para el ingrediente X (hueso), haz esta operación (eje) con esta cantidad (expresión)". El juego sigue la receta cada fotograma.

"animations": [ { "this.rx": 0, ← cancela rotación del cerdo "Pierna Izq.rz": "sin(limb_swing * 0.8) * limb_speed * 0.8", "Pierna Der.rz": "sin(limb_swing * 0.8 + pi) * limb_speed * 0.8" } ]
"Pierna Izq"
¿A qué hueso?
ID exacto del grupo en tu .jem. Respeta mayúsculas y espacios.
rz
¿Qué muevo?
rx/ry/rz = rotación. tx/ty/tz = posición. sx/sy/sz = tamaño.
sin(...)
¿Cuánto?
Fórmula que calcula el valor cada frame. Devuelve radianes.
Radianes, no grados: CEM usa radianes. 90° = 1.57. Usa torad(90) si piensas en grados.
04

Variables disponibles

Las variables son datos que el juego te entrega en tiempo real. Piénsalas como sensores: el juego mide cosas del mundo y tú usas esas mediciones.

VariableEn palabras simplesRango
limb_swingUn contador que avanza mientras el mob camina. Como un reloj de pasos — nunca retrocede. Es la "X" de tu ciclo de caminata.0 → ∞
limb_speedQué tan rápido va el mob. 0 = parado, 1 = sprint. Multiplícalo en tu fórmula para que la animación se apague al detenerse.0 → 1
ageCuánto tiempo lleva vivo el mob en ticks. Nunca para, incluso parado. Perfecto para "respira aunque esté quieto".0 → ∞
head_pitchHacia dónde mira la cabeza verticalmente. Negativo = arriba, positivo = abajo. Ya en radianes.-π/2 → π/2
head_yawHacia dónde mira horizontalmente. Para que la cabeza siga la vista del jugador.-π → π
timeTiempo total del juego. Blockbench lo entiende, a diferencia de limb_swing. Úsalo para previsualizar en el editor.0 → 27719
VariableEn palabras simplesRango
hurt_timeAl recibir daño empieza en 10 y baja a 0. Úsala para que el personaje reaccione al golpe visualmente.10 → 0
swing_progressProgreso del ataque: 0 = inicio del golpe, 1 = fin del golpe.0 → 1
death_timeSube de 0 a 20 mientras el mob muere. Para animaciones de muerte.0 → 20
healthVida actual en puntos. Combínala con max_health para porcentaje.0 → max
anger_timeTiempo de agresividad restante (ticks). Para mobs hostiles.0 → 780

Solo tienen dos valores: true (sí) o false (no). En fórmulas, true=1 y false=0. Se usan principalmente con if().

Variable¿Cuándo es verdadera?
is_on_groundEl mob está tocando el suelo
is_in_waterEl mob está en agua
is_in_lavaEl mob está en lava
is_burningEl mob está en llamas
is_hurtEstá recibiendo daño ahora mismo
is_sneakingEstá agachado
is_sprintingEstá corriendo a velocidad máxima
is_aggressiveTiene un objetivo y va a atacar
is_childEs la versión bebé
is_tamedEstá domesticado
is_aliveEstá vivo (útil en animaciones de muerte)
is_riddenAlguien lo está montando
🦾

Los ejes son como articulaciones

Cada hueso puede moverse en tres ejes de rotación. Cuál es "adelante/atrás" depende de cómo esté orientado tu hueso en Blockbench. Si no sabes cuál usar, prueba los tres.

EjeTipoDescripción
rxrotaciónRotar en X. En modelos estándar: adelante/atrás.
ryrotaciónRotar en Y. En modelos estándar: izquierda/derecha.
rzrotaciónRotar en Z. Inclinarse de lado. Puede ser adelante/atrás si el hueso está rotado 90°.
tx / ty / tzposiciónDesplazar el hueso sin rotarlo.
sx / sy / szescalaCambiar el tamaño. 1=normal, 2=doble, 0.5=mitad.
visibleboolMostrar/ocultar el hueso y sus hijos.
05

Funciones matemáticas

🧮

Las funciones son herramientas de cocina

sin() es como un batidor que convierte un número en una ola suave. clamp() es como un tope físico. No necesitas saber matemáticas — solo qué hace cada herramienta.

La más importante
sin(x)

Convierte cualquier número en una ola entre -1 y 1. Base de todos los movimientos cíclicos: caminata, respiración, sway.

Prima de sin()
cos(x)

Igual que sin() pero empieza en 1 en lugar de 0. Siempre 90° desfasada. Útil para movimiento circular combinado con sin().

Tope
clamp(x, min, max)

Evita que un valor salga de rango. Como poner un tope físico para que una articulación no gire de más.

Mezcla
lerp(t, a, b)

Mezcla suavemente entre a y b. t=0 devuelve a, t=1 devuelve b, t=0.5 devuelve el punto medio. Para transiciones.

Decisión
if(c, a, b)

Si c es verdadero devuelve a, si no devuelve b. Como un interruptor: "si está en agua, anima así; si no, asá".

Sin signo
abs(x)

Quita el signo negativo. Convierte la ola de sin() en jorobas siempre positivas. Útil para rebotes.

Conversión
torad(grados)

Convierte grados a radianes. torad(90)=1.5708. Úsalo cuando piensas en grados pero el sistema necesita radianes.

Aceleración
pow(x, y)

x elevado a la potencia y. pow(t,2) crea ease-in (arranca despacio y acelera). Útil para movimientos naturales.

Redondeo
floor(x) / ceil(x)

floor redondea hacia abajo, ceil hacia arriba. Para efectos escalonados o discretos.

Mínimo/Máximo
min(a,b) / max(a,b)

Devuelve el menor o mayor de dos valores. Para limitar sin usar clamp, o para combinar dos condiciones.

Raíz cuadrada
sqrt(x)

La raíz cuadrada. Crea curvas de desaceleración (ease-out). sqrt(t) desacelera al llegar al final.

Azar
random(seed)

Número aleatorio entre 0 y 1. Con seed siempre devuelve el mismo resultado. Para variaciones únicas por entidad.

07

Graficador de expresiones

Escribe cualquier expresión y mira la curva en tiempo real. El eje X es limb_swing, el eje Y es el resultado en radianes.

// Graficador 2D
limb_speed 1.00
Tu expresión
sin(x) puro

Comparar dos expresiones

Expresión 1
Expresión 2
08

Simulador 3D de hueso

Visualiza cómo rota y se mueve un hueso en 3D con tus expresiones CEM. Arrastra para orbitar, rueda para zoom. Selecciona el pivote para cambiar el punto de articulación — desde la base hasta cualquier cara. Activa Trayectoria para ver el recorrido de la punta del hueso, y Fantasma para comparar con la pose en reposo.

09

Simulador de caminata

Edita las expresiones y ve el resultado en tiempo real sobre una figura articulada.

// Simulador de caminata 2D
PIERNA IZQ
PIERNA DER
BRAZO IZQ
BRAZO DER
limb_speed 0.80
09b

Simulador de caminata 3D

Humanoid completo de 13 piezas con expresiones CEM editables por cada hueso. Arrastra para rotar la vista, usa la rueda para zoom. Selecciona una pieza en la lista para editar sus expresiones rx/ry/rz.

09c

Simulador de cubo 3D

Activa transformaciones con los checkboxes y mira cómo se apilan sobre el cubo en tiempo real. Cambia el pivote para entender cómo cambia el centro de rotación — desde el centro del cubo hasta cualquiera de sus 6 caras, o el origen del mundo para simular una órbita. Arrastra para orbitar, rueda para zoom.

10

Traductor bbmodel → CEM

Pega tu .bbmodel completo y el traductor detecta automáticamente todas las animaciones. Asigna una categoría a cada hueso (caminata, idle, nadar…) y ajusta la velocidad de 0 a 200% para afinar el resultado antes de copiar.

Nota: Los keyframes de Blockbench son poses en momentos fijos. Las expresiones CEM son fórmulas continuas — la traducción es una aproximación. Revisa el eje (rx/ry/rz) de cada hueso en Blockbench y ajusta la amplitud si es necesario.
11

Receta: Caminata

// sin(limb_swing * FRECUENCIA) * limb_speed * AMPLITUD "Pierna Izq.rz": "sin(limb_swing * 0.8) * limb_speed * 0.8", "Pierna Der.rz": "sin(limb_swing * 0.8 + pi) * limb_speed * 0.8", "Brazo Izq.rx": "sin(limb_swing * 0.8 + pi) * limb_speed * 0.5", "Brazo Der.rx": "sin(limb_swing * 0.8) * limb_speed * 0.5"
+ pi desplaza la onda media vuelta — pierna izq y der van en sentidos opuestos. Sin esto se mueven igual al mismo tiempo.
12

Receta: Idle y respiración

"Torzo.rx": "sin(age * 0.04) * 0.018", ← respiración "Cabeza.ry": "sin(age * 0.02) * 0.015 * (1 - limb_speed)", "Cabeza.rz": "sin(age * 0.015 + 1.2) * 0.008 * (1 - limb_speed)"
(1 - limb_speed) hace que el idle desaparezca cuando el mob empieza a caminar.
13

Receta: Daño y ataque

// Golpe recibido "Cabeza.rx": "-sin(hurt_time / pi) * 0.4", // Ataque "Brazo Der.rx": "sin(swing_progress * pi) * 1.2", // Muerte "body.rz": "death_time / 20 * torad(90)"
14

Receta: Condicionales

🔀

if() es un interruptor

Permite comportamientos distintos según el estado del mob. Puede encadenarse para múltiples condiciones.

// if(CONDICIÓN, SI_VERDAD, SI_FALSO) "Pierna Izq.rz": "if(!is_on_ground, torad(30), sin(limb_swing*0.8)*limb_speed*0.8)", "Torzo.rx": "if(limb_speed > 0.7, torad(15), 0)", // Múltiples: lava → agua → normal "Brazo Izq.rx": "if(is_in_lava, sin(age), is_in_water, sin(age/4), sin(limb_swing*0.8)*limb_speed*0.5)"
15

Referencia de ángulos

GradosRadianestorad()Uso típico
0.087torad(5)Micro idle, respiración
15°0.262torad(15)Sway de cabeza
30°0.524torad(30)Pierna al saltar
45°0.785torad(45)Caminata normal
60°1.047torad(60)Caminata enérgica
90°1.571torad(90)Brazo horizontal
180°3.142piFase opuesta completa