【翻译】McJty教程之1.9渲染方块baked模型
三三的小狐狸
2018年02月20日 23:28
收录于文集
共20篇

想要看代码高亮的可以去原文地址或者我的微信公众号(pearapple_2015)查看。

原文链接:https://wiki.mcjty.eu/modding/index.php?title=Render_Block_Baked_Model-1.9


在这个教程中我们将解释如何静态的渲染一个管道系统。由于我们需要动态的计算几何形状,这会需要一个烘焙了(baked)的模型。然而这个例子并不使用tile entity或者TESR(TileEntity特殊渲染器),这意味着这个结果将是静态的,并且只有当新的方块被添加或者移除时才会改变。这是方块的样子:

在这个方块能够运行之前,我们需要做一些事情。首先一个baked的模型可能在一个线程中被调用,所以它不能通过任何方式进入世界。这样你需要一个方法来把所有需要的信息的渲染从方块转换为baked模型。这一步是通过ExtendedBlockState类和一些没有列出的属性完成的。这些属性没有被转换为元数据(metadata),所以你不会被限制在方块保留的4位元数据。它也不是直接和方块保存在一起,所以你必须在区块渲染器需要它时进行计算。在这个例子中,我们需要6个boolean类型的值,来表明在给出的那一面是否有这个类型的另一个方块。首先,我们定义一个属性这样我们可以保存boolean类型的值。需要注意的是你可以设置任何类型的属性。我们也可以选择创建一个包含6个boolean类型变量的单一的属性(而不是六个属性,每个属性包含一个boolean类型的值)。

然后,我们把这个用在我们的方块里。需要注意的是initItemModel()这个方法需要在ClientProxy类的init()方法中被调用(相对的,initModel()则是在preInit()方法中被调用)。createBlockState()方法和getExtendedState()方法是用来将没有列出的属性和我们baked模型联系起来。我们重写了createBlockState()方法,这样我们可以创造一个额外方块状态(ExtendedBlockState)而不是普通的方块状态。getExtendedState()方法是我们基于邻近方块计算属性的位置。当静态几何在区块中渲染时,这个方法将会被我们的baked模型使用。

要让我们的baked模型正常运作,我们需要三个东西。首先,我们需要一个模型(IModel接口的实现)。这个只是用来创建我们的baked模型(IBakedModel接口的实现)的一种方式。baked模型才是真正起作用的。最后,我们需要一个自定义的模型加载器(ICustomModelLoader接口的实现),这样我们可以通过内部的json来加载我们新的模型。

我们也需要我们自定义的模型加载器。这个加载器只支持我们这个单独的模型,但是你也可以很容易的扩展这个类来支持更多的模型:

我们还要注册这个加载器:

现在我们需要定义我们的baked模型。这个有一点点的复杂,但是十分重要的是这个baked模型计算模型的面是基于来源于我们方块的输入状态。为了用这个支持多种不同的形式(因为我们不知道我们的模型会被如何定型),我们用了一个通用的putVertex()方法,这样我们可以自动的把一个点转换成恰当的格式:

在ModBlocks类中,我们需要定义一个新的入口来为我们已经定型的模型方块初始化物品的模型。initItemModels()方法必须在ClientProxy类的init()方法中被调用:

最后,尽管我们使用了一个已经定型的模型,我们仍然需要为方块状态和模型定义json。举个例子来说,用于物品栏的模型(显示在物品栏和背包中)以及一个多余的方块模型用于代替已经定型的模型。首先是方块状态(blockstates/bakedmodelblock.json):

然后是方块模型(models/block/bakedmodelblock.json):

最后是物品的模型(models/item/bakedmodelblock.json):