(注:本文开发环境为forge 1.12.2 rfg模板)

为什么要使用obj模型

众所周知,minecraft本身提供了一种模型格式,使用json来存储,但是限制非常多,比如基础单元是长方形而不是三角形;每个元素的旋转单位为22.5°;每个元素只能旋转一个轴等等。虽然原版的模型用这个格式就足够了,但是像科技枪,hbm这些有着特别精细的模型的mod是怎么做的呢?好在forge提供了obj模型的接口fabric没有,可以直接引入外部建模软件的obj模型。


如何引入obj模型

首先,你需要在你的主类里的preInit方法里调用 OBJLoader.addDomain(你的modid) 来告诉forge你要加载特殊格式的模型了。

@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
    OBJLoader.INSTANCE.addDomain(你的modid);
 }

然后将你的obj和mtl放到跟正常模型一样的路径里,forge会自动读取它们,这里需要注意几点:

  • 1.确保obj和mtl里的物体和材质名称是ASCLL字符 。

  • 2.obj和mtl文件的名称一样。

  • 3.所有UV坐标都不大于1,虽然在建模软件里可以将UV坐标拉到贴图外边以起到不动贴图改比例的效果,但在mc里会直接报错!

  • 4将.mtl文件里的贴图路径改为MC的ResourceLocation格式,比如modid:贴图。

  • 5.模型的三角面数不宜过多,否则游戏会特别卡!

  • 6.注意在引用模型时将.obj后缀明确指出,否则forge就会去找一个同名的json文件。

  • 7.在外部软件创建的模型可能v轴反转了,你可能需要将模型再翻转回去。

让obj模型动起来

当你的模型出现到游戏后,你可能又会想到hbm里旋转的大飞轮,这是怎么做到的?

不幸的是,大家耳熟能详的GeckoLib并不支持obj模型,目前支持obj的动画库似乎只有LLibrary,还有HBM和flan自己内置了个动画库,而且HBM还有对应的blender插件,可以依照它们的许可证来使用这些代码,当然你也可以选择重写TileEntitySpecialRenderer的render方法(其实更推荐forge的FastTESR,性能更好,只不过不能直接访问opengl)来直接操纵底层渲染管线来做动画会有亿点点复杂

最后再提醒大家一句,尽量不要往游戏里塞过多的obj模型,毕竟mc的底子摆在那了,塞一堆会让你的模组变得优化稀烂。