> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-es/wearables-y-emotes/wearables/spring-bones.md).

# Spring Bones

### ¿Qué son los Spring Bones?

Los spring bones (también conocidos como jiggle bones o physics bones) son huesos adicionales añadidos a un wearable que se mueven dinámicamente en respuesta al movimiento del avatar y a la gravedad, en lugar de ser controlados por clips de animación. Dan vida a elementos como el hair, los earrings, las capes, los belts, las ponytails y otros accesorios colgantes, haciendo que se balanceen, reboten y se asienten de forma natural cuando el avatar camina, corre o gira.

Los Spring Bones son **no** parte de la armature base del avatar. Son huesos adicionales que añades al skeleton base del avatar en Blender (o cualquier software 3D), y su comportamiento físico se configura en el Builder después de subirlos.

Esta implementación sigue el [estándar VRM Spring Bone](https://vrm.dev/en/vrm1/springbone/), una convención ampliamente adoptada para la física de avatares en formatos como VRM y MMD.

![](/files/0c3d9eacd05d9984edf2f60b7b64a5e9349ec43e)

### Cómo funcionan los Spring Bones

Una **cadena de spring bones** es una secuencia de bones que simula física en conjunto y debe tener al menos dos bones: el spring bone real y un end bone. Un solo spring bone por sí mismo no producirá ningún movimiento — la simulación necesita la cabeza del spring bone para impulsar la física y la cabeza del end bone definirá el extremo geométrico. Las cadenas más largas (3+ bones) tendrán un movimiento más suave y natural, ideal para cabello largo o capes.

1. **Spring bone padre** — El primer bone de la cadena. Posee la configuración física (stiffness, gravity, drag, etc.). Se identifica porque tiene `springbone` en cualquier parte del nombre del bone (sin distinguir mayúsculas y minúsculas).
2. **Spring bone hijo** — Es el hijo del bone anterior en la jerarquía. Hereda los parámetros físicos de su padre y forma la cadena.
3. **Spring bone final** — Es el último bone de la cadena. Define el extremo geométrico de la cadena, pero no se ve afectado por la simulación y no deforma ningún mesh.

La cadena, o jerarquía, de spring bones debe ser **lineal**, lo que significa que cada bone solo puede tener un hijo. Los bones con dos o más hijos pueden tener un comportamiento inesperado.

![Una buena cadena lineal de spring bones.](/files/da8b02667636e35ad05e77555d59731772359244)

![Los bones con 2 o más hijos tendrán un comportamiento inesperado.](/files/8a1a86e95f5640d6ae55362ed34d4c3edd558a8f)

### La jerarquía

Para que los spring bones funcionen bien, tienen que estar parentados a uno de los bones originales del avatar. Para pelo y pendientes, por ejemplo, el bone que está en la parte superior de la jerarquía debería estar parentado a ***Avatar\_Head***. Para bufandas, parentar la cadena a ***Avatar\_Neck*** es una buena idea. Para faldas, quizá ***Avatar\_Hips*** o ***Avatar\_LeftUpLeg/Avatar\_RightUpLeg*** podría funcionar.

Es importante notar cómo funciona la estructura de esta jerarquía.

* *Hair\_springBone\_1* (spring bone padre): este es el bone en la parte superior de la cadena y tiene configuración física
* *Hair\_springBone\_2* (spring bone hijo): es el hijo del bone anterior en la jerarquía y hereda la configuración.
* *Hair\_springBone\_end* (spring bone final): es el último bone de la cadena y solo sirve como extremo.

### Convención de nomenclatura

Todos los spring bones **deben** contener la subcadena `springbone` (sin distinguir mayúsculas y minúsculas) en su nombre. La subcadena puede aparecer en cualquier posición:

* *SpringBone\_hair\_left*
* *hair\_springbone\_l*
* *springbone\_earring.R*

Para mantener tu flujo de trabajo organizado, se sugiere usar este formato: **BodyPart/WearableName\_springBone**

Ejemplos: *Hair\_springBone\_1*, *Earring\_springBone.L* etc… Siéntete libre de usar el formato que mejor te convenga, siempre que siga la convención de nomenclatura de Blender (o del software que prefieras) para izquierda y derecha.

{% hint style="warning" %}
¡Atención!

Los spring bones no funcionarán sin `springbone` en el nombre del bone. Debe usarse, incluso para el bone final.
{% endhint %}

### Límites

Cada wearable debe mantenerse dentro de los siguientes límites de spring bones:

* Máximo **6** cadenas de spring bones por wearable
* Máximo **12** spring bones totales (suma de todos los bones en todas las cadenas)
* Profundidad máxima de cadena de **6** bones

## Creando Spring Bones en Blender

Los spring bones son huesos adicionales que creas en Blender para la armature base del avatar. Los parámetros de física se configuran más tarde en el Builder — por ahora solo necesitas preparar la jerarquía de bones.

Para crear un nuevo bone, selecciona la Armature del avatar y, en **Edit Mode**, asegúrate de tener el cursor donde quieres que se cree el bone y presiona **Shift+A**. Otra forma de hacerlo sería duplicando un bone existente presionando **Shift+D**. Una vez que tengas el primer bone de la cadena, presiona **E** para extruirlo y crear el resto de la cadena.

![Presiona Shift+A para crear un bone donde está el cursor.](/files/a7ed1eac788e4948deb35e92781d43627f5791fa)

Es importante notar que una cadena de spring bones no tiene que estar conectada al parent del skeleton, así que puedes colocarla en cualquier parte del mesh. Sin embargo, la cadena de spring bones **debe** estar conectada, no puedes desplazar ninguno de los spring bones.

Una vez que crees los bones, renómbralos siguiendo la convención de nomenclatura mencionada arriba y asegúrate de parentar la cadena al bone correcto. Las líneas punteadas mostrarán el parent de la cadena. Si no hay ninguno, significa que la cadena no tiene parent. En **Edit Mode**, selecciona primero el child, luego selecciona el parent y presiona **Ctrl+P** > **Keep Offset**.

![Parenta los bones seleccionando primero el child, luego el parent y presiona Ctrl+P.](/files/e779c9b9ce4eb2e6f6ee303aff415b8c7a3023cd)

Para renombrar un bone, selecciónalo en Edit Mode o Pose Mode, ve a la pestaña Bone Properties y renómbralo según la convención de nomenclatura. Haz esto para todos los bones de la cadena.

![](/files/4412a9e099819208e0119247309288f23059a2eb)

{% hint style="info" %}
¡Consejo!

Para asegurarte de que el bone esté colocado correctamente, selecciona el mesh en **Object Mode** y, en **Edit Mode**, selecciona los vertices del área en la que quieres colocar el bone (puede ser un loop o un grupo de vertices) > presiona **Shift+S** > **Cursor to Selected.**

Vuelve a **Object Mode**Object Mode **Edit Mode** Edit Mode **Shift+S** > **Selection to cursor**.
{% endhint %}

![Usa Shift+S para colocar el bone en el lugar correcto del mesh.](/files/f08477224f6704d56b327b8fa1d3be09a455fa79)

### Skinning del Mesh

El skinning es el proceso de vincular el mesh a la armature, para que se muevan juntos. Para ello, definimos cuánta influencia (weight) tendrá cada bone sobre los vertices. Cuanto más weight, más deformará el bone el mesh. Para hacerlo, ve a **Object Mode**, selecciona primero el mesh, presiona **Shift** y selecciona la armature, presiona **Ctrl+P**Hay dos formas de hacerlo: selecciona **With Empty Groups** o **With Automatic Weights**.

![](/files/2be4cee4aee1ed1d6593a8705e8756198ac8c1b0)

#### With Automatic Weights

Como su nombre indica, con este método Blender intentará establecer automáticamente los skin weights creando vertex groups para cada bone en la armature y asignando pesos automáticos a cada uno. Puede funcionar en algunos casos, pero también puede requerir algunos ajustes. Puedes comprobar los groups creados haciendo clic en la **Data** tab.

Si sabes con seguridad que no necesitarás que ciertos bones afecten al mesh, puedes simplemente hacer clic en el **icono de bloqueo** para bloquear los groups que quieras, haz clic en el menú desplegable y **Delete All Unlocked Groups** para eliminarlos del object. Por ejemplo, si estás trabajando en un hair, no tiene sentido tener groups para los feet y las hands. En ese caso, elimina todo lo que no sea la head o los spring bones, como en el ejemplo de abajo. Asegúrate también de eliminar el group del end bone de la spring chain.

![Eliminando vertex groups.](/files/9e16ffcafde29cb10863026ee2004b4a67166cef)

#### With Empty Groups

En este método, Blender creará todos los vertex groups para cada bone de la armature, pero tendrán un weight de cero por defecto. Tendrás que asignar manualmente los weights en Edit Mode o pintarlos en Weight Paint. Esto te da más control sobre lo que afecta cada group y puede ser especialmente útil para hard surfaces o object que deban asignarse por completo a un cierto group. En cualquier caso, una vez que hayas asignado los weights, deberán probarse en Pose Mode y luego ajustarse en Weight Paint.

![Parenting con grupos vacíos.](/files/8ea20af8b82e37d2c4e1d07dfacd358e497de0fb)

#### Pintado de pesos

Para probar el mesh skinned, selecciona la armature y ve a **Pose Mode**, establece un keyframe, luego gira los bones para crear otra pose y establece otro keyframe. Así podrás comprobar cómo se está deformando el mesh con el movimiento. Una vez que tengas las poses configuradas, vuelve a **Object Mode**, selecciona el mesh y ve a **Weight Paint**.

![](/files/77446b2ff8f6210a1deee66633645c003bd5cc2c)

En **Weight Paint**la pestaña Tools encontrarás distintos brushes para ajustar los skin weights. Selecciona el Vertex Group que quieras editar (si están bloqueados, simplemente desbloquéalos para poder editar la influencia) y usa el brush para añadir o quitar influencia. El negro significa cero influencia, mientras que el rojo significa que ese group influye completamente en el mesh. Habilitar el wireframe en **Overlays** hará más fácil ver lo que estás pintando.

![](/files/1a58562d73c524f9b5b0c7649a4ebd8b0d2f76d1)

Usa los brushes add, subtract o smooth para obtener el resultado deseado. Prueba también distintas poses extremas para ver cómo se deforma el mesh y si no queda ningún vertex sin weights. Si estás conforme con el resultado, ¡es hora de exportarlo!

### Exportación

Antes de exportar, asegúrate de eliminar cualquier animation clip creada al probar las poses. Ve a Pose Mode, selecciona todos los bones presionando **Una** y pulsa **Ctrl+R**, luego **Ctrl+S** y finalmente **Ctrl+G** para eliminar cualquier transform de tu armature. Luego vuelve a object mode, cambia el Display Mode de View Layer a Blender File, despliega Actions, haz clic derecho y elimina el archivo de animación.

![](/files/cb41c0b0e3d67b0f032f52dd698bb7cfd4a419f7)

Si tienes otros objects en tu scene, como el avatar mesh, desactiva su visibilidad haciendo clic en el icono del ojo en el Outliner. Luego, ve a **File** > **Export** > **gltf 2.0 (.glb, .gltf)**. Para los ajustes de exportación, despliega Include y en **Limit to** activa **Visible Objects**. Haz clic en Export y ya estarás listo para subir tu archivo al Builder.

![](/files/8f74381da5df1eb77f8ebdae254d95f4eaa108c1)

## Configurando Spring Bones en el Builder

Después de subir un wearable que contiene `springbone`-nombrados bones, el Builder los detecta automáticamente y muestra el **Spring Bones** panel de configuración.

![](/files/b789f04f7fa74417bd36cf13f5e9a0fc7bcd3698)

Desde este panel puedes configurar los parámetros de física para cada spring root bone. La vista previa del avatar en el Builder reflejará inmediatamente tus cambios, así que puedes ajustar el comportamiento en tiempo real.

{% hint style="info" %}
No puedes añadir nuevos spring bones desde el Builder. Los bones deben existir ya en el archivo .glb subido con la convención de nomenclatura correcta. El Builder solo te permite configurar los parámetros de física de los spring bones detectados. `.glb` archivo con la convención de nomenclatura correcta. El Builder solo te permite configurar los parámetros de física para los spring bones detectados.
{% endhint %}

### Referencia de parámetros

#### Fuerza de rigidez

|                    |       |
| ------------------ | ----- |
| **Rango**          | 0 a 4 |
| **Predeterminado** | `2.0` |

Controla con qué fuerza el bone intenta volver a su pose de reposo. Esta es la fuerza de restitución — piensa en ella como la "rigidez" del spring.

* **0**: El bone no volverá al reposo en absoluto — simplemente quedará colgando bajo la gravedad.
* **Valores bajos** (por ejemplo, 0–1): El bone queda suelto y caído, oscilando libremente. Bueno para cabello largo y fluido o accesorios colgantes ligeros.
* **Valores altos** (por ejemplo, 3–4): El bone es rígido, se mantiene cerca de su posición original y regresa rápido. Bueno para cabello corto o accesorios rígidos.

#### Potencia de gravedad

|                    |       |
| ------------------ | ----- |
| **Rango**          | 0 a 2 |
| **Predeterminado** | `0`   |

Controla la magnitud de la fuerza de gravedad que tira del bone en cada frame.

* **0**: Sin efecto de gravedad — el bone solo se ve afectado por la inercia del movimiento y la rigidez.
* **Valores bajos** (por ejemplo, 0.3–0.8): Tracción de gravedad sutil, buena para la mayoría de los accesorios.
* **Valores altos** (por ejemplo, 1.5–2.0): Tracción de gravedad fuerte, haciendo que el bone caiga con mucho peso.

#### Dirección de gravedad

|                    |                                   |
| ------------------ | --------------------------------- |
| **Formato**        | vector X, Y, Z                    |
| **Predeterminado** | `X: 0, Y: -1, Z: 0` (hacia abajo) |

Establece la dirección de la fuerza de gravedad en el espacio mundial. Por defecto, la gravedad tira hacia abajo (Y = -1), simulando la gravedad natural.

| X  | Y  | Z  | Efecto                                         |
| -- | -- | -- | ---------------------------------------------- |
| 0  | -1 | 0  | Hacia abajo (gravedad natural, predeterminado) |
| 0  | 1  | 0  | Hacia arriba (efecto flotante/sobrenatural)    |
| 1  | 0  | 0  | Hacia la izquierda                             |
| -1 | 0  | 0  | Hacia la derecha                               |
| 0  | 0  | 1  | Hacia adelante                                 |
| 0  | 0  | -1 | Hacia atrás                                    |

Puedes combinar ejes (por ejemplo, `X: 0.5, Y: -0.5, Z: 0`) para direcciones diagonales. Esto es útil para simular efectos similares al viento o para crear una apariencia flotante en personajes sobrenaturales.

#### Fuerza de arrastre

|                    |       |
| ------------------ | ----- |
| **Rango**          | 0 – 1 |
| **Predeterminado** | `0.5` |

Controla qué tan rápido el bone pierde impulso y se asienta. Piensa en ello como resistencia del aire o amortiguación.

* **Valores bajos** (por ejemplo, 0–0.2): El bone oscila libremente durante mucho tiempo antes de asentarse, como un péndulo con poca fricción.
* **Valores altos** (por ejemplo, 0.7–1.0): El bone se asienta casi al instante después del movimiento, dando una sensación pesada o amortiguada.
* **1**: El bone apenas se mueve — deceleración máxima.

#### Centro (opcional)

|                    |                            |
| ------------------ | -------------------------- |
| **Formato**        | Nombre del bone (dropdown) |
| **Predeterminado** | Ninguno                    |

Un bone de referencia opcional que se usa para calcular el movimiento del spring bone en relación con un punto del avatar, en lugar de hacerlo respecto al espacio mundial. Esto evita que la spring chain se balancee en exceso cuando el avatar se mueve por el entorno (caminar, correr).

**Sin un center bone**, los springs calculan la inercia en el espacio mundial — cada paso que da el avatar hace que los bones reaccionen como si todo el mundo se moviera, lo que produce un balanceo exagerado durante la locomoción.

**Con un center bone**, la simulación usa el espacio de ese bone como marco de referencia, así que solo los *movimientos locales* del avatar (giro de cabeza, flexión del cuerpo) activan la reacción del spring.

Elige el center bone según dónde esté ubicado el wearable en el cuerpo:

| Ubicación del wearable                               | Bone central recomendado |
| ---------------------------------------------------- | ------------------------ |
| Cabeza (hair, earrings, tiaras)                      | `Avatar_Head`            |
| Parte superior del cuerpo (capes, necklaces)         | `Avatar_Spine`           |
| Parte inferior del cuerpo (belts, skirt accessories) | `Avatar_Hips`            |

{% hint style="warning" %}
El center bone **no debe** formar parte de ninguna spring chain. Debe ser un bone de la armature base del avatar.
{% endhint %}

## Casos de uso comunes y valores recomendados

Estos son puntos de partida sugeridos. Ajústalos a tu gusto usando la vista previa en tiempo real del Builder.

| Caso de uso                     | Rigidez   | Potencia de gravedad | Dir. de gravedad | Arrastre  | Centro         | Notas                                                    |
| ------------------------------- | --------- | -------------------- | ---------------- | --------- | -------------- | -------------------------------------------------------- |
| Cabello largo / cola de caballo | 1.0 – 2.0 | 0.3 – 0.8            | 0, -1, 0         | 0.3 – 0.5 | `Avatar_Head`  | Más bones en la cadena = movimiento más suave            |
| Cabello corto                   | 3.0 – 4.0 | 0 – 0.3              | 0, -1, 0         | 0.4 – 0.6 | `Avatar_Head`  | Una rigidez mayor mantiene el hair cerca de la cabeza    |
| Pendientes                      | 0.5 – 1.5 | 0.5 – 1.0            | 0, -1, 0         | 0.4 – 0.6 | `Avatar_Head`  | Cadena corta (2–3 bones), menor rigidez para el balanceo |
| Capa / manto                    | 1.0 – 2.0 | 0.5 – 1.0            | 0, -1, 0         | 0.3 – 0.5 | `Avatar_Spine` | Múltiples cadenas paralelas para dar anchura             |
| Cinturón / adorno colgante      | 1.5 – 2.5 | 0.3 – 0.8            | 0, -1, 0         | 0.5 – 0.7 | `Avatar_Hips`  | Mayor arrastre para elementos más pesados                |
| Efecto flotante / fantasma      | 1.0 – 2.0 | 0.5 – 1.0            | 0, 1, 0          | 0.3 – 0.5 | `Avatar_Spine` | Gravedad hacia arriba para un aspecto sobrenatural       |

## Limitaciones

Ten en cuenta las siguientes limitaciones al trabajar con spring bones:

* **Sin colliders**: Los spring bones no colisionan con el cuerpo del avatar ni con otros bones. Las cadenas pueden atravesar el body mesh en poses extremas. Las versiones futuras podrían añadir soporte para colliders.
* **Sin interacciones entre wearables**: Las spring chains de cada wearable son independientes. Las cadenas de wearables distintos no se afectan entre sí.
* **Sin viento global**: No existe una fuerza de viento a nivel de escena. Puedes aproximar un efecto de viento por wearable ajustando el `gravityDir` a una dirección diagonal.
* **Rendimiento en avatares remotos**: La simulación de spring bones se desactiva para los avatares que están lejos del jugador local para ahorrar rendimiento. Los avatares cercanos mostrarán la física de spring bones normalmente.
* **Compatibilidad con clientes alternativos**: Los wearables con spring bones son compatibles hacia atrás con clientes alternativos y versiones antiguas de Explorer, pero los elementos de spring bone permanecerán estáticos. En algunos casos, puede haber pequeños problemas visuales.

## Referencia técnica

La física de spring bones utiliza dos artefactos separados que trabajan juntos:

1. **El `.glb` archivo** solo contiene los nombres de los bones (con el `springbone` token) y su jerarquía. No se almacenan parámetros de física en el archivo del modelo.
2. **Los metadatos del ítem del wearable** (`wearable.data.springBones`) contienen todos los parámetros de física como JSON.

Cuando configuras parámetros en el Builder, se guardan en los metadatos del ítem del wearable — el `.glb` archivo .glb nunca se modifica mediante la edición de parámetros.

No necesitas interactuar directamente con este formato — el Builder se encarga de leerlo y escribirlo. Esta sección se proporciona como referencia.

### `.glb` Jerarquía de nodos (ejemplo)

El archivo del modelo contiene solo los nombres de los bones y las relaciones padre-hijo:

```json
{
  "asset": {"version": "2.0"},
  "nodes": [
    {"name": "Avatar_Head", "children": [1, 2]},
    {"name": "SpringBone_earring_r", "children": [3]},
    {"name": "SpringBone_hair_left", "children": [4]},
    {"name": "springbone_earring_r_tip"},
    {"name": "SpringBone_hair_left_tip"}
  ]
}
```

### Metadatos del ítem (`wearable.data.springBones`)

Los parámetros de física se almacenan en los metadatos del wearable, indexados por el hash de contenido GLB:

```json
{
  "version": 1,
  "models": {
    "bafkreialsvt77jvpy673cnugp5ggnxfaalfncufweayuk3jbxskh3pelkm": {
      "SpringBone_earring_r": {
        "stiffness": 0.5,
        "gravityPower": 1.0,
        "gravityDir": [0, -1, 0],
        "drag": 0.6,
        "isRoot": true,
        "center": "Avatar_Hips"
      },
      "SpringBone_hair_left": {
        "stiffness": 2.0,
        "gravityPower": 0.8,
        "gravityDir": [0, -1, 0],
        "drag": 0.4,
        "isRoot": true
      }
    }
  }
}
```

* `models` se indexa por el hash del contenido GLB. Los Wearables cuyas representaciones masculina y femenina comparten el mismo `.glb` tienen una sola entrada.
* Cada entrada de bone usa el nombre exacto del nodo de la `.glb` (sensible a mayúsculas y minúsculas).
* Tip bones (por ejemplo, `springbone_earring_r_tip`) no necesitan una entrada de metadata — solo sirven como extremos geométricos.

### Parámetros de metadatos

| Parámetro      | Tipo    | Predeterminado | Descripción                                                                       |
| -------------- | ------- | -------------- | --------------------------------------------------------------------------------- |
| `stiffness`    | float   | `2.0`          | Fuerza de restauración hacia la pose de reposo. Rango: 0–4.                       |
| `gravityPower` | float   | `0`            | Magnitud de la fuerza de gravedad. Rango: 0–2.                                    |
| `gravityDir`   | vec3    | `[0, -1, 0]`   | Dirección de la gravedad en el espacio mundial.                                   |
| `drag`         | float   | `0.5`          | Factor de amortiguación / desaceleración. Rango: 0–1.                             |
| `isRoot`       | boolean | —              | Si este nodo es la raíz de una spring chain. Debe ser `true` para los root bones. |
| `center`       | string  | —              | Opcional. Nombre de un bone de referencia para el cálculo de inercia relativa.    |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-es/wearables-y-emotes/wearables/spring-bones.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
