方塊模型(Block Model)用於顯示遊戲裡的所有方塊,而物品模型(Item Model)用於顯示在玩家手上、頭上(頭盔欄)、地上、物品欄裡、物品展示框中和盔甲座上的物品。 因為某些方塊有不同的變種,方塊狀態(Block State)用來把不同狀態和對應模型聯繫起來。每個模型和方塊狀態擁有各自的.json
格式檔案。用在物品欄的顯示狀態也在這些檔案中定義。
檔案路徑[]
在JSON檔案中,使用形如命名空间:名称
的命名空間ID(命名空間minecraft:
可以省略)表示實際檔案路徑,詳見命名空間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。
- uvlock:(可選,預設為false)設定為
true
將鎖定方塊紋理的旋轉方向。這樣在使用上面的 x和 y標籤時紋理將不會跟著方塊一起旋轉。 - weight:(可選,預設為1)設定模型在遊戲中被選用的權重,必須大於0。如果多於一個模型被用在同一個變種,每個模型被選中的機率將會為此模型的權重值除以所有模型權重的總和。(例如,三個權重分別為1,1和2的模型,它們權重總和為4,這三個模型被調用的機率分別為1⁄4、1⁄4和2⁄4。)
- x:(可選,預設為0)模型相對於x軸的旋轉,增量90度。
- y:(可選,預設為0)模型相對於y軸的旋轉,增量90度。
- 如果使用單個模型,此標籤內包含下列標籤:
- model:指定模型檔案的命名空間ID。
- uvlock:(可選,預設為false)設定為
true
將鎖定方塊紋理的旋轉方向。這樣在使用上面的 x和 y標籤時紋理將不會跟著方塊一起旋轉。 - x:(可選,預設為0)模型相對於x軸的旋轉,增量90度。
- y:(可選,預設為0)模型相對於y軸的旋轉,增量90度。
- <變種名>:指定某一個變種的模型。變種名為由逗號分隔的有關方塊屬性的鍵值對。不含有方塊屬性的方塊狀態使用
- multipart:基於方塊狀態的屬性來組合模型。
- :確定一種情況,並決定應用在這種情況下的模型。
- when:(可選)列出使用該模型的必須滿足的所有條件。當未設定時,條件總是滿足。標籤內只能包含下列三種標籤中的一種, OR和 AND只能在標籤內出現一次,而方塊屬性條件則可以多次出現,但不能檢查同一個方塊屬性。
- AND:當標籤包含的所有條件滿足時,此標籤代表的條件才會滿足。
- :一個匹配條件。內部標籤定義與 when相同。
- OR:當標籤包含的任意一個條件滿足時,此標籤代表的條件也就滿足。
- :一個匹配條件。內部標籤定義與 when相同。
- <屬性名>:要檢查的方塊屬性。方塊屬性可以有多個值,由
|
來分隔,使得不同屬性值均可以匹配。
- AND:當標籤包含的所有條件滿足時,此標籤代表的條件才會滿足。
- apply:指定使用的模型及其屬性。
- 如果使用了多個模型,此標籤為一個列表,並帶有下列標籤:
- :一個模型。所有指定的模型在遊戲中隨機出現,標籤內指定模型的屬性。
- model:指定模型檔案的命名空間ID。
- uvlock:(可選,預設為false)設定為
true
將鎖定方塊紋理的旋轉方向。這樣在使用上面的 x和 y標籤時紋理將不會跟著方塊一起旋轉。 - weight:(可選,預設為1)設定模型在遊戲中被選用的權重,必須大於0。如果多於一個模型被用在同一個變種,每個模型被選中的機率將會為此模型的權重值除以所有模型權重的總和。(例如,三個權重分別為1,1和2的模型,它們權重總和為4,這三個模型被調用的機率分別為1⁄4、1⁄4和2⁄4。)
- x:(可選,預設為0)模型相對於x軸的旋轉,增量90度。
- y:(可選,預設為0)模型相對於y軸的旋轉,增量90度。
- 如果使用單個模型,此標籤內包含下列標籤:
- model:指定模型檔案的命名空間ID。
- uvlock:(可選,預設為false)設定為
true
將鎖定方塊紋理的旋轉方向。這樣在使用上面的 x和 y標籤時紋理將不會跟著方塊一起旋轉。 - x:(可選,預設為0)模型相對於x軸的旋轉,增量90度。
- y:(可選,預設為0)模型相對於y軸的旋轉,增量90度。
- when:(可選)列出使用該模型的必須滿足的所有條件。當未設定時,條件總是滿足。標籤內只能包含下列三種標籤中的一種, OR和 AND只能在標籤內出現一次,而方塊屬性條件則可以多次出現,但不能檢查同一個方塊屬性。
- :確定一種情況,並決定應用在這種情況下的模型。
- 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中載入模型檔案,作為本模型的父模型。父模型中的屬性將繼承到本模型中,但在本模型內聲明的屬性會覆蓋父模型的屬性。父模型不能為自身,也不能循環繼承。
- display:(可選,若無繼承屬性預設為無變換)列出方塊對應的物品模型於不同位置下的顯示設定。
- <位置>:設定方塊物品在不同位置上的顯示設定,按照縮放、旋轉、平移的步驟進行變換。鍵名可以是
thirdperson_righthand
、thirdperson_lefthand
、firstperson_righthand
、firstperson_lefthand
、gui
、head
、ground
和fixed
。- scale:(可選,預設為
[1, 1, 1]
)使模型相對於對應軸進行縮放,每個軸上的縮放都鉗制在-4到4之間。- :某一個軸上的縮放。
- rotation:(可選,預設為
[0, 0, 0]
)使模型相對於對應軸進行旋轉,以角度為單位。- :某一個軸上的旋轉。
- translation:(可選,預設為
[0, 0, 0]
)使模型相對於對應軸進行平移,每個軸上的平移都鉗制在-80到80之間。- :某一個軸上的平移。
- scale:(可選,預設為
- <位置>:設定方塊物品在不同位置上的顯示設定,按照縮放、旋轉、平移的步驟進行變換。鍵名可以是
- ambientocclusion:(可選,若無繼承屬性預設為true)是否使用環境光遮蔽。
- gui_light:(可選,若無繼承屬性預設為side)如果設定為
side
,那麼在GUI內會按照方塊類似的光照方式進行繪製;如果設定為front
,則在GUI內會使用扁平物品的光照進行繪製。 - textures:(可選)定義模型的使用的紋理變數列表。紋理變數可以從父模型繼承。此列表內定義的紋理變數會覆蓋父模型的紋理變數。紋理變數
particle
是特殊紋理變數,除了可以作為正常的紋理變數外,還控制了方塊的粒子和地獄傳送門內的紋理。- <紋理變數名>:定義一個紋理變數。可以是一個命名空間ID,也可以是另一個紋理變數(以#開頭)。
- elements:(可選,預設繼承父模型)列出模型的所有元素。這些元素只能為長方體形式。
- :一個元素。
- shade:(可選,預設為true)是否繪製陰影。
- rotation:(可選,預設無旋轉)設定元素的旋轉。
- angle:旋轉角度。只能為
-45
、-22.5
、0
、22.5
和45
。 - axis:旋轉軸,可以為
x
、y
和z
。 - origin:設定旋轉中心。
- :旋轉中心在某個軸上的座標。
- rescale:(可選,預設為false)是否縮放為整個長方體大小。
- angle:旋轉角度。只能為
- from:指定一個模型元素長方體的起始點。數值必須為-16到32之間。
- :長方體在某個軸上的座標。
- to:指定一個模型元素長方體的終點。數值必須為-16到32之間。
- :長方體在某個軸上的座標。
- faces:模型元素的所有面。若有一個面沒有定義,則不繪製此面。
- <面>:指定某一個面的屬性。面可以為
down
、up
、north
、south
、west
和east
。- uv:(可選,預設根據目前面自動設定區域)按照
[x1, y1, x2, y2]
的格式,指定所使用的紋理圖片的區域。若此值低於0或高於16,則紋理顯示將會不正常。若x1
和x2
座標對調,紋理也將會被翻轉(例:從原本的0, 0, 16, 16
變為16, 0, 0, 16
)。- :一個紋理座標。
- texture:指定所使用的紋理變數(以#開頭)。
- tintindex:(可選,預設為-1)使用硬編碼的著色索引對紋理重新著色。只有下方列出的方塊可以著色,其他方塊設定此項無效。如果設定為-1,則不進行重新著色。
- rotation:(可選,預設為0)根據特定的角度旋轉紋理。可以為0、90、180或270。旋轉不會影響到uv所指定的紋理部分,而是此面的旋轉角度。
- cullface:(可選,預設為目前面的同側)指定當這個方塊與指定方向上與毗鄰方塊接連時,這個面是否無需繪製。同時該面的亮度計算也等同於方塊的指定面。方向可以為
down
、up
、north
、south
、west
和east
。
- uv:(可選,預設根據目前面自動設定區域)按照
- <面>:指定某一個面的屬性。面可以為
- :一個元素。
- overrides:指定基於物品標籤述詞而覆寫不同的模型,僅對於方塊所對應的物品有效。所有情況都按從上到下的順序進行檢測,直到有完全匹配的述詞並覆蓋本模型。
方塊 | 著色索引 | 描述 |
---|---|---|
粉瓣花 | 除0以外的數字 | 用於植物著色 |
草 芒草 大型蕨類 蕨 蕨盆栽 甘蔗 藤蔓 草地 橡木樹葉 黑橡木樹葉 叢林木樹葉 相思木樹葉 紅樹林木樹葉 |
任意 | |
樺木樹葉 | 用於樹葉著色,固定為 #80A755 | |
杉木樹葉 | 用於樹葉著色,固定為 #619961 | |
水 氣泡柱 裝水的鍋釜 |
用於水體著色 | |
紅石線 | 用於紅石線等級著色 | |
西瓜梗 南瓜梗 |
用於莖年齡著色 | |
連接的西瓜梗 連接的南瓜梗 |
固定為 #E0C71C | |
荷葉 | 固定為 #208030 |
示例:直立的火把[]
為簡單起見,此示例只介紹直立的火把,代碼由儲存於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": "#bottom", "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/<命名空间>/models/item
下存放著所有的物品模型檔案。檔案的名字為硬編碼,因此不應修改檔案名。
物品模型使用了方塊模型的格式,只在父模型上有差別。物品模型可以繼承於一個方塊模型,這樣在繪製時會自動生成對應方塊的圖示;也可以使用對應方塊實體的模型,此時需要繼承或間接繼承builtin/entity
;或者直接或間接繼承builtin/generated
,這時需要在物品模型內定義紋理變數layer0
、layer1
、layer2
、layer3
和layer4
(除layer0
外都可以省略),用於指定各個繪製層。下表中物品的部分繪製層可以進行著色。
物品 | 繪製層 | 描述 |
---|---|---|
草 芒草 大型蕨類 蕨 藤蔓 草地 |
0-4 | 固定為 #7CBD6B |
橡木樹葉 黑橡木樹葉 叢林木樹葉 相思木樹葉 |
固定為 #48B518 | |
紅樹林木樹葉 | 固定為 #92C648 | |
樺木樹葉 | 固定為 #80A755 | |
杉木樹葉 | 固定為 #619961 | |
荷葉 | 固定為 #71C35C | |
生怪蛋 | 用於生怪蛋顏色,0層為背景色,1-4層為前景色 | |
藥水箭 | 0 | 用於藥水箭顏色 |
藥水 飛濺藥水 滯留藥水 |
用於藥水的顏色 | |
皮革帽子 皮革上衣 皮革褲子 皮革靴子 皮革馬鎧 |
用於皮革盔甲的顏色 | |
火藥球 | 1 | 用於火藥球的顏色 |
地圖 | 1-4 | 用於地圖上的顏色 |
示例:平面床[]
這個例子用舊版本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
中引用的紋理名稱相匹配。
示例:立體床[]
這個例子用新版本Java版找到的紋理替換物品床的繪製,比如。這個檔案由位於assets/minecraft/models/item
資料夾下的兩個檔案「red_bed.json
」和「template_bed.json
」共同決定:
{
"parent": "minecraft:item/template_bed",
"textures": {
"particle": "minecraft:block/red_wool"
}
}
{
"parent": "builtin/entity",
"display": {
"thirdperson_righthand": {
"rotation": [ 30, 160, 0 ],
"translation": [ 0, 3, -2],
"scale":[ 0.23, 0.23, 0.23]
},
"firstperson_righthand": {
"rotation": [ 30, 160, 0 ],
"translation": [ 0, 3, 0],
"scale":[ 0.375, 0.375, 0.375]
},
"gui": {
"rotation": [ 30, 160, 0 ],
"translation": [ 2, 3, 0],
"scale":[ 0.5325, 0.5325, 0.5325]
},
"ground": {
"rotation": [ 0, 0, 0 ],
"translation": [ 0, 1, 2],
"scale":[ 0.25, 0.25, 0.25]
},
"head": {
"rotation": [ 0, 180, 0 ],
"translation": [ 0, 10, -8],
"scale":[ 1,1,1 ]
},
"fixed": {
"rotation": [ 270, 0, 0 ],
"translation": [ 0, 4, -2],
"scale":[ 0.5, 0.5, 0.5]
}
}
}
此處的例子中,parent
被設定為builtin/entity
,表示這個物品模型由實體模型載入而來。其紋理存放在assets/minecraft/textures/entity/bed
。
其中,
thirdperson_righthand
:第三人稱慣用手時的顯示方式。thirdperson_lefthand
:第三人稱非慣用手時的顯示方式(此處未出現)。未註明,則預設使用第三人稱慣用手時的左右對稱形式。firstperson_righthand
:第一人稱慣用手時的顯示方式。firstperson_lefthand
:第一人稱非慣用手時的顯示方式(此處未出現)。未註明,則預設使用第一人稱慣用手時的左右對稱形式。gui
:在物品欄時的顯示方式。ground
:掉落物形式的顯示方式。head
:戴在頭上時的顯示方式。fixed
:物品展示框的顯示方式。
物品標籤述詞[]
有些物品可以使用額外的標籤進行模型覆寫的判斷,當標籤返回的值大於等於述詞內定義的值時此述詞透過。以下為可用的標籤列表。
"angle"
:(羅盤和回生羅盤,取值0-1)羅盤的角度。當羅盤與指向的位置不在同一個維度或在不能使用羅盤的維度中時角度隨機,當羅盤不在實體身上時為0,其他情況下代表指向的角度。"blocking"
:(盾牌,取值0或1)當盾牌正在格擋時為1,否則為0。"broken"
:(鞘翅,取值0或1)鞘翅損壞時為1,否則為0。"brushing"
:(刷子,取值0-1)刷子清刷的剩餘程度,如果沒有使用刷子則為0。"cast"
:(釣竿,取值0或1)當釣竿浮標已拋出時為1,否則為0。"charged"
:(弩,取值0或1)當弩裝填了投射物時為1,否則為0。"cooldown"
:(所有物品,取值0-1)物品的冷卻百分比,如果物品不在玩家物品欄則為0。"custom_model_data"
:(所有物品)返回物品NBT標籤內的 tag.CustomModelData。這個數字在內部轉化為單精度浮點數,導致此值在超過16777216時損失精度。如果物品不存在這個標籤,則返回0。"damage"
:(所有物品,取值0-1)物品的損壞程度。"damaged"
:(所有物品,取值0或1)物品未損壞或無法損壞時為0,否則為1。"filled"
:(束口袋,取值0-1)束口袋的填充程度。如果束口袋內沒有物品為0,如果束口袋已滿則為1。"firework"
:(弩,取值0或1)當弩裝填了煙火時為1,否則為0。"lefthanded"
:(所有物品,取值0或1)當物品在非慣用手為1,否則為0。"level"
:(光源方塊,取值0-1)光源方塊的亮度等級。按照亮度分為16個等級,每一等級增量1⁄16。當光源方塊物品不存在亮度等級標籤時為1。"pull"
:(弓和弩,取值0-1)弓或弩被拉伸的程度,沒有拉伸為0,滿弦為1。"pulling"
:(弓,取值0或1)弓被拉伸時為1,否則為0。"throwing"
:(三叉戟,取值0或1)當三叉戟正在被準備拋出時為1,否則為0。"time"
:(時鐘,取值0-1)代表一天中的時間。當在不能使用時鐘的維度時隨機。"tooting"
:(山羊角,取值0或1)當山羊角被玩家吹響時為1,否則為0。"trim_type"
:(所有物品,取值0-1)盔甲紋樣類型。當物品不是可紋飾的盔甲或世界沒有載入啟用1.20內建資料包時為0。各個數字代表的鍛造原材料如下表所示:
鍛造原材料 | 對應數字 |
---|---|
地獄石英 | 0.1 |
鐵錠 | 0.2 |
獄髓錠 | 0.3 |
紅石粉 | 0.4 |
銅錠 | 0.5 |
金錠 | 0.6 |
綠寶石 | 0.7 |
鑽石 | 0.8 |
青金石 | 0.9 |
紫水晶碎片 | 1 |
示例:火把[]
此例子是火把作為物品時的顯示模型。模型為存放在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"
。
歷史[]
段落中某些資訊已經不符合目前版本情況。
Java版 | |||||
---|---|---|---|---|---|
1.7.2 | 13w36a | 花現在像高草一樣,不會位於方塊正中央。 | |||
1.8 | 14w06a | 加入了自訂方塊模型。 | |||
14w07a | 重寫模型格式。現在不僅有「平面」,而是有「平面」和「長方體」。對象的旋轉也被限制為每個對象以22.5度遞增的方向旋轉。 | ||||
14w11a | 固體方塊上的光照不再使方塊內部的部分完全變黑。 | ||||
14w11b | 通用方塊現在載入模型,而不是預設的形狀。 | ||||
2014年4月12日 | 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"標籤現在可以共存,儘管頂級的elements標籤覆蓋了之前的整個elements標籤。 | |||||
刪除停用備用方塊模型的選項。 | |||||
1.14 | 18w43a | 加入了新的物品模型屬性"custom_model_data" 。 | |||
1.15 | 19w39a | 物品欄中的方塊光照由右暗改為左暗。 | |||
19w40a | 物品欄中方塊的光照改回了右暗,即為19w39a之前形式。 |
版本 | |||||||
---|---|---|---|---|---|---|---|
開發週期 |
| ||||||
技術 |
| ||||||
多人遊戲 | |||||||
遊戲訂製 |
語言