OBJ 模型
在这一节我我们将学习如何给方块添加OBJ物品模型,在开始添加OBJ模型之前强烈建议读者先阅读关于OBJ和MTL文件格式的定义以及相关名词的意义,这里有个简短的说明
首先创建我们的方块ObsidianOBJ.java
:
public class ObsidianOBJ extends Block {
public ObsidianOBJ() {
super(Properties.create(Material.ROCK).hardnessAndResistance(5).notSolid());
}
}
和之前创建的方法一致,因为我们创建的模型并不是实心的,所以加上了notSolid
方法。
方块注册:
public static RegistryObject<Block> obsidanObj = BLOCKS.register("obsidian_obj", () -> {
return new ObsidianOBJ();
});
物品注册:
public static RegistryObject<Item> obsidianObj = ITEMS.register("obsidian_obj", () -> {
return new BlockItem(BlockRegistry.obsidanObj.get(), new Item.Properties().group(ModGroup.itemGroup));
});
方块状态文件obsidian_obj.json
{
"variants": {
"": { "model": "neutrino:block/obsidian_obj" }
}
}
模型的Json模型文件obsidian_obj.json
{
"loader": "forge:obj",
"model": "neutrino:models/block/obsidian_obj.obj",
"flip-v": true
}
可以看到,从这里开始就有些特殊了,首先我们用loader
指定了我们要加载的模型是obj
格式的,然后在model
里具体指定了我们的OBJ模型,最后将flip-v
设置成为true
,这么做的原因是minecraft里的材质和你在blender等工具里的材质是上下颠倒的,所以你得手动翻转你的材质。
接下来是OBJ模型obsidian_obj.obj
,这里只标注需要修改的地方:
mtllib obsidian_obj.mtl
你必须在这里指明你要使用的mtl文件的名字。
接下来是mtl文件``obsidian_obj.mtl`,同样的我在这里只标注需要修改的地方。
map_Kd neutrino:block/obsidian_obj
你必须这样的方式来指定你模型文件的材质。
最后是我们的材质obsidian_obj.png
:
可以看到我们我们的OBJ模型已经成功加载出来了。当然我们在这里还没有设置正确的碰撞箱,这就交给读者自己实现了。
物品同样也是可以使用OBJ模型的,请读者自行探索。
常见坑的处理方法
环境光遮蔽
在默认情况下,你可能会发现你的模型有着像下图一样不自然的黑色阴影,这是因为环境光遮蔽导致的,你可以通过复写Block
类下的getAmbientOcclusionLightValue
方法来修改方块的环境光遮蔽,其中默认是0.2
,最大值为1
,数值越大环境光遮蔽越小。
夜晚不自然的高光
有时候你会发现你的模型在夜晚也会发出类似这样不自然的高光,这是由于mtl
文件中多余的属性导致的,对于Mod开发建议只保留map_Kd
属性,具体可以看IE的mtl文件。
开发小课堂
如果你在使用Blender制作OBJ模型,请将你的模型中心点设置为X:0.5m,Y-0.5m,Z:0.5
,这样你就不需要在json文件中进行额外的偏移计算了。Minecraft一个满方块在Blender里刚好是1m*1m*1m
。