变换
当 BakedModel 作为物品渲染时,可以根据渲染变换进行特殊处理。“变换”指模型的渲染上下文,代码中由 ItemDisplayContext 枚举表示。
原创说明图,依据 Forge 1.21.x 官方文档 绘制。
处理变换有两套系统:已弃用的原版系统由 BakedModel#getTransforms、ItemTransforms 和 ItemTransform 构成;Forge 系统使用 IForgeBakedModel#applyTransform。原版代码已打补丁,尽可能优先使用 applyTransform。
ItemDisplayContext
NONE:未设置上下文时默认用于展示实体;Forge 也在Block的RenderShape为#ENTITYBLOCK_ANIMATED时使用。THIRD_PERSON_LEFT_HAND、THIRD_PERSON_RIGHT_HAND、FIRST_PERSON_LEFT_HAND、FIRST_PERSON_RIGHT_HAND:第一人称值表示玩家自己持有物品;第三人称值表示客户端以第三人称看到另一名玩家持有物品。名称中的左右手表示对应手。HEAD:玩家在头盔槽穿戴物品,例如南瓜。GUI:在Screen中渲染物品。GROUND:在世界中作为ItemEntity渲染。FIXED:用于物品展示框。
原版方式
原版通过 BakedModel#getTransforms 处理变换。该方法返回 ItemTransforms,它是一个简单对象,以 public final 字段保存多个 ItemTransform。每个 ItemTransform 表示应用于模型的旋转、平移和缩放。ItemTransforms 为除 NONE 外的每个 ItemDisplayContext 保存一个变换。原版实现中,以 NONE 调用 #getTransform 会得到默认变换 ItemTransform#NO_TRANSFORM。
Forge 已弃用整套原版变换系统。多数 BakedModel 实现的 #getTransforms 应直接返回 ItemTransforms#NO_TRANSFORMS(默认实现如此),转而实现 #applyTransform。
Forge 方式
Forge 使用打补丁加入 BakedModel 的 #applyTransform,取代 #getTransforms。
BakedModel#applyTransform
该方法接收 ItemDisplayContext、PoseStack 和一个表示是否应用左手变换的布尔值,生成待渲染的 BakedModel。返回值可以是全新模型,因此比原版方式灵活,例如纸张在手中看起来平整、落在地上时呈皱团状。
原文:Transform。