前阵子看到一个ModelEngine插件,用盔甲架来做自定义模型生物的,不过这个收费,也没看见具体实现,我自己试着实现下。(这模型确实很丑,我不咋会建模嘛)
支持从bbmodel中直接读取模型数据,生成资源包,使用函数生成模型集合,控制其运动*(这功能炸了)


具体原理就是,先读bbmodel文件,这个项目文件的格式和mc资源包的模型格式基本一致,处理很方便。而材质文件是base64的形式储存在bbmodel中的,解析一下也可以生成png。因此就可以做到根据bbmodel自动生成资源包。
比较复杂的是骨骼,bbmodel是支持多骨骼模型的,而在mc里面一个骨骼就得是一个模型,这样才能支持自由旋转移动。所以在读取中需要正确处理骨骼父子关系,这对于模型运动也非常重要。
再一个是旋转枢轴点,mc盔甲架的头盔会放在脖子上方,但旋转是脖子在转,所以我琢磨了半天得知这个距离是0.25方块,再加上头盔模型缩放1.6倍,因此需要向下偏移6.4,使得模型旋转中心和脖子重合。
然后生成的时候,根据每个骨骼的中心距离,计算出每个盔甲架应当处于的位置,然后生成即可还原一个bbmodel中的模型。
更加麻烦的地方在于动画,bbmodel的动画结构其实挺简单了,也是json。但是要形成盔甲架运动就需要把动画数据读到内存里面,分为移动和旋转,移动就是盔甲架移动,旋转则是headpose。这里父骨骼模型的移动旋转也会影响到子物体的移动旋转。因此需要抽象多层逻辑,最终再把所有运动偏移量的总和应用到每tick的实体移动中。
动画中的模型移动只是基础,它的上层逻辑是动画状态机,需要用它储存动画播放的进度、速度、以此才能算出每tick的运动插值,而动画和动画之间也有切换关系,这都需要进行考虑。
而我贪图reload方便用lua来搞这个玩意,最后动画方面的数据结构实在太复杂,一堆bug,我还是切到java好了。。
此外这个demo是基于packet的,服务端这边只存这些盔甲架的entity id和相应的运动数据。好处是假实体包并非真实体,坏处是实体API不能用了)