模型

自定义模型(Models)是1.8版本加入的特性,它的加入极大地提高了游戏的自由度。通过模型的修改,玩家可以随意变换方块的形状,不同部分的贴图,甚至能添加新的物品外观。巧用模型能打破游戏中有限物品的限制,为地图制作取得更宽阔的创作空间。

  • 状态文件储存在(资源包名)/assets/minecraft/blockstates下,
  • 模型储存在(资源包名)/assets/minecraft/models下。 这两个文件是相互配合的,下文会讲到。

本章节的大部分资料来自:

中文教程 http://www.mcbbs.net/thread-491597-1-1.html 详细介绍各种标签的作用并举例。
WIKI http://minecraft.gamepedia.com/Model

状态文件

状态文件(Block States)是方块模型文件和游戏系统交互的“中介”。当一个方块再游戏中被“看见”时,游戏系统就通过 文件名 来查找方块所对应的状态文件,然后根据状态文件内的内容,确定方块在当前状态时使用的模型。因此 游戏自带 的状态文件的文件名不能更改,但可以添加新的状态文件。

方块状态

相同的方块可能会有不同的状态,如:

  • 蛋糕的块数不同;
  • 草方块上是否有雪;
  • 火把的朝向不同, 等等。 可以在游戏中按 F3 ,在屏幕右侧中部查看所指向方块的方块状态。
    通过方块的状态文件,不同的方块状态会使用不同的模型。

可参考:

WIKI http://minecraft.gamepedia.com/Block_states 所有方块的状态一览。

状态文件-JSON标签

限于篇幅,这里只简述状态文件中的核心部分:

  • (The root tag)(Compound)
    • variants:包含多种方块状态。(Compound)
      • (A variant):储存一个方块状态(标签名为方块状态),及其对应的 单个 模型。(Compound)
        • modelassets/minecraft/models/blocks下的模型文件路径(不包括扩展名)。(String)
        • ...其他标签
      • (A variant):储存一个方块状态(标签名为方块状态),及其对应的 多个 模型。和上方的(A variant)标签不同的是,这是一个list,会从中根据权重随机抽取一个模型。(List)
        • (A model):一种模型。(Compound)
          • modelassets/minecraft/models/blocks下的模型文件路径(不包括扩展名)。(String)
          • weight:此模型被选中的权重。Int。
          • ...其他标签,和上方单个模型的内容相同。

例子们:
blockstates/torch.json
比较基础的状态文件,一种方块状态只对应一种模型。

{
    "variants": {
        "facing=up": { "model": "normal_torch" },
        "facing=east": { "model": "normal_torch_wall" },
        "facing=south": { "model": "normal_torch_wall", "y": 90 },
        "facing=west": { "model": "normal_torch_wall", "y": 180 },
        "facing=north": { "model": "normal_torch_wall", "y": 270 }
    }
}

伪代码:

{  
   "所有方块状态": {  
        当facing状态的值为up时(直立),调用 models/normal_torch.json 模型,  
        当facing状态的值为east时(贴在墙上面朝东方),调用 models/normal_torch_wall.json 模型,  
        当facing状态的值为south时,调用 models/normal_torch_wall.json 模型,并在y轴(纵轴)上旋转90°.  
        west, north 同理.
    }  
}

blockstates/grass.json
出现一种方块状态对应多种模型的情况。每种模型(上文的(A model)标签)并列储存在一个list中。

{
    "variants": {
        "snowy=false": [        //这种方块状态对应了四种模型。所以将这四种模型并列储存在list(方括号)中.
            { "model": "grass_normal" },        //由于没有设置 weight 标签,每种模型都有25%的几率被选择。
            { "model": "grass_normal", "y": 90 },
            { "model": "grass_normal", "y": 180 },
            { "model": "grass_normal", "y": 270 }
        ],
        "snowy=true":  { "model": "grass_snowed" }        //这种方块状态只对应一种模型,和上文torch.json类似.
    }
}

注意:状态文件只调用模型文件,方块的 材质 在模型文件中确定。

当一个方块没有任何方块状态时,(A variant)标签的名称为"normal".
如灵魂沙,blockstates/soul_sand.json:

{
    "variants": {
        "normal": { "model": "soul_sand" }
    }
}

推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Block_states 状态文件
工具 http://www.bejson.com/ JSON检查。

方块模型

方块模型(Block Models)确定一个方块的形状及各部分材质。方块模型文件的文件名可以更改,但要和状态文件中指定的模型吻合。
方块模型文件储存在(资源包名)/assets/minecraft/models/block中。

方块模型-JSON标签

限于篇幅,这里只简述方块模型中的核心部分。详细的讲解请见下文或文章开头的教程贴:

  • (The root tag)
    • parentassets/minecraft/models下父模型的路径(不包括扩展名),详细用途见下。(String)
    • display:确定方块在不同地方的旋转和缩放(拿在手上时,在背包时,成为掉落物时...)(Compound)
      • ...
    • textures:确定方块模型的一些材质,或使用材质变量。(Compound)
      • (A texture variable):定义一个材质变量,并为它赋值。标签名为材质变量名称(自定义),标签的值(材质变量的值)为assets/minecraft/textures下的材质文件(不包括扩展名)。(String)
    • elements:(List)
      • (An element):单个元素。(Compound)
        • from:设置元素起点的坐标,格式为[x, y, z](List)
        • to:设置元素终点的坐标,格式为[x, y, z](List)
        • faces:确定一个元素六个面的材质。(Compound)
          • down, up, north, south, west, east:单个面。(Compound)
            • textureassets/minecraft/textures下材质的路径(不包括扩展名)。从中读取材质。(String)
            • uv:从texture标签读取的材质png文件中,截取一部分作为当前面的材质,格式为[x1,y1,x2,y2].(List)

父模型

父模型的作用相当于“模板”,它将形状相同,但只有材质不同方块模型集中到一个模型文件中,并将材质(texture)部分作为一个材质变量留空,由子模型传递不同的材质。一个例子:

  • torch.json (父模型)
    • normal_torch (子模型1)
    • lit_redstone_torch.json (子模型2)
    • unlit_redstone_torch.json (子模型3)

可以知道,三个子模型(火把,红石火把,熄灭的红石火把)的形状是一样的(棍子),且只有材质上的不同。所以规定它们 形状 的模型就只需要一个(torch.json,作为父模型)。而三个子模型需要定义一个名为torch的材质变量并为它赋不同的值,父模型则需引用这个名为torch的变量。因为所有火把的形状都集中在一个模型文件(torch.json)中,所以可以减少错误且便于维护。

详细的例子和代码分析,见文章开头的教程。

材质变量

材质变量在父模型中,通过#+变量名引用,在子模型中通过(A texture variable)标签定义材质变量,并由父模型引用,简单的例子:

torch.json局部(父模型)

...
"down": { "uv": [ 7, 13, 9, 15 ], "texture": "#torch" },
"up":   { "uv": [ 7,  6, 9,  8 ], "texture": "#torch" }
...

normal_torch.json(子模型):

{
    "parent": "block/torch",
    "textures": {
        "torch": "blocks/torch_on"
    }
}

在这里,父模型(torch.json)需要引用一个名为torch的变量,子模型(normal_torch.json)定义了一个叫torch的变量,并将它赋值为"blocks/torch_on",然后指定父模型是"block/torch.json"。这样,父模型就引用了torch变量的值。此时,父模型就相当于:

...
"down": { "uv": [ 7, 13, 9, 15 ], "texture": "blocks/torch_on" },
"up":   { "uv": [ 7,  6, 9,  8 ], "texture": "blocks/torch_on"}
...

from, to, uv

from, to通过两个三维坐标,确定一个长方体元素的大小和位置(一个方块由单个或多个元素组成)。类似于服务器的圈地插件和fill命令的方式,通过两个三维坐标确定一个长方体范围。
uv标签是在texture标签取得的材质中,截取一部分作为元素某个面的材质。因为某些元素的某些面不会被单独准备材质,所以需要从其它材质中截取部分来使用(例如火把的顶部和底部是没有单独的png材质文件的)。
如,火把的顶部和底部,通过uv截取,使用的是以下部分的材质:
uv

这三个标签的单位都是 像素 。from, to标签是在16*16*16像素(默认)的一个正方体方块中取得一部分空间。uv是在16*16像素(默认)的材质贴图中截取一部分贴图。

推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Block_models 方块模型
编辑器 https://pan.baidu.com/s/1dFKRV0X 免费
编辑器 https://cubik.studio/get 付费
资源包 http://www.mcbbs.net/thread-464655-1-1.html 3D原版资源包,可供参考

物品模型

物品模型确定物品在不同位置时(拿在手上、在背包中、在地上时)的旋转和缩放。也能根据当前物品状态的不同,使用不同的模型或材质。游戏自带的物品模型文件的文件名不能更改,但可以添加自定义物品模型。

物品模型文件储存在(资源包名)/assets/minecraft/models/item中。

物品模型-JSON标签

物品模型的大部分标签和方块模型的相似,这里只介绍部分核心内容,详细的讲解请见文章开头的教程:

  • (The root tag)
    • parentassets/minecraft/models下父模型的路径(不包括扩展名),详细用途见上。(String)
    • textures:确定物品模型的一些材质,其下的标签从assets/minecraft/textures开始加载材质(不包括扩展名)。(Compound)
      • layer<#>#是一个从0开始的整数,如layer0,规定物品(狭义的物品,不能被放置的那一种,如木棍、玻璃瓶)的材质。有些物品不止有一个layer(刷怪蛋,药水瓶)。layer的数量是由硬编码规定的,不能修改。(String)
      • (A texture variable):定义一个材质变量,并为它赋值。标签名为材质变量名称(自定义)。(String)
    • overrides:使用物品标签(Item Tags)确定不同物品状态下物品的模型。(List)
      • (A case):一个标签。(Compound)
        • predicate:储存多个物品标签。(Compound)
          • (A case):单个物品标签,此标签的名称为物品标签的名称。物品标签详细列表见下。(String)
        • modelassets/minecraft/models下的模型路径(不包括扩展名)。从中调用模型。(String)

物品标签(Item Tags)

物品标签的作用类似于方块的状态文件,不是所有的物品都需要物品标签,所有的物品标签:

  • angle:用于指南针。当前指南针的角度,值在0和1之间。
  • blocking:用于盾。玩家用盾格挡时值为1,反之为0.
  • broken:用于鞘翅。当鞘翅损坏(耐久度只剩下1)后,值为1,反之为0.
  • cast:用于鱼竿。若鱼竿抛出钓线,值为1.
  • cooldown:末影珍珠或紫颂果的剩余冷却时间,值在0和1之间。
  • damage:用于有耐久度的物品。物品用掉的耐久,值为1 - (当前耐久/总耐久),值在0和1之间。
  • damaged:用于有耐久度的物品。当物品的耐久度不是100%时,值为1。若该物品的Unbreakable标签值为1,damaged标签的值始终为0.
  • lefthanded:当主手设置为左手时,值为1.*
  • pull:用于弓,表示弓的蓄力程度,值在0和1之间。
  • pulling:用于弓。如果正在拉弓,值为1.
  • time:用于时钟。表示当前的时间,值在0和1之间。

注意事项

  • lefthanded 标签:

lefthanded标签判断的依据是主手的设置(默认是右手),而不是当前持有物品的手
例如,游戏设置中将主手设置为左手,此时将一个物品放在副手(右手)上。那么这个物品在右手上使用的模型,仍然是"lefthanded":1设置的模型。
假定有以下物品模型example.json

...
 "overrides": [
                 {"predicate":  {"lefthanded": 0 },"model":"item/right"},
                 {"predicate":  {"lefthanded": 1 },"model":"item/left"}
              ]
...

当主手设置为 右手(默认) 时:双手手持,掉落物,GUI中,展示框上使用的模型都是right.json,这是正常的现象。
当主手设置为 左手 时,双手手持,GUI中的模型使用left.json。掉落物,展示框上的模型使用right.json。这可能是一个BUG,将来也许会修复,测试版本1.12。


  • 相同的物品标签使用不同值时,值 从小到大 排列。 例子,example.json
...
 "overrides": [
                 {"predicate":  {"damage": 0.1 },"model":"item/sample1"},
                 {"predicate":  {"damage": 0.15 },"model":"item/sample2"},
                 {"predicate":  {"damage": 0.233 },"model":"item/sample3"}
              ]
...
  • 一些用途:
    • 可以通过damage标签,配合游戏中的耐久度,用同一个物品显示多种模型/材质。
    • 根据拉弓的不同程度,改变弓的模型或材质。
    • 更精确地控制钟的时间显示。
    • ......

推荐阅读:

WIKI http://minecraft.gamepedia.com/Model#Item_models 物品模型
WIKI http://minecraft.gamepedia.com/Model#Item_tags 物品标签
编辑器 https://cubik.studio/get 英文,付费
编辑器 http://server.zofenia.de/blockbench/ 英文,免费

results matching ""

    No results matching ""