烘焙模型(Baked Models)
BakedModel 是在代码中用于表示带有纹理的形状的对象。每一个模型 JSON 文件,在被反序列化为 UnbakedModel 后,都会通过某次对 UnbakedModel#bake 的调用,转化为这种可渲染的实体。一些 方块实体渲染器 也会用到烘焙模型。模型的复杂度理论上没有上限。
所有模型都存储在 ModelManager 中,可以通过 Minecraft.getInstance().modelManager 访问。之后,你可以调用 ModelManager#getModel,通过 ModelResourceLocation 获取指定的模型。模组通常都会复用之前自动加载并烘焙好的模型。
不要将这些和 物品模型 混淆,物品模型在渲染时会使用 BakedModel。
BakedModel 的方法(Methods of BakedModel)
getQuads
烘焙模型(baked model)中最重要的方法就是 getQuads。这个方法负责返回一组 BakedQuad,这些四边形数据会被发送到 GPU。四边形(quad)类似于建模程序(以及大多数其他游戏)中的三角形,不过由于 Minecraft 通常以方块为主,开发者选择用四边形(4 个顶点)而不是三角形(3 个顶点)来进行渲染。getQuads 方法有五个参数可用:
- 一个
BlockState:当前被渲染的 方块状态。可能为 null,表示正在渲染物品。 - 一个
Direction:当前被剔除(culling)的面的方向。可能为 null,表示应返回所有不会被遮挡的四边形。 - 一个
RandomSource:客户端专用的随机源,可用于随机化效果。 - 一个
ModelData:额外的模型数据。这里可能包含渲染时方块实体所需的附加数据。由BakedModel#getModelData提供。 - 一个
RenderType:用于渲染方块的 渲染类型。可能为 null,表示应返回该模型所有渲染类型的四边形。否则,它是BakedModel#getRenderTypes(见下文)返回的渲染类型之一。
模型应尽量进行缓存。这是因为,即使区块只会在内部方块发生变化时才重建,这个方法中的计算仍然需要尽可能快,并且由于每个区块分区(chunk section)会调用多次(每种渲染类型最多七次 × 该模型使用的渲染类型数量 × 每区块分区 4096 个方块),所以最好对结果进行大量缓存。此外,方块实体渲染器(BER) 或 实体渲染器 可能每帧会多次调用该方法。
applyTransform 和 getTransforms
applyTransform 方法允许你在对模型应用 透视变换(perspective transformation)时,执行自定义逻辑,甚至可以返回一个完全不同的模型。此方法由 NeoForge 添加,用于替代原版的 getTransforms() 方法。原版方法只允许你自定义变换本身,但无法控制变换的应用方式。而 applyTransform 的默认实现会委托给 getTransforms,因此如果你只需要自定义变换本身,也可以仅重写 getTransforms 即可。applyTransform 提供了三个参数:
- 一个
ItemDisplayContext:模型将要转换到的 透视。 - 一个
PoseStack:用于渲染的姿态堆栈。 - 一个
boolean:是否对左手渲染使用修改后的值(而不是默认的右手渲染);如果渲染的手是左手(副手,或在选项中启用左手模式时为主手),则为true。
applyTransform 和 getTransforms 只适用于物品模型(item models)。