《从零开始:我的世界JSON模型动画完全指南》
在《我的世界》的模组开发与资源包创作中,自定义模型动画是让生物、物品或机械“活”起来的关键,而JSON模型动画(基于animations.json文件)正是实现这一功能的底层技术,本文将从基础概念到实战案例,带你一步步JSON模型动画的编写方法。
JSON模型动画的核心概念
在《我的世界》中,传统模型(如.json格式)定义了模型的静态结构,而动画则通过animations.json文件动态控制模型的骨骼、部件运动,其核心逻辑是:通过时间轴上的关键帧数据,改变模型中特定骨骼的旋转(rotation)、位移(position)或缩放(scale)。
- 骨骼(Bone):模型中的可动部件(如生物的腿、手臂,或机械的齿轮),每个骨骼有唯一的名称。
- 关键帧(Keyframe):在特定时间点(如
1t)对骨骼属性的设定,动画引擎会自动插值生成中间帧。 - 动画控制器(Animation Controller):控制动画的播放、切换(如“闲置”“行走”“攻击”等状态)。
准备工作:模型与骨骼的绑定
在编写动画前,确保你的模型已正确设置骨骼,以生物模型为例,使用Blockbench等建模软件创建模型时,需为可动部件(如“left_leg”“right_arm”)添加骨骼,并导出为.geo.json格式(包含模型结构)和.animations.json格式(动画数据)。
示例:简单生物模型骨骼结构
{
"format_version": "1.8.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.custom_mob",
"texture_width": 16,
"texture_height": 16
},
"bones": [
{
"name": "body",
"pivot": [0, 24, 0]
},
{
"name": "left_leg",
"parent": "body",
"pivot": [2, 12, 0]
},
{
"name": "right_leg",
"parent": "body",
"pivot": [-2, 12, 0]
}
]
}
]
}
编写animations.json:动画的核心逻辑
animations.json文件通过定义多个动画片段(animation)来控制骨骼运动,以下是一个基础的“行走”动画案例,逐步解析关键参数。
基础结构
{
"format_version": "1.8.0",
"animations": {
"animation.mob.walk": { // 动画唯一标识符,格式为"命名空间:动画名"
"loop": true, // 是否循环播放
"animation_length": 1.0, // 动画总时长(秒)
"bones": { // 定义骨骼动画
"left_leg": { // 目标骨骼名称
"rotation": { // 旋转动画(可选:position/scale)
"0.0": [0, 0, 0], // 时间点0:旋转角度(X,YZ,单位为度)
"0.25": [20, 0, 0], // 时间点0.25秒:X轴旋转20度
"0.5": [0, 0, 0],
"0.75": [-20, 0, 0],
"1.0": [0, 0, 0]
}
},
"right_leg": {
"rotation": {
"0.0": [0, 0, 0],
"0.25": [-20, 0, 0],
"0.5": [0, 0, 0],
"0.75": [20, 0, 0],
"1.0": [0, 0, 0]
}
}
}
}
}
}
关键参数详解
loop:设为true时动画循环播放,适合“行走”“跑步”等持续动作;设为false时仅播放一次,适合“攻击”“受伤”等瞬时动作。animation_length:动画周期时长,需与关键帧时间点匹配(如上例中1秒包含4个关键帧)。bones:对象类型,键为骨骼名称,值为该骨骼的动画属性(rotation/position/scale)。rotation:旋转角度,数组格式为[X轴, Y轴, Z轴],单位为度,旋转方向遵循右手定则(X轴向前、Y轴向左、Z轴向上)。position:位移,数组格式为[X, Y, Z],单位为方块格(1=1格)。scale:缩放,数组格式为[X, Y, Z],1为原始大小,>1为放大,<1为缩小。
高级技巧:插值与曲线
默认情况下,关键帧之间采用线性插值(匀速运动),若需更自然的运动(如加速/减速),可通过curve参数调整插值曲线。
"left_leg": {
"rotation": {
"0.0": [0, 0, 0],
"0.5": [30, 0, 0],
"1.0": [0, 0, 0]
},
"curve": "ease_in_out" // 使用内置曲线:ease_in(加速)、ease_out(减速)、ease_in_out(先加速后减速)
}
绑定动画与实体:通过animation_controller
动画编写完成后,需在behavior_packs中定义动画控制器,将动画与实体行为绑定,以自定义生物“mob”为例:
创建animation_controllers.json
{
"format_version": "1.8.0",
"minecraft:animation_controllers": {
"controller.animation.mob.walk": {
"initial_state": "idle", // 初始状态为“闲置”
"states": {
"idle": { // 闲置状态
"transitions": [ // 状态切换条件
"walk->walk": "query.is_moving" // 当实体移动时切换到“行走”状态
],
"animations": ["animation.mob.idle"] // 播放闲置动画
},
"walk": { // 行走状态
"transitions": [
"walk->idle": "!query.is_moving" // 停止移动时切换回闲置
],
"animations": ["animation.mob.walk"] // 播放行走动画
}
}
}
}
}
在实体定义文件中引用控制器
在entities文件夹下的实体定义文件(如mob.json)中,添加动画控制器组件:
"components": {
"minecraft:animation_controller": {
"controller": "controller.animation.mob.walk"
},
// 其他组件(如移动、渲染等)
}
常见问题与解决方法
-
动画不播放:
- 检查
animations.json中的identifier是否与animation_controllers.json中引用的名称一致。 - 确认模型骨骼名称是否与动画中的
bones键名完全匹配(区分大小写)。
- 检查
-
运动异常(如模型“飞走”):
- 检查
pivot(旋转支点)是否设置正确,通常应为骨骼与父骨骼的连接点。 - 确认
position位移值是否过大,避免部件脱离模型主体。
- 检查
-
动画卡顿:
- 减少关键帧数量,或使用
curve替代密集的关键帧。 - 避免在单个动画中控制过多骨骼,优先优化动画逻辑。
- 减少关键帧数量,或使用
实战案例:简单“摆臂”动画
假设有一个手持武器的模型,需实现“攻击时手臂摆动”动画:
模型骨骼(在Blockbench中添加“arm”骨骼,父级为“body”)
animations.json
{
"animation.mob.attack": {
"loop": false,
"animation_length": 0.3,
"bones": {
"arm": {
"rotation": {
"0.0": [0, 0, 0],
"0.15": [-45, 0, 0], // 快速向前摆动45度
"0.3": [0, 0, 0] // 复位
}
}
}


还没有评论,来说两句吧...