方块模型用于显示游戏里的所有方块,而物品模型用于显示在玩家手上、头上(头盔栏)、地上、物品栏里、物品展示框中和盔甲架上的物品。 因为某些方块有不同的变种,方块状态用来把不同状态和对应模型联系起来。每个模型和方块状态拥有各自的.json
格式文件。用在物品栏的显示状态也在这些文件中定义。
文件路径
在JSON文件中,使用形如命名空间:名称
的命名空间ID(命名空间mincraft:
可以省略)表示实际文件路径,详见命名空间ID#实际文件路径。
在模型文件中,形如命名空间:名称
的命名空间ID对应的实际路径为assets/命名空间/对象类型/名称.后缀名
,其中名称
可以使用多级子文件夹,用/
分隔各级文件目录。如namespace:foo/bar/baz
(foo和bar是文件目录,baz是真正的文件名)。
命名空间ID所指定的对象和其对应的对象类型
与后缀名
如下:
对象 | 对象类型 的值 |
后缀名 的值
|
---|---|---|
方块状态 | blockstates | json |
模型 | models | json |
材质 | textures | png |
方块状态
某些方块拥有不同的变种(例如可以开关的门),因此每个方块有各自的方块状态文件来列出所有存在的变种并连接到对应的模型。方块也可以同时由不同的模型组合,称为“multipart”。然后模型会根据当前的方块状态而被调用。
这些文件储存在assets/<namespace>/blockstates
中。这些文件会根据名称来直接使用,因此不同名字的方块状态文件不会影响其他的方块状态文件。
- 根标签
- variants:设置变种与对应的模型,列出此方块的所有变种。
- 或者 一个变种:键名为由逗号分隔的方块状态。只有一个变种的方块状态使用
""
为变种名。每个变种可以拥有单个模型或者模型的列表。如果使用列表,列表内使用不同的标签指定不同模型,游戏渲染时将会在列表内随机选择一个模型。物品展示框被视为方块,用于无地图物品展示框使用"map=false"
,带有地图的物品展示框使用"map=true"
。- 一个模型:同一个变种以列表形式指定多个模型时,才能使用该标签。所有指定的模型在游戏中随机出现。标签内指定模型的属性。
- model:指定模型文件的路径,格式为命名空间ID。
- x:模型相对于x轴的旋转,增量90度。
- y:模型相对于y轴的旋转,增量90度。
- uvlock:可为
true
或false
(默认)。设置为true
将锁定方块材质的旋转方向。这样在使用上面的 x和 y标签时材质将不会跟着方块一起旋转。 - weight:设置模型在游戏中被选用的几率,默认为1(=100%)。如果多于一个模型被用在同一个变种,每个模型被选中的几率将会为此模型的weight值除以所有模型weight的总和。(例如,三个weight分别为1,1和2的模型。他们weight的总和为1+1+2=4。这三个模型被调用的几率则分别为1/4,1/4和2/4,也可以说为25%,25%和50%。)
- model:指定模型文件的路径,格式为命名空间ID。
- x:模型相对于x轴的旋转,增量90度。
- y:模型相对于y轴的旋转,增量90度。
- uvlock:可为
true
或false
(默认)。设置为true
将锁定方块材质的旋转方向。这样在使用上面的 x和 y标签时材质将不会跟着方块一起旋转。
- 一个模型:同一个变种以列表形式指定多个模型时,才能使用该标签。所有指定的模型在游戏中随机出现。标签内指定模型的属性。
- 或者 一个变种:键名为由逗号分隔的方块状态。只有一个变种的方块状态使用
- multipart:取代了 variants,基于方块状态属性以来组合模型。
- 一种情况:确定一种情况,并决定应用在这种情况下的模型。
- when:列出该使用模型的必须满足的情况。当未设置时,总是使用该模型。
- OR:如果该标签包含的任意一个条件返回为true时匹配。不能同时设定其他单独的情况。
- 一个条件:列出方块必须匹配才能返回true的情况。
- 状态:方块状态。一个键值对只能规定一个方块状态。但方块状态可以有多个值,由
|
来分隔,使得不同状态均可以匹配。
- 状态:方块状态。一个键值对只能规定一个方块状态。但方块状态可以有多个值,由
- 一个条件:列出方块必须匹配才能返回true的情况。
- 状态:方块状态名称。只能规定一个方块状态。但方块状态可以有多个值,由
|
来分隔,使得不同状态均可以匹配。不能和 OR标签同时出现。
- OR:如果该标签包含的任意一个条件返回为true时匹配。不能同时设定其他单独的情况。
- 或 apply:指定使用的模型及其属性。可以拥有单个模型或者模型的列表。如果使用列表,列表内使用不同的标签指定不同模型,游戏渲染时将会在列表内随机选择一个模型。
- 一个模型:apply以列表形式指定多个模型时,才能使用该标签。所有指定的模型在游戏中随机出现。标签内指定模型的属性。
- model:指定模型文件的路径,格式为命名空间ID。
- 一个模型:apply以列表形式指定多个模型时,才能使用该标签。所有指定的模型在游戏中随机出现。标签内指定模型的属性。
- x:模型相对于x轴的旋转,增量90度。
- y:模型相对于y轴的旋转,增量90度。
- uvlock:可为
true
或false
(默认)。设置为true
将锁定方块材质的旋转方向。这样在使用上面的 x和 y标签时材质将不会跟着方块一起旋转。- weight:设置模型在游戏中被选用的几率,默认为1(=100%)。如果多于一个模型,每个模型被选中的几率将会为此模型的weight除以所有模型weight的总和。(例如,三个weight分别为1,1和2的模型。他们weight的总和为4(1+1+2)。这三个模型被调用的几率则分别为1⁄4、1⁄4和2⁄4,也可以说为25%、25%和50%。)
- model:指定模型文件的路径,格式为命名空间ID。
- x:模型相对于x轴的旋转,增量90度。
- y:模型相对于y轴的旋转,增量90度。
- uvlock:可为
true
或false
(默认)。设置为true
将锁定方块材质的旋转方向。这样在使用上面的 x和 y标签时材质将不会跟着方块一起旋转。
- when:列出该使用模型的必须满足的情况。当未设置时,总是使用该模型。
- 一种情况:确定一种情况,并决定应用在这种情况下的模型。
- variants:设置变种与对应的模型,列出此方块的所有变种。
"uvlock": true
|
"uvlock": false
|
示例:墙上的火把
墙上的火把有若干个变种:朝向四个不同方向。以下这个示例取自文件wall_torch.json
,你能在assets/minecraft/blockstates
路径下找到该文件。
- wall_torch.json
{
"variants": {
"facing=east": { "model": "block/wall_torch" },
"facing=south": { "model": "block/wall_torch", "y": 90 },
"facing=west": { "model": "block/wall_torch", "y": 180 },
"facing=north": { "model": "block/wall_torch", "y": 270 }
}
}
墙上的火把能被插在方块的四个侧面上,所以需要四个不同的变种,每个侧面都得有一个变种。这四个变种分别叫作"facing=east"
、"facing=west"
、"facing=south"
以及"facing=north"
。四个变种的模型都用的是"block/wall_torch"
, 但这个模型因"y"
设置的数值而在y轴方向上旋转了几个90度,这样被插在不同侧面上的火把看起来才都十分协调。
示例:草方块
草方块有两个变种,第一个变种有四个不同的模型。以下这个示例取自文件grass_block.json
,你能在assets/minecraft/blockstates
路径下找到该文件。
- grass_block.json
{
"variants": {
"snowy=false": [
{ "model": "block/grass_block" },
{ "model": "block/grass_block", "y": 90 },
{ "model": "block/grass_block", "y": 180 },
{ "model": "block/grass_block", "y": 270 }
],
"snowy=true": { "model": "block/grass_block_snow" }
}
}
不覆雪的草方块 ("snowy=false"
) 拥有四个模型,这四个模型都使用的是同一个方块模型,但模型被旋转了几个90度。因为有四个模型而其中任何一个都没使用 weight
标签,所以在你放置一个(无雪的)草方块的时候,每个模型都有1÷(1+1+1+1)=25%的几率被使用,也就是说这个草方块朝向东南西北任何一个方向都有可能。
示例:橡木栅栏
橡木栅栏使用了multipart
这个格式.。以下这个示例取自assets/minecraft/blockstates
路径下的文件fence.json
。
- oak_fence.json
{
"multipart": [
{ "apply": { "model": "block/oak_fence_post" }},
{ "when": { "north": "true" },
"apply": { "model": "block/oak_fence_side", "uvlock": true }
},
{ "when": { "east": "true" },
"apply": { "model": "block/oak_fence_side", "y": 90, "uvlock": true }
},
{ "when": { "south": "true" },
"apply": { "model": "block/oak_fence_side", "y": 180, "uvlock": true }
},
{ "when": { "west": "true" },
"apply": { "model": "block/oak_fence_side", "y": 270, "uvlock": true }
}
]
}
第一个模型,栅栏柱,是一直使用着的,而其他模型只在某些条件下使用。栅栏横带板只有在其他方块与该栅栏相邻时才出现。可横带板是有朝向的,于是横带板的模型就被旋转了几个90度来用,这样的话所需的模型数量就能减至两个了,一个是栅栏柱,一个是横带板。与在Java版1.8中用到的5个模型、16个变种相比,这算是个相当大的改进了。
示例:红石线
红石线模型使用multipart
格式。以下这个示例取自assets/minecraft/blockstates
路径下的文件redstone_wire.json
。
- redstone_wire.json
{
"multipart": [
{ "when": { "OR": [
{"north": "none", "east": "none", "south": "none", "west": "none"},
{"north": "side|up", "east": "side|up" },
{"east": "side|up", "south": "side|up" },
{"south": "side|up", "west": "side|up"},
{"west": "side|up", "north": "side|up"}
]},
"apply": { "model": "block/redstone_dust_dot" }
},
{ "when": { "OR": [
{ "north": "side|up" },
{ "north": "none", "east": "none", "south": "side|up", "west": "none" }
]},
"apply": { "model": "block/redstone_dust_side0" }
},
{ "when": { "OR": [
{ "south": "side|up" },
{ "north": "side|up", "east": "none", "south": "none", "west": "none" }
]},
"apply": { "model": "block/redstone_dust_side_alt0" }
},
{ "when": { "OR": [
{ "east": "side|up" },
{ "north": "none", "east": "none", "south": "none", "west": "side|up" }
]},
"apply": { "model": "block/redstone_dust_side_alt1", "y": 270 }
},
{ "when": { "OR": [
{ "west": "side|up" },
{ "north": "none", "east": "side|up", "south": "none", "west": "none" }
]},
"apply": { "model": "block/redstone_dust_side1", "y": 270 }
},
{ "when": { "north": "up" },
"apply": { "model": "block/redstone_dust_up" }
},
{ "when": { "east": "up" },
"apply": { "model": "block/redstone_dust_up", "y": 90 }
},
{ "when": { "south": "up" },
"apply": { "model": "block/redstone_dust_up", "y": 180 }
},
{ "when": { "west": "up" },
"apply": { "model": "block/redstone_dust_up", "y": 270 }
}
]
}
红石粉的模型是一步步地创建的。第一个情况决定了红石粉中心的点状模型redstone_dot
的使用条件:东、南、西、北四个方向都为“none”,或当两个形成拐角的方向为up
或side
时。
最后的四种情况检查west
是否为up
,如果是,则应用模型redstone_up
。
方块模型
文件夹assets/<namespace>/models/block
存有所有方块状态文件指定的模型文件。可以更改文件的名称,但必须与方块状态文件中使用的名称一致。
- 根标签
- parent:继承其他模型文件,格式为命名空间ID。如果同时设置了
"parent"
和"elements"
,那么此模型的"elements"
标签将覆盖父类模型"parent"
下的"elements"
标签。- 可以设置为
"builtin/generated"
以使用从指定图标创建的模型。请注意,仅支持一层,且只能通过方块状态文件来实现旋转。
- 可以设置为
- ambientocclusion:是否使用环境遮挡,默认为
true
。如果设置了"parent"
,则其父模型的ambientocclusion
标签会覆盖该模型的ambientocclusion
标签。[1] - display:列出物品模型于不同位置下的显示设置。
- 位置:键名可以是
thirdperson_righthand
、thirdperson_lefthand
、firstperson_righthand
、firstperson_lefthand
、gui
、head
、ground
或fixed
。物品模型于不同位置下的显示设置。分别设置旋转,平移和缩放。fixed指的是当被摆放在物品展示框上时,其他的显示位置如同其名。值得注意的是平移优先于旋转。- rotation:根据
[x, y, z]
格式,使模型相对于对应轴进行旋转。 - translation:根据
[x, y, z]
格式,使模型相对于对应轴进行移动。如果值大于80,会作为80处理,小于-80时则看作-80。 - scale:根据
[x, y, z]
格式,使模型相对于对应轴进行缩放。当值大于4时,效果等同于4。
- rotation:根据
- 位置:键名可以是
- textures:定义方块颗粒的材质以及模型所使用的材质变量。键值可以为材质文件的路径,格式为命名空间ID,也可以为另一个材质变量。
- particle:方块对应的颗粒的材质。玩家在下界传送门中时也会使用此材质。注意:所有非模型渲染的方块的破坏可以为硬编码。
- 材质变量名:定义一个材质变量。
- elements:列出模型的所有元素,这些元素只能为长方体形态。如果同时设置了
"parent"
和"elements"
,此模型的"elements"
标签将覆盖父类模型"parent"
下的"elements"
标签。- 一个元素:
- from:根据
[x, y, z]
格式,指定一个长方体的起始点。数值必须为-16到32之间。 - to:根据
[x, y, z]
格式,指定一个长方体的结束点。数值必须为-16到32之间。 - rotation:设置元素的旋转。
- origin:根据坐标
[x, y, z]
设置旋转中心。 - axis:旋转的一个且只能为一个轴,可以为
"x"
,"y"
或"z"
。 - angle:旋转的角度。可以为45到-45度,以22.5度为增量。
- rescale:是否缩放为整个长方体大小。可以为
"true"
或"false"
。默认为"false"
。
- origin:根据坐标
- shade:是否渲染阴影。可以为
"true"
或"false"
。默认为"true"
。 - faces:包含单个
"element"
的所有面。若有一个面没有定义,则不渲染此面。- 面:键名为
down
、up
、north
、south
、west
或east
。包含指定面的所有属性。- uv:根据
[x1, y1, x2, y2]
格式,指定所使用的材质图片的区域。如果未设置,它的默认值等于元素的xyz位置。若此值低于0或高于16,则材质显示将会不正常。若x1
和x2
坐标对调,材质也将会被翻转(例:从原本的0, 0, 16, 16
变为16, 0, 0, 16
)。UV为可选的,若未指定,则会自动根据元素的位置生成。 - texture:指定所使用的材质变量,变量前加上
#
。材质变量于上文的材质变量名
定义。 - cullface:指定当方块的指定面被渲染不透明方块覆盖时,父标签 面所定义的面是否不渲染。指定的面可以为:
down
,up
,north
,south
,west
, 或east
。也就是说,指定渲染时把这个面视为方块的哪一个表面。同时,该面面的亮度计算等同于方块的指定面, and if unset, defaults to the side. - rotation:根据特定的角度旋转材质。可以为0,90,180或270。默认为0。旋转不会影响到uv所指定的材质部分,而是此部分的旋转角度。
- tintindex:是否使用硬编码对该材质进行重新着色。默认不使用着色和任何着色数值。注意只有特定方块可以着色,其他方块设置此项无效。
- uv:根据
- 面:键名为
- from:根据
- 一个元素:
- parent:继承其他模型文件,格式为命名空间ID。如果同时设置了
示例:直立的火把
为简单起见,此示例只介绍直立的火把,代码由储存于assets/minecraft/models/block
中的文件torch.json
和template_torch.json
定义。
- template_torch.json
{
"ambientocclusion": false,
"textures": {
"particle": "#torch"
},
"elements": [
{ "from": [ 7, 0, 7 ],
"to": [ 9, 10, 9 ],
"shade": false,
"faces": {
"down": { "uv": [ 7, 13, 9, 15 ], "texture": "#torch" },
"up": { "uv": [ 7, 6, 9, 8 ], "texture": "#torch" }
}
},
{ "from": [ 7, 0, 0 ],
"to": [ 9, 16, 16 ],
"shade": false,
"faces": {
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" },
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" }
}
},
{ "from": [ 0, 0, 7 ],
"to": [ 16, 16, 9 ],
"shade": false,
"faces": {
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" },
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#torch" }
}
}
]
}
此文档被用于创建火把的模型,此模型被普通火把、红石火把和灵魂火把使用。"elements"
标签下创建了三个元素,或者说三个长方体。因为只定义了两个面,所以每个长方体只有两个面会在游戏里被渲染。"uv"
指定了材质所使用的区域。材质变量"#torch"
用于指定方块的颗粒材质和元素的材质,虽然这里的"#torch"
还未定义路径。
- torch.json
{
"parent": "block/template_torch",
"textures": {
"torch": "blocks/torch"
}
}
此文件为普通火把的地上摆放模型。会先读取并继承其父类文件"parent"
(torch.json)下的设置。然后为父文件使用的材质变量的定义路径,定义为普通火把的材质路径。自此,这个普通火把的模型就为父类定义的模型,而材质和颗粒材质则为自己定义的路径材质。
示例: 标准方块
此示例为Minecraft里大部分方块的基本结构。这部分方块使用同一个基本模型,以此模型使用他们的材质,如上例子。此cube.json
示例取自assets/minecraft/models/block
。
- cube.json
{
"elements": [
{
"from": [ 0, 0, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"down": { "texture": "#down", "cullface": "down" },
"up": { "texture": "#up", "cullface": "up" },
"north": { "texture": "#north", "cullface": "north" },
"south": { "texture": "#south", "cullface": "south" },
"west": { "texture": "#west", "cullface": "west" },
"east": { "texture": "#east", "cullface": "east" }
}
}
]
}
上文中提到过的将不会再复述。使用"cullface": "down"
会在方块底面有方块遮挡时,不渲染此面。其他几个面同理。
示例:树苗
此示例为所有树苗使用的基本结构(还没有为树苗指定材质)。此模型为cross.json
,材质会在例如oak_sapling.json
之类的文件里定义。这两个文件都存放在assets/minecraft/models/block
文件夹下。
- cross.json
{
"ambientocclusion": false,
"textures": {
"particle": "#cross"
},
"elements": [
{
"from": [ 0.8, 0, 8 ],
"to": [ 15.2, 16, 8 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
"shade": false,
"faces": {
"north": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" },
"south": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }
}
},
{
"from": [ 8, 0, 0.8 ],
"to": [ 8, 16, 15.2 ],
"rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true },
"shade": false,
"faces": {
"west": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" },
"east": { "uv": [ 0, 0, 16, 16 ], "texture": "#cross" }
}
}
]
}
一个普通的树苗形状,为两个元素旋转45度。因此要把原点和指定的旋转轴设置为对应的数值,然后角度设为45,并把"rescale"
设置为true
。"rescale": true
的作用是让旋转之后的材质拉伸为旋转前的宽度(见下图)。
"rescale": true
|
"rescale": false
|
示例:将多个材质组合到一个文件
使用"uv"
组合,材质可以从一个文件读取,文件的不同部分用于方块的不同面。"uv"
不会按像素提取文件,而是而是按照图片大小的比例(以16为单位)。比如,使用"uv": [0,0, 16,8]
会提取图片的上半部分:从坐标(0⁄16, 0⁄16)也就是(0,0),即最左上方的像素,到(16⁄16, 8⁄16)也就是(100%,50%),即右侧中间的像素。因为是按百分比计算的,所以将材质图片修改为到32x32、64x64等,都不需要更改模型文件。
在这个例子中,制箭台(如图)用了组合材质(存储于fletching_table.png
):顶部的16×16像素(如果把材质修改为32像素宽,那就是顶部的32x32,依此类推,模型文件不需要修改)作为方块的顶部材质,中间的16x16像素作为方块的前后两面,底部16x16作为其他面。底部材质是birch_planks
(白桦木板)。对于以上三个材质,模型文件可以这样写:
{
"parent": "block/cube",
"textures": {
"particle": "block/fletching_table",
"all": "block/fletching_table",
"bottom": "block/birch_planks"
},
"elements": [
{
"from": [ 0, 0, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"down": { "texture": "#down", "cullface": "bottom" },
"up": { "uv": [0,0, 16,5.34], "texture": "#all", "cullface": "up" },
"north": { "uv": [0,5.35, 16,10.66], "texture": "#all", "cullface": "north" },
"south": { "uv": [0,5.35, 16,10.66], "texture": "#all", "cullface": "south" },
"west": { "uv": [0,10.67, 16,16], "texture": "#all", "cullface": "west" },
"east": { "uv": [0,10.67, 16,16], "texture": "#all", "cullface": "east" }
}
}
]
}
如右图,在这个例子中,只有两个材质置于一个文件,构成骨块。对于这两个材质,模型文件代码可以这样写:
{
"parent": "block/cube",
"textures": {
"particle": "block/bone_block",
"all": "block/bone_block"
},
"elements": [
{
"from": [ 0, 0, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"down": { "uv": [0,0, 16,8], "texture": "#all", "cullface": "down" },
"up": { "uv": [0,0, 16,8], "texture": "#all", "cullface": "up" },
"north": { "uv": [0,8, 16,16], "texture": "#all", "cullface": "north" },
"south": { "uv": [0,8, 16,16], "texture": "#all", "cullface": "south" },
"west": { "uv": [0,8, 16,16], "texture": "#all", "cullface": "west" },
"east": { "uv": [0,8, 16,16], "texture": "#all", "cullface": "east" }
}
}
]
}
在这个例子中,四个材质都在同一个文件中,以构成木桶。对于这4个材质,模型文件可以这样写:
{
"parent": "block/cube",
"textures": {
"particle": "block/barrel",
"all": "block/barrel"
},
"elements": [
{
"from": [ 0, 0, 0 ],
"to": [ 16, 16, 16 ],
"faces": {
"down": { "uv": [8,8, 16,16], "texture": "#all", "cullface": "down" },
"up": { "uv": [8,0, 16,8], "texture": "#all", "cullface": "up" },
"north": { "uv": [0,8, 8,16], "texture": "#all", "cullface": "north" },
"south": { "uv": [0,8, 8,16], "texture": "#all", "cullface": "south" },
"west": { "uv": [0,8, 8,16], "texture": "#all", "cullface": "west" },
"east": { "uv": [0,8, 8,16], "texture": "#all", "cullface": "east" }
}
}
]
}
物品模型
因为物品模型没有变种,所以没有设置变种的必要。文件路径assets/<namespace>/models/item
下存放着所有的物品模型文件。文件的名字为硬编码,因此不应修改文件名。
- 根标签
- parent:继承其他模型文件,格式为命名空间ID。如果同时设置了
"parent"
和"elements"
,此模型的"elements"
标签将覆盖前一个模型下的"elements"
标签。 - display:列出物品模型于不同位置下的显示设置。
- 位置:键名可以是
thirdperson_righthand
、thirdperson_lefthand
、firstperson_righthand
、firstperson_lefthand
、gui
、head
、ground
或fixed
。物品模型于不同位置下的显示设置。分别设置旋转,平移和缩放。fixed指的是当被摆放在物品展示框上时,其他的显示位置如同其名。值得注意的是平移优先于旋转。- rotation:根据
[x, y, z]
格式,使模型相对于对应轴进行旋转。 - translation:根据
[x, y, z]
格式,使模型相对于对应轴进行移动。如果值大于80,会作为80处理,小于-80时则看作-80。 - scale:根据
[x, y, z]
格式,使模型相对于对应轴进行缩放。当值大于4时,效果等同于4。
- rotation:根据
- 位置:键名可以是
- textures:定义物品颗粒的材质以及模型所使用的材质变量。键值可以为材质文件的路径,格式为命名空间ID,也可以为另一个材质变量。
- gui_light:仅在gui中使用。可以是
front
或side
。设为side
,模型会被渲染为长方体形状。设为front
,模型会以平面材质填满一整格。 - elements:列出模型的所有元素,这些元素只能为长方体形态。如果同时设置了
"parent"
和"elements"
,此模型的"elements"
标签将覆盖父类模型"parent"
下的"elements"
标签。- 一个元素:
- from:根据
[x, y, z]
格式,指定一个长方体的起始点。数值必须为-16到32之间。 - to:根据
[x, y, z]
格式,指定一个长方体的结束点。数值必须为-16到32之间。 - rotation:设置元素的旋转。
- origin:根据坐标
[x, y, z]
设置旋转中心。 - axis:旋转的一个且只能为一个轴,可以为
"x"
,"y"
或"z"
。 - angle:旋转的角度。可以为45到-45度,以22.5度为增量。
- rescale:是否缩放为整个长方体大小。可以为
"true"
或"false"
。默认为"false"
。
- origin:根据坐标
- faces:包含单个
"element"
的所有面。若有一个面没有定义,则不渲染此面。- 面:键名为
down
、up
、north
、south
、west
或east
。包含指定面的所有属性。- uv:根据
[x1, y1, x2, y2]
格式,指定所使用的材质图片的区域。如果没指定,则默认根据此element的xyz坐标设置。若此值低于0或高于16,则材质显示将会不正常。若x1
和x2
坐标对调,材质也将会被翻转(例:从原本的0, 0, 16, 16
变为16, 0, 0, 16
)。UV为可选的,若未指定,则会自动根据元素的位置生成。 - texture:指定所使用的材质变量,变量前加上
#
。材质变量于上文的材质变量名
定义。 - cullface:指定的面可以为:
down
,up
,north
,south
,west
, 或east
。该面面的亮度计算等同于方块的指定面, and if unset, defaults to the side. - rotation:根据特定的角度旋转材质。可以为0,90,180或270。默认为0。旋转不会影响到uv所指定的材质部分,而是此部分的旋转角度。
- tintindex:确定是否使用硬编码对该材质进行重新着色。默认情况下不着色,任何数字都会决定着色器使用颜色(除了刷怪蛋,设置为0会使它使用第一种颜色,设置为1会使它使用第二种颜色)。请注意,只有特定的物品或物品的特定层(例如药水)可以着色,其他物品设置此项无效。
- uv:根据
- 面:键名为
- from:根据
- 一个元素:
- overrides:指定基于物品情况标签而覆写不同模型的情况。所有情况都按从上到下的顺序进行检测,直到有完全匹配的谓词。但是,如果已经被覆写过一次,则会忽略覆写,这可以避免在覆写到同一模型时出现递归。
- parent:继承其他模型文件,格式为命名空间ID。如果同时设置了
简单示例:平面床
这个例子用旧版本Java版找到的材质替换物品床的渲染,比如。这个文件位于assets/minecraft/models/item
文件夹下的“red_bed.json
”:
{
"parent": "item/generated",
"textures": {
"layer0": "item/red_bed"
}
}
此处的例子中,parent
被设置为item/generated
,表示这个物品模型是平坦的材质。在textures
中,layer0
被设定为这个物品的应有材质;此处即为red_bed
,其路径为assets/minecraft/textures/item
文件夹。“red
”可以被替换为其他颜色的床,但必须被放在不同的JSON文件(示例:black_bed.json
,green_bed.json
,以此类推)。在textures/item
文件夹中必须有物品材质文件(layer0
所要求的内容);可以使用下列材质:
可将上述文件重命名为<颜色>_bed
(保留扩展名.png
)并放入assets/minecraft/textures/item
文件夹。请注意与layer0
中引用的材质名称相匹配。
物品标签
有些物品可以使用额外的标签进行模型覆写的判断。以下为可用的标签列表。
"angle"
:角度,判断指南针的角度,以十进制小于1的数值表达。"blocking"
:格挡,判断盾牌是否为格挡状态。格挡时为1
。"broken"
:破损,判断鞘翅是否破损。破损时为1
。"cast"
:抛掷,判断钓鱼竿是否已抛出。已抛出时为1
。"cooldown"
:冷却,判断末影珍珠/紫颂果的剩余冷却时间,以十进制、0到1之间的数值表达。"damage"
:损伤值,判断拥有耐久值的物品的已受损程度,以十进制、0到1之间的数值表达。"damaged"
:受损,判断拥有耐久值的物品是否为已受损状态。已受损时为1
。若物品拥有Unbreakable标签时,此数值为0
,且"damage"
标签的数值可以不为0。"lefthanded"
:指定被左手玩家使用的模型,会影响其在物品栏的显示样式,以及玩家拿起或穿在身上时的视觉样式。"pull"
:拉伸程度,判断弓被拉伸的程度,以十进制,0到1之间的数值表达。没被拉伸时为0
,被完全拉伸时为1
。"pulling"
:拉伸,判断弓是否被拉伸。被拉伸时为1
。"throwing"
:用于三叉戟以判断三叉戟是否即将被玩家扔出。如果为1
,则三叉戟准备扔出。"time"
:时间,判断时钟的时间,以十进制,0到1之间的数值表达。"custom_model_data"
: 自定义模型,用于使用自定义模型的物品,用整数表达。
示例:火把
此例子是火把作为物品时的显示模型。模型为存放在assets/minecraft/models/item
下的torch.json
。
- torch.json
{
"parent": "item/generated",
"textures": {
"layer0": "block/torch"
},
"display": {
"thirdperson_righthand": {
"rotation": [ -90, 0, 0 ],
"translation": [ 0, 1, -3 ],
"scale": [ 0.55, 0.55, 0.55 ]
},
"firstperson_lefthand": {
"rotation": [ 0, -135, 25 ],
"translation": [ 0, 4, 2 ],
"scale": [ 1.7, 1.7, 1.7 ]
}
}
}
因为"parent"
标签所使用的父类模型为"builtin/generated"
,所以物品形态的火把模型使用游戏内置生成的2D图像模型。而生成所使用的图像由"layer0"
标签定义,这个物品模型使用的材质图片同时也是方块模型使用的材质。因为硬编码规定火把只有一个图层,所以给予火把添加额外的图层是没用的。此外,通过设置display属性,可以保证此物品模型在不同情况下的正确显示。火把不能放在玩家的头上,也在物品栏中使用平面图标,所以没必要定义戴在头上时和GUI中的display设置。为了使模型在第一人称视角和第三人称视角中与玩家的左手或右手对齐,需要旋转,平移和缩放模型,这是针对两种情况分别进行的。
示例:钓鱼杆
此处以钓鱼竿为例。模型为存放在assets/minecraft/models/item
下的fishing_rod.json
。
- fishing_rod.json
{
"parent": "item/handheld_rod",
"textures": {
"layer0": "item/fishing_rod_uncast"
},
"overrides": [
{
"predicate": {
"cast": 1
},
"model": "item/fishing_rod_cast"
}
]
}
- fishing_rod_cast.json
{
"parent": "item/fishing_rod",
"textures": {
"layer0": "item/fishing_rod_cast"
}
}
此钓鱼竿的材质在非抛掷的情况下为layer0所指向的材质路径文件fishing_rod_uncast.png。当投掷出去后(cast
为1
时),改为使用"item/fishing_rod_cast"
路径下的物品模型和此模型下的定义材质路径"items/fishing_rod_cast"
。
历史
Template:Translation:未知参数。
Java版 | |||||
---|---|---|---|---|---|
1.7.2 | 13w36a | 花现在被放置时像高草一样不会位于方块中间。 | |||
1.8 | 14w06a | 加入了自定义方块模型 | |||
14w07a | 重写模型格式。现在不仅有“平面”,还有“平面”和“长方体”。对象的旋转也被限制为每个对象以22.5度递增的方向旋转。 | ||||
14w11a | 固体方块上的光照不再使方块内部的部分黑咕隆咚一片。 | ||||
14w11b | 通用方块现在加载模型,而不是预设的形状。 | ||||
April 12, 2014 | TheMogMiner发布了关于模型格式即将更改的文章。 | ||||
14w17a | 将剩余的大部分固体方块转换为模型格式。 | ||||
添加"rotateVariantTextures" 通过旋转保存uv细节。 | |||||
14w25a | 从uv定义中移除方向属性,并将其替换为显式材质引用。"textureFacing" 被"texture" 参数替换,其前缀为井号(#)。
| ||||
"useAmbientOcclusion"重命名为"ambientocclusion" | |||||
"rotateVariantTextures"重命名为"UV lock" | |||||
"cull"重命名为"cullface",指定选择的相邻面的反面 | |||||
旋转变得更加冗长,现在它变得更清晰因为它只能发生在一个轴上。"cross" 模型的两个面之一的旋转现在是:"rotation": { "origin": [ 8, 8, 8 ], "axis": "y", "angle": 45, "rescale": true }, | |||||
删除了文件夹models/blocks/meshes ,模型文件现在存储在models/block . | |||||
添加了方块状态文件夹,并在models/block 存储了以前在其中找到的模型选择文件。 | |||||
模型格式现在支持自定义物品模型。 | |||||
14w27a | 用能够更好地显示内部数据的数据替换方块状态名。现在还没有显示某些方块的所有数据。将在将来的版本中切换到使用实际存储的数据,为此,数值化数据值将完全删除,方块状态替代。 | ||||
14w27b | 方块状态文件现在支持随机模型的模型数据。 | ||||
14w30a | 加入了物品模型"builtin/entity" . | ||||
1.8.2 | pre5 | 标签"translation"现在被限制在-24到24之间。 | |||
标签"scale"现在被限制在4或更少 | |||||
1.9 | 15w31a | UV现在是可选的,如果没有提供,它将根据元素的位置自动生成。 | |||
不同的模型/材质对于不同的损害值,物品状态,以及玩家是否是左撇子。这种方法适用于指南针、时钟和任何有耐久度的物体。它还包含弓和钓竿的附加标签。 | |||||
模型现在可以基于方块状态属性(比如栅栏)组合在一起。因此,普通方块模型集削减了近300个模型。 | |||||
现在方块模型JSON更严格了,不允许使用注释和无引用标识符。 | |||||
"display"标签默认设置已经更改,"thirdperson" 和"firstperson" 标签替换为"thirdperson_righthand" ,"thirdperson_lefthand" ,"firstperson_righthand" ,和"firstperson_lefthand" 。 | |||||
"parent"和"elements"标签现在可以共存,尽管顶级元素标签覆盖了以前的所有标签。 | |||||
删除禁用备用方块模型的选项。 | |||||
1.14 | 18w43a | 加入了新的物品模型属性"custom_model_data" . |
版本 | |||||||
---|---|---|---|---|---|---|---|
开发周期 |
| ||||||
技术 |
| ||||||
多人游戏 | |||||||
游戏订制 |