关于 blockbench-vanilla-textures
blockbench-vanilla-textures 是面向 Blockbench 建模流程的技能,可从 Mojang 的 Bedrock 资源中查找并导入原版纹理。它提供纹理解析、着色、平铺和 PBR 资源处理指引,纹理也可用于 Java 与通用模型。
主要功能
- 01搜索并获取原版纹理
- 02解析方块各面的纹理映射
- 03处理着色、平铺与动画纹理
- 04导入纹理并设置 UV
- 05获取 PBR 纹理集
适用场景
- 01为 Blockbench 模型使用 Minecraft 原版贴图
- 02为大型模型面预先平铺纹理
- 03为目标版本整理纹理名称与路径
- 04检查模型面的纹理映射是否正确
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jasonjgardner/ blockbench-mcp-project --skill blockbench-vanilla-textures安装后在 Claude Code 中输入/blockbench-vanilla-textures确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/names-tints-and-animation.mdscripts/tint_texture.pyvanilla_texture.mjs详细介绍
Blockbench 原版纹理
使用 Mojang 自己的纹理文件,而不是绘制或生成仿制品。来源:Mojang/bedrock-samples(resource_pack/textures/...),由 jsDelivr 提供:
https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@<ref>/resource_pack/textures/blocks/brick.png
<ref> 可以是 main 或类似 v1.26.50.4 的发行标签。需要确保结果可复现时,请固定使用某个标签。名称采用 Bedrock 版名称,但除了极少数方块外,像素画都与 Java Edition 一致,因此重命名后,这些文件也适用于 Java 和通用模型。
修改项目之前,请先加载 blockbench-use;了解 UV 详情,请加载 blockbench-texturing。
**许可:**这些文件 © Mojang AB,受 Minecraft EULA 约束。它们适用于 Minecraft 内容、附加包、资源包和个人作品。如果用户计划在 Minecraft 以外出售模型,或将这些纹理打包进非 Minecraft 资源包,请告知一次并由用户决定。不要移除清单记录的署名信息。
1. 将请求映射到原版方块
将主题转换为方块 ID:砖墙对应 brick_block,原木小屋对应 oak_log 和 oak_planks,城堡对应 stone_bricks 和 cobblestone。只有名称确实含糊不清(如“石头”或“木头”),且选择会影响外观时才询问。否则,选择最明显的方块并说明所选内容。方块 ID 会解析各面的纹理,包括原木顶面、草方块顶面和工作台正面。Java ID 大多可用;例外项(bricks → brick_block、grass_block → grass……)见名称、色调与动画。
2. 获取
运行随附的解析器(需要 Node 18+ 或 Bun,无依赖)。脚本路径相对于此技能文件夹。
node scripts/vanilla_texture.mjs search brick # find IDs/keys
node scripts/vanilla_texture.mjs fetch brick_block oak_log grass --out <workspace>/textures/vanilla
node scripts/vanilla_texture.mjs fetch grass oak_leaves --carried --out <dir> # pre-tinted inventory art
node scripts/vanilla_texture.mjs fetch brick_block --pbr --out <dir> # + texture_set.json, MERS, normal
node scripts/vanilla_texture.mjs fetch entity/pig/pig --out <dir> # any path under textures/
node scripts/vanilla_texture.mjs search zombie --tree --out <dir> # entities/UI: one GitHub API call, cached
它会输出并保存 <out>/vanilla_manifest.json。请使用以下字段:
requests[].faces:Blockbench 面 → 图集键。requests[].atlas_keys[key].path:每个键对应的文件。textures[]:本地file(绝对路径)、width/height、format(png或tga)、frames、ticks_per_frame、tint、variants和texture_set图层。
请读取清单,不要猜测文件名。
已知单个文件时,无需运行脚本:
curl -fsSLo brick.png https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png
iwr https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png -OutFile brick.png
某些彩色纹理仅以 .tga 格式提供,包括树叶、grass_side、仙人掌和蕨类植物。若请求 .png 返回 404,应尝试 .tga,脚本会自动处理。jsDelivr 的软件包目录 API 会因该仓库过大而拒绝请求,因此需通过 blocks.json、terrain_texture.json、item_texture.json 或 GitHub 树(--tree)进行查找。
**保存位置:**将模型会保留的文件放入用户的资源工作区,例如 textures/vanilla/,而不要放在临时文件夹中。Blockbench 会记住导入文件的路径,并能在保存项目时将纹理写回该路径。导入后切勿直接修改下载的文件;色调和图块等编辑应另存为新文件。
3. 准备:着色、平铺、动画
导入前,检查清单中的每一项:
- 已设置
tint: 贴图为灰度图,Minecraft 会根据生物群系为其着色(草顶、树叶、藤蔓、水)。可以使用--carried获取预先着色的版本,或运行python scripts/tint_texture.py <in> <out> --color "#91BD59"。使用--colormap <colormap/grass.png> --temperature T --downfall D来匹配生物群系。需要 Pillow。 grass_side.tga的 alpha 是着色遮罩,不是透明度。 请改为导入blocks/grass_side_carried,或运行tint_texture.py ... --overlay。- 大面: 原版的比例为每个方块 16 px,也就是每个 Blockbench 单位 1 px。不要将一张 16×16 的贴图拉伸到 48 单位宽的面上,否则砖块会显得巨大。可以为每个方块使用一个 16 单位的元素,或预先平铺贴图:
tint_texture.py brick.png brick_3x2.png --tile 3x2会生成适用于 48×32 单位面的 48×32 px 贴图。预平铺适用于通用、Bedrock 实体和 glTF 目标。Java 方块和物品模型需要正方形的 16×16 贴图(较高的图像会被视为翻页动画),因此应在这些模型中为每个方块使用一个元素,并保留原始文件。 frames> 1 表示垂直翻页动画,例如水、熔岩或海晶灯。将 UV 映射到单帧,并按照翻页动画贴图设置播放和导出元数据。
着色颜色、生物群系参数和完整的翻页动画列表见名称、着色和动画。
4. 导入并分配
- 导入每个文件,使用
create_texture: name="brick", data="<absolute file path>"。文件路径需要 Blockbench 桌面版,且可加载 PNG 和 TGA。在 Blockbench 网页版中,或无法访问文件时,改为传入data:image/png;base64,...URL。数据 URL 必须可由浏览器解码,因此请先将 TGA 转换为 PNG,例如使用 Pillow。若导入的路径已加载,系统会拒绝导入;请改为复用该贴图。对于使用per_texture_uv_size的格式,传入与像素尺寸相同的uv_width/uv_height,以便 UV 坐标使用像素单位。 - 整个元素使用一种贴图: 使用
apply_texture: id=<element>, texture=<name>, applyTo="all"。 - 不同面使用不同贴图(原木、草、熔炉、工作台):使用
set_cube_uv,并按照requests[].faces设置faces: { up: { uv: [0,0,16,16], texture: "log_oak_top" }, north: { …, texture: "log_oak" }, … }。网格使用set_mesh_uv。blocks.json将熔炉、南瓜和类似方块的南面命名为正面;请旋转元素或交换面,让正面朝向观察者。 - 盒式 UV 格式(Bedrock 实体、Java 实体)会将每个立方体的一张贴图放入盒状布局中,因此无法直接使用分开的 16×16 方块贴图。若格式支持,请将元素切换为逐面 UV;否则将贴图块打包到图集,并将各面映射到对应矩形区域。
- 透明贴图(玻璃、树叶、门)需要使用目标的裁剪或混合设置。请参阅贴图处理技能。
在 Blockbench 中获取贴图。 jsDelivr 会发送 Access-Control-Allow-Origin: *,因此即使 Agent 没有 shell,或 shell 无法访问 Blockbench 的文件系统,Blockbench 也可以自行下载 PNG。risky_eval 会等待表达式执行,因此请将代码封装在会返回数据 URL 的异步 IIFE 中,然后将该 URL 传给 create_texture。对于 risky_eval,请遵循仓库的授权规则。
(async () => {
const response = await fetch("https://cdn.jsdelivr.net/gh/Mojang/bedrock-samples@main/resource_pack/textures/blocks/brick.png");
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const blob = await response.blob();
return await new Promise(resolve => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.readAsDataURL(blob); });
})()
原版方块贴图只有几百字节,因此返回的数据 URL 很小。对于大型实体贴图和 TGA 文件,优先使用文件路径方式。
5. PBR(可选)
每个原版方块都附带 <name>.texture_set.json 和 <name>_mers.tga(金属度、自发光、粗糙度、次表面),部分方块还附带 _normal.tga 或 _heightmap.tga。使用 --pbr 获取这些文件,并将它们放在同一文件夹中,然后在桌面应用中调用 import_texture_set: path="<out>/blocks/brick.texture_set.json"。按照 PBR materials 中的说明进行分配和导出。带色调的颜色贴图仍需着色;为颜色文件着色,并将材质的颜色通道重新指向该文件。
6. 为目标版本准备资源
| 目标 | 操作 |
|---|---|
| Bedrock | 保留 Bedrock 名称和路径,例如 textures/blocks/brick。对于自定义方块,可以通过地形键引用原版纹理,而不必附带副本;请参见 材质实例 |
| Java | 在 assets/minecraft/textures/block/ 下将文件重命名为 Java 文件名(brick.png → bricks.png,planks_oak → oak_planks),或者在模型 JSON 中引用 minecraft:block/bricks,以使用游戏自带的纹理。为翻页纹理添加 .png.mcmeta |
| 通用 / glTF | 保留像素尺寸并使用最近邻过滤。将色调和平铺效果烘焙到图像中,因为运行时不会应用它们 |
7. 验证
- 运行
list_textures,确认每个纹理的尺寸和 UV 尺寸。 - 运行
get_cube_uv或get_mesh_info,确认每个面都显示texture_status: "resolved",且使用了预期的纹理。 - 截取屏幕截图。检查砖块或木板的比例是否与 16 单位参考相符,确认带色调的纹理不是灰色,检查透明效果是否仅出现在预期位置,并检查原木的端面是否位于两端。
操作示例:砖墙
“建模一面砖墙”(通用模型;3×2 格墙体,厚 4 单位):
- 运行
node scripts/vanilla_texture.mjs fetch brick_block --out ./textures/vanilla。清单显示blocks/brick.png,尺寸为 16×16,没有色调。 - 运行
python scripts/tint_texture.py ./textures/vanilla/blocks/brick.png ./textures/vanilla/brick_wall_3x2.png --tile 3x2,生成 48×32 的图像。 - 导入该图像:
create_texture name="brick_wall_3x2" data="<abs>/textures/vanilla/brick_wall_3x2.png"。当格式使用每个纹理独立的 UV 尺寸时,添加uv_width=48, uv_height=32。 - 放置立方体:
from [0,0,0],to [48,32,4]。 - 使用
set_cube_uv将每个面映射为每单位 1 像素,并全部使用brick_wall_3x2:north和south:[0,0,48,32]。up和down:[0,0,48,4]。east和west:[0,0,4,32]。
- 运行
get_cube_uv,确认每个面都已解析。截取屏幕截图,并检查一层砖的高度是否与原版 16 单位方块相符。
对于 Java 方块模型,用六个 16×16×4 的元素构建同一面墙。使用未经修改的 brick 纹理映射每个元素:大面使用 [0,0,16,16],边缘使用 [0,0,16,4] / [0,0,4,16]。