模型加载器简介

自定义模型加载器

“模型”就是一个形状,可以是简单的立方体、多个立方体、截角二十面十二面体,或其他形状。大多数模型采用原版 JSON 格式;其他格式的模型在运行时由 IGeometryLoader 加载为 IUnbakedGeometry。Forge 提供 WaveFront OBJ 文件、桶、组合模型、不同渲染层的模型以及原版 builtin/generated 物品模型的重新实现等默认实现。大多数代码不关心模型由什么加载、使用什么格式,因为它们最终都以 BakedModel 表示。

自定义 IGeometryLoader 将模型加载为 IUnbakedGeometry,再烘焙为 BakedModel;OBJ 配套 MTL 应与 OBJ 同目录同名,纹理键可引用模型 JSON 的 textures。

原创说明图,依据 Forge 1.21.x 官方文档 绘制。

警告:通过模型 JSON 顶层 loader 指定自定义模型加载器后,elements 条目会被忽略,除非自定义加载器读取它。其他原版条目仍会加载并在未烘焙的 BlockModel 表示中可用,也可以在自定义加载器之外使用。

WaveFront OBJ 模型

Forge 为 .obj 格式提供加载器。使用时 JSON 必须引用 forge:obj。该加载器接受任何位于已注册命名空间且路径以 .obj 结尾的模型位置。要自动使用 .mtl 文件,应将其放在与 .obj 相同的位置,并使用相同名称。可能需要手动编辑 .mtl 中的路径,使其指向 JSON 中定义的纹理。

此外,纹理的 V 轴可能因创建模型的外部程序而颠倒,例如 V = 0 可能是底边而非顶边。可在建模程序中修正,或在模型 JSON 中设置:

以下带注释的示例用于说明结构;实际 JSON 文件不支持注释和省略号,应移除并补全。

{
  // 与 model 声明放在同一级
  "loader": "forge:obj",
  "flip_v": true,
  "model": "examplemod:models/block/model.obj",
  "textures": {
    // 可在 .mtl 中通过 #texture0 引用
    "texture0": "minecraft:block/dirt",
    "particle": "minecraft:block/dirt"
  }
}

原文:Custom Model Loaders。