Close
    Search Buscar

    Documentación de animación de Bedrock Edition

    Quien soy
    Joel Fulleda
    @joelfulleda
    Autor y referencias
    Esta característica es exclusiva de Bedrock Edition.  Este artículo es un trabajo en progreso.  Ayude en la expansión o creación de este artículo expandiéndolo o mejorándolo. La página de discusión puede contener sugerencias.

    Contenido

    • 1 controladores de animación
    • Estados 2
      • 2.1 Variables de estado
        • 2.1.1 Por ejemplo:
      • 2.2 Ejemplo de script definido por el usuario
        • 2.2.1 En la definiciónsentitytiger.json:
    • 3 transiciones de estado
    • Mezcla de 4 estados
    • 5 canales (rotación, posición, escala)
    • 6 ejemplos de formato de animación de entidad
    • 7 Primeros pasos
    • 8 Actualización de v1.7 Beta a v1.8
    • 9 Actualización de v1.8 Beta a v1.10
    • 10 Adición de animaciones
      • 10.1 Definición de entidad
      • 10.2 Controlador de animación
      • Animaciones 10.3
        • 10.3.1 Los datos de animación pueden ser datos sin procesar:
        • 10.3.2 o un script interpretado en tiempo de ejecución:
    • 11 Jerarquía de animación
      • 11.1 Cuadros clave
    • 12 Interpolación
    • Nombres 13
    • 14 general
    • 15 controladores de renderizado
    • 16 Primeros pasos
    • 17 Ejemplos
    • 18 transforma
    • 19

    Este es el documentación de animación para Bedrock Edition 1.16.210.



    Controladores de animación

    {"format_version": "1.10.0", "animation_controllers": {"controller.animation.sheep.move": {"states": {"default": {"animations": [{"walk": "consulta. modified_move_speed "}]," transitions ": [{" pastoreo ":" query.is_grazing "}]}," pastoreo ": {" animaciones ": [" pastoreo "]," transiciones ": [{" predeterminado ":" query.all_animations_finished "}]}}}}}





    A los estados

    Cada estado tiene una sección de variables opcionales, que enumera cualquier número de variables que las animaciones referenciadas pueden usar. Cada estado también tiene una o más animaciones, usando el nombre dado en la definición de la entidad json.

    Variables de estado

    Las variables tienen su valor establecido por una expresión de Molang. También pueden reasignar su valor a través de una curva interpolada linealmente.

    Por Ejemplo:

    el controlador de animación para ese fotograma. Tomará el valor de query.ground_speed, luego lo reasignará entre 0.2 y 0.7 basado en el valor de query.ground_speed que va desde 0.0 a 1.0. Reproducirá una caminata de animación que se combinará desde 0.0 a 1.0 a medida que la velocidad sobre el suelo aumenta de parada a 2.3 m / s. La curva de reasignación puede tener cualquier número de entradas. El controlador de animación luego reproducirá las animaciones wiggle_nose referenciadas a la entidad, seguidas de la animación de caminata, escalando esta última por el valor de variable.ground_speed_curve.

    {"format_version": "1.10.0", "animation_controllers": {"controller.animation.sheep.move": {"states": {"default": {"variables": {"ground_speed_curve": {"input" : "query.ground_speed", "remap_curve": {"0.0": 0.2, "1.0": 0.7}}}, "animaciones": ["wiggle_nose", {"walk": "variable.ground_speed_curve"}]}} }}}



    Ejemplo de secuencia de comandos definida por el usuario

    Nota: pre_animation le dice al script que averigüe los valores de esas variables una vez por cuadro, antes de que ocurra la animación, para que la animación pueda usar esos valores en sus propias fórmulas. Si una variable no existe, creará una nueva variable y su valor predeterminado será 0.0


    En definiciónsentitytiger.json:

    {"custom: tiger": {"scripts": {"pre_animation": {"variable.foo = math.sin (query.life_time)"}}}}

    desde 0 a -1 a 0 donde solo se reproducirá "base_pose" y luego una cantidad igual de tiempo donde Walk se reproducirá en la parte superior de base_pose a medida que foo pasa de 0 a 1 volver a 0. Base_pose tendrá un valor de mezcla de 1.0.

    "controller.animation.tiger.move": {"states": {"default": {"animations": [// las animaciones son ADITIVAS a menos que se especifique lo contrario // en este caso, base_pose siempre se reproducirá en el estado predeterminado / / walk también se reproducirá si Entity.foo es mayor que 0.0 "base_pose", {"walk": "variable.foo> 0.0"}]}}}

    Transiciones de estado

    Cada transición tiene un estado de destino al que cambiar y una secuencia de comandos que indica si debe cambiar o no. Para cada transición en orden, evalúe el script y, si devuelve un valor distinto de cero, cambie al estado especificado de inmediato.


    NOTA: Solo se procesará una transición por fotograma.

    " ": {" estados ": {" ": {" transitions ": [// Evalúe las siguientes expresiones en orden. // El primero en devolver un valor distinto de cero es el estado al que se realizará la transición. // Si todos son cero, entonces no realice la transición. {" "," "}, {" "," "},]}}}

    Por ejemplo:

    "controller.animation.tiger.move": {"states": {"default": {"animations": ["base_pose", "walk"], "transitions": [{"angry": "query.is_angry" }, // transición al estado de enojo si query.is_angry devuelve verdadero {"cansado": "variable.is_tired"} // transición al estado de cansancio si variable.is_tired devuelve verdadero]}, "enojado": {"animaciones": [ "roar", "extend_claws"], "transitions": [{"default": "query.any_animation_finished"} // regresa al estado predeterminado cuando finaliza la animación de rugido o extend_claws]}, "cansado": {" animaciones ": [" bostezo "," estiramiento "]," transiciones ": [{" predeterminado ":" query.all_animation_finished "} // transición de regreso al estado predeterminado cuando las animaciones de bostezo y estiramiento hayan terminado]}}}


    Mezcla de estado

    hasta el tiempo que le gustaría que el sistema tardara en fusionar los dos estados. Esto se hace como un simple lerp entre los dos estados durante el tiempo especificado.

    Por ejemplo:

    "controller.animation.tiger.move": {"states": {"default": {"animations": ["base_pose", "walk"], "transitions": [{"angry": "query.is_angry" } // transición al estado enojado si query.is_angry devuelve verdadero], "blend_transition": 0.2 // cuando se sale de este estado, se desvanece en 0.2 segundos}, "enojado": {"animaciones": ["rugido" , "extend_claws"], "transitions": [{"default": "query.any_animation_finished"} // regresa al estado predeterminado cuando finaliza la animación de rugido o extend_claws]}}}

    Canales (rotación, posición, escala)

    El motor rastrea la animación de rotación, posición y escala por separado. Dentro de un canal, se especifican uno o más fotogramas clave en momentos arbitrarios, en segundos, desde el inicio de la animación. Si no se especifican fotogramas clave, se crea un único fotograma clave en t = 0.0 y todos los datos del canal se almacenan dentro de ese fotograma clave.

    Ejemplos de formato de animación de entidad

    El formato json para una animación es el siguiente. Nota Al coincidir con el formato de geometría, las unidades están en 1/16 de metros.


    " ": {//" bucle "opcional: // predeterminado = falso. ¿Debería la animación volver a t = 0.0 cuando termine? "peso_mezcla": // predeterminado = "1.0". Cuánto se mezcla esta animación con las demás. 0.0 = apagado. 1.0 = aplicar completamente todas las transformaciones. Puede ser una expresión; consulte la sección Controlador de animación debajo de "animation_length": // predeterminado = hora del último fotograma clave. ¿A qué hora considera el sistema finalizada esta animación? "override_previous_animation": // predeterminado = falso. ¿Debería establecerse la pose de animación del hueso en la pose de enlace antes de aplicar esta animación, anulando así las animaciones anteriores hasta este punto?

    Empezar

    Actualice de v1.7 Beta a v1.8

    Para actualizar las secuencias de comandos anteriores, querrá realizar los siguientes pasos en todas sus secuencias de comandos de Molang en el orden indicado:

    1. entity.flags.foo -> query.foo
    2. entity.member.foo -> query.foo
    3. entidad.foo -> variable.foo
    4. params.foo -> global.foo
    5. La regla general es que la consulta representa valores de solo lectura de la entidad en la que se ejecuta el script, y la variable representa los datos de lectura y escritura creados por el usuario.
    6. Hemos adoptado snake_case para todos los nombres de las cosas. Puede utilizar letras mayúsculas si lo desea, ya que no distingue entre mayúsculas y minúsculas, sin embargo, recomendamos snake_case en general.
    7. Varias variables previamente configuradas en mobs se han cambiado para usar el formato query.foo. Mire la lista actualizada a continuación para ver qué se ha agregado y cambiado.

    Actualice de v1.8 Beta a v1.10

    • la capacidad de hacer que las animaciones hagan referencia a otras animaciones en una jerarquía arbitrariamente profunda.
    • la sección de parámetros de los controladores de animación ha sido reemplazada por la sección de variables.
    • En el archivo de definición de entidad, los controladores de animación ahora se enumeran en la sección de animaciones, y se ha agregado una sección de scripts / animaciones para definir qué animaciones raíz reproducir.

    El formato de archivo v1.8 es compatible con versiones anteriores con v1.10, por lo que no _necesita_ cambiar nada (aunque recomendamos refactorizar sus archivos en el espíritu de v1.10 ya que hay una ligera ganancia de rendimiento con el nuevo formato, ya que además de ser más sencillo de entender.

    Agregar animaciones

    Definición de entidad

    {"format_version": "1.10.0", "minecraft: client_entity": {"description": {"identifier": "minecraft: pig", "min_engine_version": "1.8.0", "materiales": {"predeterminado ":" cerdo "}," texturas ": {" predeterminado ":" texturas / entidad / cerdo / cerdo "," ensillado ":" texturas / entidad / cerdo / cerdo_saddle "}," geometría ": {" predeterminado ": "geometry.pig.v1.8"}, "animations": {"setup": "animation.pig.setup", "walk": "animation.quadruped.walk", "look_at_target": "animation.common.look_at_target "," baby_transform ":" animation.pig.baby_transform "}," scripts ": {" animate ": [" setup ", {" walk ":" query.modified_move_speed "}," look_at_target ", {" baby_transform ": "query.is_baby"}]}, "render_controllers": ["controller.render.pig"], "spawn_egg": {"texture": "spawn_egg", "texture_index": 2}}}}


    Esto significa que tampoco verá la animación de movimiento en el archivo de animación pig.json. Si desea hacer una caminata de cerdo personalizada, puede cambiar esta línea para que apunte a su animación personalizada.
    Las animaciones se especifican como un nombre corto, seguido de su nombre de recurso completo. El nombre corto se usa en los controladores de animación y la lista de scripts / animada, mientras que el nombre largo se usa en el archivo de animaciones.
    En la sección `scripts / animate`, enumeras las animaciones para reproducir y en qué orden. Puede especificar una animación directamente o especificar una expresión de mezcla.

    Controlador de animación

    Si bien mucho de esto se puede administrar en la sección de animación / scripts de definición de entidad, los controladores de animación le brindan la funcionalidad de una máquina de estado en estados y los controlan como un bloque. Las animaciones en un estado de controlador de animación pueden ser ellos mismos controladores de animación, lo que permite jerarquías de animación arbitrariamente complejas.

    Aquí hay un controlador de animación de muestra:

    {"format_version": "1.10.0", "animation_controllers": {"controller.animation.my_mob.move": {"initial_state": "moviendo", "estados": {"moviendo": {"animaciones": [ "wag_tail", "wiggle_ears", {"walk": "query.modified_move_speed"}], "transitions": [{"pastoreo": "query.is_grazing"}]}, "pastoreo": {"animaciones": [ "pastoreo"], "transiciones": [{"en movimiento": "query.all_animations_finished"}]}}}}}

    animaciones

    Tenga en cuenta que los canales (x, y y z) se agregan por separado en las animaciones primero, luego se convierten en una transformación una vez que todas las animaciones se han aplicado de forma acumulativa.

    Los datos de animación pueden ser datos sin procesar:

    De forma predeterminada, las rotaciones están en grados, en formato euler X-then-Y-then-Z

    o un script interpretado en tiempo de ejecución:

    "rotación": ["cos (query.anim_pos * 38.17) * 80.0 * query.anim_speed", 0.0, 0.0]


    Aquí hay un ejemplo de quadruped.animation.json en la carpeta de animación del paquete de recursos vanilla:

    {"format_version": "1.8.0", "animations": {"animation.quadruped.walk": {"anim_time_update": "query.modified_distance_moved", "loop": true, "bones": {"leg0": {"rotación": ["Math.cos (query.anim_time * 38.17) * 80.0", 0.0, 0.0]}, "leg1": {"rotación": ["Math.cos (query.anim_time * 38.17) * - 80.0 ", 0.0, 0.0]}," leg2 ": {" rotación ": [" Math.cos (query.anim_time * 38.17) * -80.0 ", 0.0, 0.0]}," leg3 ": {" rotación ": ["Math.cos (query.anim_time * 38.17) * 80.0", 0.0, 0.0]}}}}}

    Jerarquía de animación

    Marcos clave

    Un fotograma clave define dos valores para una transformación específica del canal en un hueso específico en un momento específico, uno cuando el tiempo se acerca al tiempo del fotograma clave y el segundo a partir de ese momento del fotograma clave en adelante.
    Como tal, al interpolar entre dos fotogramas clave, se puede definir la pendiente de la curva de animación de forma continua o discontinua.

    Interpolación

    Ejemplo continuo

    "cabeza": {"rotación": {"0.0": [0, 0, 0], "0.5": [0, 180, 0], "1.0": [0, 360, 0]}}


    Ejemplo discontinuo

    Este ejemplo escala la "cabeza" del hueso:

    1. Desde 0 a 0.5 segundos, el hueso de la cabeza se ajusta a su escala normal de 1 en todas las dimensiones [X, Y, Z];
    2. At 0.5 segundos, el hueso se escalará instantáneamente hasta 2 veces su tamaño normal;
    3. Desde 0.5 a 1 segundo ("poste"), el hueso volverá a escalar a su tamaño normal de escala de 1 en todas las dimensiones.

    Nota: En el ejemplo más grande anterior del formato de archivo, "pre" y "post" también se pueden definir mediante una expresión de Molang que calcula ese valor en tiempo de ejecución, lo que le permite tener una curva definida matemáticamente en lugar de ser puramente lineal.

    "head": {"scale": {"0.5": {"pre": [1, 1, 1], "post": 2.0} "1.0": [1.0]}}

    nombres

    Todos los nombres: animaciones, huesos, estados, etc., deben comenzar con una letra y contener solo alfanuméricos, subrayado o punto. Se recomienda utilizar nombres en minúsculas.

    Visión General

    A continuación, se muestran los paradigmas JSON actuales de Minecraft:

    • Los campos deben estar en minúsculas y usar guiones bajos (sin espacios).
    • Todos los archivos JSON en el directorio de definiciones y el subárbol serán leídos e interpretados por el sistema de animación.

    Controladores de renderizado

    El controlador de renderizado necesita un identificador y debe seguir el formato de controller.render. . Este nombre debe coincidir con el nombre establecido en el JSON de definiciones de entidad cliente.

    Los controladores de renderizado son una forma para que el jugador determine qué renderiza en la entidad. Los jugadores pueden establecer la geometría, los materiales, las texturas y la visibilidad de la parte de la entidad. Además de configurar las claves directamente, los jugadores pueden usar matrices para que la entidad elija entre diferentes opciones.

    Empezar

    Para comenzar a crear una nueva carpeta llamada render_controllers en la raíz del paquete de recursos, desea agregar el nuevo Render Controller JSON dentro.

    Ejemplo de controladores de renderizado JSON para el ocelote:

    "format_version": "1.8.0", "render_controllers": {"controller.render.ocelot": {"arrays": {"textures": {"Array.skins": ["Texture.wild", "Texture. negro "," Texture.red "," Texture.siamés "]}}," geometría ":" Geometry.default "," materiales ": [{" * ":" Material.default "}]," texturas ": ["Array.skins [query.variant]"]}}

    Ejemplos

    Ejemplo de matriz para geometría del JSON de oveja:

    "matrices": {"geometrías": {"Array.geos": ["Geometry.default", "Geometry.sheared"]}}, "geometry": "Array.geos [query.is_sheared]",

    Ejemplo de matriz para materiales del JSON araña:

    "arrays": {"materials": {"Array.materials": ["Material.default", "Material.invisible"]}}, "materials": [{"*": "Array.materials [query.is_invisible ] "}],

    Ejemplo de matriz para texturas del JSON del aldeano:

    "arrays": {"textures": {"Array.skins": ["Texture.farmer", "Texture.librarian", "Texture.priest", "Texture.smith", "Texture.butcher"]}}, "texturas": ["Array.skins [query.variant]"]

    Ejemplo con color para teñir partes de Armor 1.0, controlador de renderizado JSON:

    "format_version": "1.8.0", "render_controllers": {"controller.render.armor.chest.v1.0": {"arrays": {"materials": {"array.armor_material": ["material. armour "," material.armor_enchanted "," material.armor_leather "," material.armor_leather_enchanted "]}," textures ": {" array.armor_texture ": [" texture.leather "," texture.chain "," texture. iron "," texture.diamond "," texture.gold "]}}," geometry ":" geometry.armor "," materiales ": [{" body ":" array.armor_material [query.armor_material_slot (1)] "}, {" leftarm ":" array.armor_material [query.armor_material_slot (1)] "}, {" rightarm ":" array.armor_material [query.armor_material_slot (1)] "}]," part_visibility ": [{ "*": 0}, {"body": "query.has_armor_slot (1)"}, {"leftarm": "query.has_armor_slot (1)"}, {"rightarm": "query.has_armor_slot (1)" }], "color": {"r": "query.armor_color_slot (1, 0)", "g": "query.armor_color_slot (1, 1)", "b": "query.armor_color_slot (1, 2 ) "," a ":" query.armor_color_slot (1, 3) "}," texturas ": [" array.armor_texture [quer y.armor_texture_slot (1)] "," texture.enchanted "]}}

    Ejemplo con is_hurt_color del controlador de renderizado Creeper JSON:

    "format_version": "1.8.0", "render_controllers": {"controller.render.creeper": {"geometry": "Geometry.default", "materials": [{"*": "Material.default"} ], "texturas": "Texture.default", "is_hurt_color": {"r": 0.0, "g": 0.0, "b": 1.0, "a": 0.5,}}}

    Ejemplo con on_fire_color del controlador de renderizado Fireball JSON:

    "format_version": "1.8.0", "render_controllers": {"controller.render.fireball": {"geometry": "Geometry.default", "materials": [{"*": "Material.default"} ], "texturas": "Texture.default", "on_fire_color": {"r": 0.0, "g": 0.0, "b": 0.0, "a": 0.0,}}}

    Ejemplo con overlay_color del controlador de renderizado JSON de Wither Boss:

    "format_version": "1.8.0", "render_controllers": {"controller.render.wither_boss": {"arrays": {"textures": {"Array.wither_state": ["Texture.invulnerable", "Texture. predeterminado "]}}," geometría ":" Geometry.default "," materiales ": [{" * ":" Material.default "}]," texturas ": [" Array.wither_state [variable.display_normal_skin] "] , "overlay_color": {"r": "variable.is_invulnerable? 1.0: this", "g": "variable.is_invulnerable? 1.0: this", "b": "variable.is_invulnerable? 1.0: this", "a ":" variable.is_invulnerable? query.overlay_alpha: this "}}}

    Ejemplo con part_visibility para activar y desactivar la visibilidad de piezas de Llama JSON:

    "format_version": "1.8.0", "render_controllers": {"controller.render.llama": {"arrays": {"textures": {"Array.base": ["Texture.creamy", "Texture. white "," Texture.brown "," Texture.gray "]," Array.decor ": [" Texture.decor_none "," Texture.decor_white "," Texture.decor_orange "," Texture.decor_magenta "," Textura. decor_light_blue "," Texture.decor_yellow "," Texture.decor_lime "," Texture.decor_pink "," Texture.decor_gray "," Texture.decor_silver "," Texture.decor_cyan "," Texture.decor_purple "," Texture.decor_blue " , "Texture.decor_brown", "Texture.decor_green", "Texture.decor_red", "Texture.decor_black"]}}, "geometry": "Geometry.default", "part_visibility": [{"pecho *": " query.is_chested "}]," materiales ": [{" * ":" Material.default "}]," texturas ": [" Array.base [query.variant] "," Array.decor [variable.decor_texture_index] "," Texture.decor_none "]}}


    Ejemplo de matriz de materiales de los controladores de renderizado Horse. Saddle anulará a Mane, que anulará TailA, etc .:

    "materials": [{"*": "Material.default"}, {"TailA": "Material.horse_hair"}, {"Mane": "Material.horse_hair"}, {"* Saddle *": "Material .horse_saddle "}],


    Transforma

    • Orden de las operaciones: los vértices se trasladan, rotan y luego se escalan.
    • Se supone que los datos de animación son jerárquicos y se aplican a un hueso por nombre que coincida con el nombre del hueso en los datos de animación con el esqueleto de la geometría de destino.
    • No es necesario animar todos los huesos.
    • Puede animar huesos que no existen en la geometría de destino (los huesos que faltan se ignoran).
    • Para cada escala, rotación, posición, se pueden configurar los campos de forma individual o uniforme con un solo valor. Por ejemplo, estos son equivalentes.

    "escala": [2.0, 2.0, 2.0] "escala": 2.0 "escala": [2.0]

    • Añadir
    • Directrices para creadores de Bedrock Edition
    • Documentación adicional de Bedrock Edition
    • Documentación de componentes de entidad de Bedrock Edition
    • Documentación de eventos de entidad de Bedrock Edition
    • Documentación de partículas Bedrock Edition
    • Documentación de secuencias de comandos de Bedrock Edition
    • Documentación de Bedrock Edition MoLang
    • Documentación de la interfaz de usuario de Bedrock Edition
    • Documentación de esquemas de Bedrock Edition


    Añade un comentario de Documentación de animación de Bedrock Edition
    ¡Comentario enviado con éxito! Lo revisaremos en las próximas horas.