// 移动物品 matrices.translate(0.5, 1.25 + offset, 0.5);
// 旋转物品 matrices.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion((blockEntity.getWorld().getTime() + tickDelta) * 4)); }</code> 最后,我们将获得Minecraft的
ItemRenderer
,并使用 renderItem
渲染唱片机物品。我们还将 ModelTransformation.Type.GROUND
传递给 renderItem
,因为我们希望有类似与物品置于地上的效果。尝试对此值进行试验,看看会发生什么(这是一个枚举)。在这些 GL 调用之后,我们还需要调用matrices.pop();
:
public void render(DemoBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { [...] MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Type.GROUND, light, overlay, matrices, vertexConsumers); // GL 调用之后的必要调用 matrices.pop(); }您现在就可以尝试新创建的方块实体渲染器。但是,如果您没有使方块透明,您会发现有些不对劲——这个浮动的方块,即唱片机,是黑色的!这是因为默认情况下,无论您在方块实体中渲染什么,都将接收该方块实体所在位置的光照度。所以浮动的方块接收这个不透明方块内部的光照,这意味着接收不到光。为了解决此问题,我们会让Minecraft接收方块实体上方位置的光照强度。 要获取光照,我们在方块实体上方的位置调用
WorldRenderer#getLightmapCoordinates();
,并在renderItem()
使用这个光照。
@Override public void render(DemoBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { [...] int lightAbove = WorldRenderer.getLightmapCoordinates(blockEntity.getWorld(), blockEntity.getPos().up()); MinecraftClient.getInstance().getItemRenderer().renderItem(stack, ModelTransformation.Mode.GROUND, lightAbove, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers); [...] }唱片机现在应该得到了适当的光照。