Notas de creación de modelos de FreeMinecraftModels
Estas notas describen los archivos de modelo, sus archivos complementarios y los nombres que FreeMinecraftModels lee durante la importación y la ejecución.
Formatos de origen
FreeMinecraftModels actualmente acepta:
- archivos
.bbmodelpara importaciones de fuente editable - archivos
.fmmodelpara datos de modelo listos para runtime
Para un .bbmodel suelto sin archivos complementarios:
- colócalo directamente en
plugins/FreeMinecraftModels/imports, con la extensión.bbmodelen minúsculas - ejecutar
/fmm reload - comprueba que su conversión
.fmmodelaparezca en la carpeta de modelos activa y que la recarga termine correctamente
El importador de archivos sueltos deja el original en imports, por lo que las siguientes importaciones lo convierten otra vez. No recoge archivos .json o .yml complementarios sueltos ni acepta un .fmmodel suelto. Para conjuntos de modelos creados por ti, guarda los modelos y sus complementos juntos en la carpeta models activa o usa un paquete de contenido con la estructura correcta. Se omiten las subcarpetas de imports que no tengan pack.meta. Una recarga rechazada puede dejar activo el catálogo anterior; revisa la consola.
La conversión de archivos sueltos conserva únicamente source, id y name de las texturas y descarta los metadatos de dimensiones y tiempos de animación. También requiere un array textures. Si necesitas conservar esos metadatos, usa la carpeta de modelos activa o un paquete que preserve el archivo original; el lector de modelos en ejecución sí acepta la ausencia del array de texturas.
Función de las carpetas
plugins/FreeMinecraftModels/imports
plugins/FreeMinecraftModels/models
plugins/FreeMinecraftModels/models_disabled
importses la carpeta de recepción para importaciones manuales de modelos y descargas de paquetes oficiales antes del procesamientomodelscontiene contenido de modelos activos instaladosmodels_disabledcontiene contenido de paquetes descargados o instalados que está actualmente desactivado
Las instalaciones antiguas pueden tener una carpeta Models con mayúscula inicial. FreeMinecraftModels prefiere models en minúsculas si existe y usa Models en caso contrario. En un sistema de archivos que no distingue mayúsculas, ambos nombres corresponden al mismo directorio. En uno que sí las distingue pueden coexistir, y el importador compartido de paquetes prefiere actualmente un destino Models existente mientras el motor lee models en minúsculas. Haz una copia de seguridad y unifica el contenido en models con el servidor detenido para evitar que las importaciones acaben fuera de la carpeta activa.
ID de modelos
- Los IDs de modelo del runtime provienen del nombre del archivo, sin la extensión
.bbmodelo.fmmodel - Usa nombres de archivo estables y únicos porque el ID es lo que los comandos y las llamadas API resuelven
- Las referencias de animación de Blockbench son basadas en nombre, por lo que la nomenclatura duplicada o poco clara dentro del modelo es más propensa a causar problemas que un esquema de nomenclatura limpio y explícito
- La lectura de extensiones en la carpeta de modelos activa no distingue mayúsculas, por lo que acepta
.BBModely.FMModel. La importación de archivos sueltos desdeimportssolo reconoce.bbmodelen minúsculas
Normalización de ID y colisiones
El nombre del archivo se normaliza antes de convertirse en el ID de modelo del runtime y en el nombre de archivo del resource pack:
- se pasa a minúsculas
- cada carácter fuera de
a-z,0-9,.,_y-se reemplaza por_
Así que My Table.bbmodel, my table.bbmodel y my_table.bbmodel se normalizan todos al mismo ID, my_table.
Antes de ejecutar cualquier conversión, FreeMinecraftModels barre todo el árbol de modelos y comprueba si hay archivos que se normalicen al mismo ID. Cuando todos los archivos con ese ID son idénticos byte a byte, como ocurre cuando dos paquetes de contenido distribuyen el mismo modelo, FMM carga aquel cuya ruta absoluta va primero en orden y omite las copias sin aviso. Cuando los archivos difieren:
- se rechazan todos los archivos en conflicto — no se carga ninguno, así que no hay un silencioso "gana el último"
- el ID de modelo queda bloqueado durante el resto de esa pasada de carga
- los modelos rechazados también se excluyen de la exportación del paquete de entidades personalizadas de Bedrock
- la consola recibe:
[FMM Models] Rejected normalized model ID collision '<id>'. These files normalize to the same ID: <paths>. Rename the files so every normalized model ID is unique; no colliding model was loaded.
La solución es siempre renombrar los archivos para que los IDs normalizados sean distintos. La costumbre más segura es nombrar los archivos de modelo en minúsculas y con guiones bajos desde el principio (stone_table.bbmodel), lo que hace que el nombre de archivo y el ID del runtime sean idénticos y elimina cualquier posibilidad de una colisión sorpresa.
Compatibilidad con Blockbench
- FreeMinecraftModels lee
meta.format_versiondel.bbmodely se ramifica según su número mayor - Un bloque
metaausente, unformat_versionausente o un valor que no se puede analizar recaen todos en la versión4, con una línea de info/advertencia que indica el modelo - Un array
texturesausente se acepta y se trata como una lista de texturas vacía en lugar de hacer fallar al importador. El exportador de entidades personalizadas de Bedrock omite entonces ese modelo, porque la exportación a Bedrock requiere al menos una textura - Los nombres de archivo de textura extraídos se normalizan a una única extensión
.png. Un nombre de origen comobody.jpg,body.PNGobodyse escribe y se referencia comobody.png format_version4.xy anteriores: los huesos se leen directamente del árboloutliner, que lleva los nombres de hueso en líneaformat_version5.xy posteriores: el esquema del outliner cambió.outlineres ahora un árbol anidado de cadenas UUID sueltas y diccionarios{uuid, isOpen, children}sin ninguna clave de nombre, mientras que un array planogroupsaparte contiene los datos reales de los huesos (incluidoname). FMM une ambos por UUID — cada nodo del outliner se reemplaza por su entrada correspondiente engroups, y luego los hijos se fusionan recursivamente — de modo que los nombres, orígenes y rotaciones de los huesos se resuelven con normalidad- Consecuencias que conviene conocer al editar a mano o generar archivos
.bbmodel:- Un archivo v5 sin el array
groupsse pasa sin fusionar. Un outliner ya fusionado puede funcionar; los nodos de grupo v5 sin nombre pueden hacer fallar la carga cuando el lector del esqueleto espera un nombre - Los UUID deben coincidir exactamente entre
outlinerygroups; un nodo del outliner sin grupo correspondiente se conserva tal cual en lugar de descartarse - No mezcles un
format_versionv5 con un outliner con forma v4, ni al revés — la rama se elige a partir de la versión declarada, no de la forma real
- Un archivo v5 sin el array
- Si los registros de importación dicen que el formato del modelo no es compatible con FreeMinecraftModels, trata eso como un problema de formato del modelo primero, no como un problema de wiki o de comandos
Convenciones de huesos que afectan a la ejecución
El conversor actual y el sistema del esqueleto reconocen estas convenciones de nombres:
hitbox- reservado para generar la caja de colisión
- debe definir claramente la caja de colisión del modelo, sin usarse como hueso visual
- debe ser un hueso de nivel superior del outliner para definir la colisión durante la ejecución. Un
hitboxanidado pasa por el análisis de huesos ordinario, pero permanece oculto y no define la caja de colisión del modelo - debe contener exactamente un cubo, que define el ancho (x), la profundidad (z) y la altura (y). Los cubos adicionales registran
has more than one value defining a hitbox! Only the first cube will be used. Un grupo vacío registrahas a hitbox bone but no hitbox cube!y deja dimensiones cero; no equivale a la ausencia de hitbox. Los desplazamientos y las rotaciones del cubo no se convierten en un desplazamiento de la caja: el lector usa longitudes absolutas de los lados y un desplazamiento de modelo cero - nunca se anima (se omiten las pistas dirigidas a
hitbox), nunca se renderiza y se excluye de la exportación de geometría de Bedrock. En Bedrock, un modelo sin este hueso usa1.0x2.0
tag_...- anclaje opcional de etiqueta de nombre definido en el modelo. Consulta Posición de la etiqueta de nombre más abajo
h_...- se tratan como huesos de cabeza
b_...- huesos sin visualización en Java. Usa huesos sin cubos para la estructura: la exportación de geometría Bedrock no filtra el prefijo
b_, por lo que sus cubos pueden seguir siendo visibles allí
- huesos sin visualización en Java. Usa huesos sin cubos para la estructura: la exportación de geometría Bedrock no filtra el prefijo
m_...- huesos de punto de montaje. Cada hueso con este prefijo crea un asiento para un jugador, gestionado por
MountPointManager. Varios huesosm_crean varios asientos. El gestor elige el primer asiento libre y usa una entidad Interaction temporal mientras está ocupado; su método público de montaje acepta jugadores, no entidades arbitrarias.
- huesos de punto de montaje. Cada hueso con este prefijo crea un asiento para un jugador, gestionado por
Los prefijos distinguen mayúsculas; el nombre hitbox se compara sin distinguirlas. Estos nombres afectan a la conversión y al comportamiento durante la ejecución.
Posición de la etiqueta de nombre
El hueso tag_ ahora es opcional. FMM usa el primer hueso tag_ en orden alfabético como anclaje de la etiqueta del modelo. Si no existe ninguno, coloca la etiqueta sobre la caja de colisión escalada, por lo que un modelo sin ese hueso puede mostrar su nombre.
Usa un hueso tag_name sin cubos cuando la posición automática no sea adecuada. Tener varios huesos de etiqueta ya no produce varias copias del mismo nombre.
La API admite nombres de varias líneas, escala, separación entre líneas y visibilidad. Las líneas se ordenan de arriba abajo, con la última en el anclaje. Consulta la guía de la API.
Sombreado de cubos y emisión de luz
- El valor
light_emissionde un cubo en Blockbench se conserva cuando es un número entero de0a15. Cualquier otro valor se descarta con un aviso de consola que termina enwith invalid light_emission. Expected an integer from 0 to 15; ignoring this value. - Un cubo con el sombreado desactivado (
shade: false) recibe ademásshade_direction_override: "up"en la geometría generada, para que los clientes de Minecraft 26.3 lo rendericen sin sombreado igual que los clientes anteriores. FMM aplica la misma regla a los cubos de un.jsonde modelo de visualización hermano. Si estableces tú mismo el valor, se conserva
Cubos sueltos
Los cubos declarados en la parte superior del outliner sin un grupo contenedor llegan como cadenas UUID sueltas en lugar de como entradas de hueso. FreeMinecraftModels los adjunta al hueso raíz autogenerado (freeminecraftmodels_autogenerated_root) para que se sigan renderizando. No son direccionables desde las animaciones, así que pon dentro de un grupo real cualquier cosa que pienses animar.
IK, Objetos Nulos y Locators
El código actual confirma soporte para:
- objetos nulos de Blockbench como controladores IK
- blueprints de cadenas IK y resolución IK en runtime (FABRIK)
- análisis de locators. Los locators también pueden servir de anclaje para efectos de partículas de Blockbench; consulta Partículas
Un objeto nulo solo se convierte en controlador IK cuando su entrada .bbmodel contiene tanto ik_source (hueso de origen) como ik_target (hueso o locator de destino). El importador busca en la jerarquía, incluidos recorridos entre hermanos y descendentes. Los hermanos de nivel raíz producen una cadena con solo el origen. lock_ik_target_rotation se lee y se guarda, pero el solucionador actual no lo aplica.
Restricciones prácticas importantes:
- El enlace origen/objetivo es por UUID, así que sobrevive a los renombrados — pero si alguno de los dos UUID falta en el modelo, la consola registra
IK chain in model <model>: Could not find source bone with UUID .../Could not find target with UUID ...y esa cadena se omite - Si el recorrido no encuentra ningún camino del origen al objetivo, obtienes
Could not find path from source to targety la cadena se omite - La búsqueda de animaciones de un controlador es basada en nombre, por lo que la nomenclatura del controlador necesita mantenerse estable entre la estructura del modelo y los datos de animación
- Solo los fotogramas clave de posición controlan la IK. Su desplazamiento se suma a la posición de reposo del hueso o locator de destino, no a la posición de reposo guardada del controlador. Las pistas de rotación y escala no controlan la IK
Consulta Animaciones para saber cómo se controla la IK en cada frame.
División de salida 1.21.4+
FreeMinecraftModels declara api-version: 1.21.4, así que 1.21.4 es la versión mínima de servidor y la distribución moderna de definiciones de modelos de ítems es la que siempre obtendrás:
plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/items
En el código todavía existen las ramas heredadas (anteriores a 1.21.4) de overrides de armadura de caballo de cuero, pero ningún servidor capaz de cargar el plugin actual llega hasta ellas. Si estás leyendo notas antiguas o una carpeta de salida antigua, esa es la diferencia que estás viendo.
JSON de modelo de visualización (1.21.4+)
Los administradores pueden colocar un archivo .json hermano junto a un archivo .bbmodel o .fmmodel con el mismo nombre base (por ejemplo, table.bbmodel + table.json). Este JSON debe exportarse desde Blockbench como un modelo "Java Block/Item" y define cómo se ve el ítem cuando se sostiene en la mano o se muestra en el inventario.
FMM lee el JSON junto al archivo de modelo activo, lo copia al paquete de recursos y reescribe los valores sin espacio de nombres de su mapa textures. Las claves numéricas de textura corresponden a los índices de las texturas extraídas del modelo; una clave sin coincidencia usa una textura disponible si existe. Los valores con espacio de nombres no cambian. Si no hay JSON junto al modelo, el objeto usa la apariencia de su material base: normalmente papel para colocar un elemento decorativo, o el material configurado para un objeto que se sostiene. Un complemento mal formado registra Failed to process display model JSON for ... y no registra ese modelo de visualización.
Configuración de objetos personalizados en YML
Establece material en el YAML situado junto al modelo para registrar un objeto que se puede sostener:
isEnabled: true
material: DIAMOND_SWORD
name: "&6Flame Blade"
lore:
- "&7A blade with a fire enchantment"
enchantments:
- "minecraft:fire_aspect,2"
Usa ID de encantamientos en minúsculas con espacio de nombres. Los materiales de cuero aceptan un sufijo de tinte RGB, como LEATHER_CHESTPLATE:ff8800; consulta Configuración. Los objetos con materiales no compatibles, encantamientos sin espacio de nombres o una lista scripts: no vacía no estarán disponibles; la consola explica el motivo y se conserva el archivo original. scripts: sigue siendo una función exclusiva de elementos decorativos.
Otras definiciones inválidas, como un isEnabled no booleano, entradas de encantamiento mal formadas, encantamientos duplicados o un nombre de archivo de objeto inválido, pueden rechazar el catálogo candidato y la recarga. Usa nombres de archivo de objetos en minúsculas con solo a-z, 0-9, ., _ y -, de hasta 128 caracteres. La búsqueda de objetos creados lee .yml, no .yaml. Obtén un objeto registrado con /fmm giveitem <item> o el navegador de administración; las recetas de elementos decorativos y las compras en la tienda producen objetos de papel para colocarlos.
Los efectos de objetos ahora pertenecen a definiciones de encantamientos. Las varitas y los bastones usan configuración de armas mágicas. Ninguno usa el antiguo sistema Lua de objetos equipados.
Notas sobre Bedrock y las rutas de renderizado
- El soporte de Bedrock depende de
sendCustomModelsToBedrockClientsV2(por defectotrue; sustituye a la clave anteriorsendCustomModelsToBedrockClients) y la ruta circundante de Floodgate/Geyser/resource pack - Los clientes Java en versiones soportadas pueden usar renderizado con display entities cuando
useDisplayEntitiesWhenPossibleestá activado - No asumas que un modelo que se ve correcto en un cliente Java es automáticamente seguro para tu ruta de Bedrock
Consejos prácticos de creación
- mantén los nombres de archivo estables porque se convierten en IDs del runtime
- mantén la nomenclatura de controladores y animaciones explícita porque la búsqueda de animaciones de Blockbench es dirigida por nombre
- usa intencionalmente los nombres reservados de huesos virtuales (
hitbox,tag_,h_,b_,m_). Añade un anclajetag_solo cuando la posición automática de la etiqueta sobre la caja de colisión no sea adecuada - usa
spawn,idle,walk,attackydeathen minúsculas para los estados compartidos; ataque y muerte siguen necesitando que se activen durante la ejecución, y otros nombres requieren reproducción explícita (consulta Animaciones) - un modelo pensado para
/fmm disguisedebería incluir al menosidle, y puede añadirsneakyjump, que solo reconoce el controlador de disfraces (consulta Disfraces de Jugador) - valida la salida importada después de
/fmm reload, no solo dentro de Blockbench - verifica el contenido del paquete generado para tu línea objetivo de Minecraft, especialmente en
1.21.4+
Modelos de estado de arco y ballesta
FMM detecta automáticamente los estados visuales de arcos y ballestas durante la generación del paquete. Cada estado obligatorio necesita tanto un archivo de modelo cargado como un .json de visualización complementario procesado correctamente; los nombres de archivo por sí solos no bastan. Configura el objeto con su nombre base y el material BOW o CROSSBOW correspondiente.
Convención de nombres
| Sufijo | Propósito | Arco | Ballesta |
|---|---|---|---|
_idle | Ítem en mano, sin tensar ni cargado | requerido | requerido |
_draw_start | Recién comenzó a tensar | requerido | requerido |
_draw_half | Tensado a la mitad | requerido | requerido |
_draw_full | Completamente tensado | requerido | requerido |
_charged | Ballesta cargada (flecha o cohete) | -- | requerido |
Un arco necesita cuatro modelos (todos excepto _charged). Una ballesta necesita los cinco.
Ejemplo de distribución de archivos
plugins/FreeMinecraftModels/models/my_weapons/
cool_bow_idle.bbmodel
cool_bow_idle.json
cool_bow_draw_start.bbmodel
cool_bow_draw_start.json
cool_bow_draw_half.bbmodel
cool_bow_draw_half.json
cool_bow_draw_full.bbmodel
cool_bow_draw_full.json
cool_bow.yml
Para una ballesta, añade también cool_bow_charged.bbmodel y cool_bow_charged.json. La configuración del objeto es cool_bow.yml, con el nombre base sin _idle.
Cómo funciona la detección
- La detección ocurre automáticamente cuando se genera el resource pack (al iniciar o con
/fmm reload). - Un conjunto completo de estados visuales obtiene una definición de objeto pública con el nombre base, como
cool_bow.json. Las definiciones de objeto individuales de_idle, tensado y cargado se eliminan; su geometría sigue referenciada dentro de la definición base - El registro de visualización expone el ID base y elimina los ID de estado. Un conjunto completo con
_chargedse trata como ballesta; sin él, como arco. Si faltan estados visuales, no se agrupan - Usa el nombre base para la configuración YML, por ejemplo
cool_bow.yml. El catálogo de objetos omite los archivos YML con sufijos de estado; la búsqueda de configuración de elementos decorativos también elimina el sufijo
JSON del modelo de visualización
Cada estado obligatorio debe tener su propio .json de visualización complementario, como cool_bow_idle.json y cool_bow_draw_full.json. FMM los conecta mediante la definición de objeto base generada. Consulta Salida del paquete de recursos para conocer sus condiciones y ruta de salida.
Fuera de alcance
Esta página no intenta garantizar:
- pasos exactos de la interfaz de Blockbench
- preferencias artísticas de flujo de trabajo
- cada peculiaridad heredada de
.bbmodeldescrita en material README local más antiguo
Esos detalles cambian más rápido que el contrato de runtime verificado anterior.