根变换

根变换

在模型 JSON 的顶层添加 transform 条目,会提示加载器对所有几何体应用变换:方块模型在方块状态文件中的旋转之前应用;物品模型在显示变换之前应用。在 IUnbakedGeometry#bake() 中可通过 IGeometryBakingContext#getRootTransform() 获取该变换。自定义模型加载器可以完全忽略此字段。

模型根变换在方块状态旋转或物品显示变换之前应用;分元素形式按文档顺序组合平移、左旋转、缩放、右旋转,并指定原点。

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

根变换可用两种格式指定:

  1. 包含单个 matrix 条目的 JSON 对象,以嵌套数组表示原始变换矩阵,省略最后一行(3×4 矩阵,行主序)。该矩阵依次组合平移、左旋转、缩放、右旋转和变换原点。结构示例:

    "transform": {
      "matrix": [
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0]
      ]
    }
    
  2. 包含以下可选条目的任意组合的 JSON 对象:

    • origin:旋转和缩放的原点。
    • translation:相对平移。
    • rotation 或 left_rotation:缩放前围绕平移后原点旋转。
    • scale:相对于平移后原点的缩放。
    • right_rotation 或 post_rotation:缩放后围绕平移后原点旋转。

分元素指定

若以这些条目的组合指定变换,按 translation、left_rotation、scale、right_rotation 的顺序应用,最后将变换移动到指定原点。(原文此处称“选项 4”,但上方实际列有两种格式。)

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

{
  "transform": {
    "origin": "center",
    "translation": [0, 0.5, 0],
    "rotation": { "y": 45 }
  },
  // ...
}

原点

原点可以是三个浮点数构成的三维向量 [x, y, z],或以下默认值之一:"corner" 为 (0, 0, 0),"center" 为 (0.5, 0.5, 0.5),"opposing-corner" 为 (1, 1, 1)。未指定时默认为 "opposing-corner"。

平移

平移必须是三个浮点数构成的三维向量 [x, y, z],未指定时默认为 (0, 0, 0)。

左旋转和右旋转

旋转可用以下四种方式之一指定:

  • 单个 JSON 对象,将一个轴映射到旋转角度:{ "x": 90 }。
  • 任意数量的上述对象组成的数组,按指定顺序应用:[ { "x": 90 }, { "y": 45 }, { "x": -22.5 } ]。
  • 三个浮点数的数组,以角度指定各轴旋转:[90, 180, 45]。
  • 四个浮点数的数组,直接指定四元数:[0.38268346, 0, 0, 0.9238795],此例相当于绕 X 轴旋转 45 度。

未指定时默认不旋转。

缩放

缩放必须是三个浮点数构成的三维向量 [x, y, z],未指定时默认为 (1, 1, 1)。

原文:Root Transforms。