- Версия(и) Minecraft
- 1.12.х
В этой главе я покажу, как создать блок, который визуализирует статическую модель, экспортированную из Blender или любой-другой 3D-программы, которая поддерживает файлы WaveFront .obj.
Результат выглядит так:
Первое, что вам нужно сделать, это добавить в ваш
Это гарантирует, что obj загрузчик знает о вашем моде.
Затем делаем сам блок:
Затем необходимо создать состояние блока как обычно (blockstates/modelblock.json). Здесь вместо того, чтобы использовать другой. json файл в качестве модели, мы напрямую используем .obj модель, экспортированную в данном случае из Blender. Поскольку Blender и Forge весьма не согласны с вертикальной координатой текстуры (ось "v"), вам нужно добавить атрибут
OBJ файл, экспортированный из Blender должен быть помещён к моделям в каталог: "models/block/model.obj". Обратите внимание, что вам также нужен файл model.mtl, который также экспортирует blender, но вы должны изменить его так, чтобы все ссылки на текстуры теперь использовали стандартный формат <modid>: <name>:
Другой способ добавления текстур через .json файл состояния блока, путем добавления текстурных карт. Одним из преимуществ является то, что вы можете повторно экспортировать файл .mtl без добавления строки
Результат выглядит так:
Первое, что вам нужно сделать, это добавить в ваш
ClientProxy.preInit ()
следующий код:
ClientProxy.java:
public static class ClientProxy extends CommonProxy {
@Override
public void preInit(FMLPreInitializationEvent e) {
super.preInit(e);
OBJLoader.INSTANCE.addDomain(MODID);
...
}
}
Затем делаем сам блок:
ModelBlock.java:
public class ModelBlock extends Block {
public ModelBlock() {
super(Material.ROCK);
setUnlocalizedName(ModTut.MODID + ".modelblock");
setRegistryName("modelblock");
}
@SideOnly(Side.CLIENT)
public void initModel() {
ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(this), 0, new ModelResourceLocation(getRegistryName(), "inventory"));
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess worldIn, BlockPos pos, EnumFacing side) {
return false;
}
@Override
public boolean isBlockNormalCube(IBlockState blockState) {
return false;
}
@Override
public boolean isOpaqueCube(IBlockState blockState) {
return false;
}
}
Затем необходимо создать состояние блока как обычно (blockstates/modelblock.json). Здесь вместо того, чтобы использовать другой. json файл в качестве модели, мы напрямую используем .obj модель, экспортированную в данном случае из Blender. Поскольку Blender и Forge весьма не согласны с вертикальной координатой текстуры (ось "v"), вам нужно добавить атрибут
flip-v
:
modelblock.json:
{
"forge_marker": 1,
"defaults": {
"custom": { "flip-v": true },
"model": "modtut:model.obj"
},
"variants": {
"normal": [{}],
"inventory": [{}]
}
}
OBJ файл, экспортированный из Blender должен быть помещён к моделям в каталог: "models/block/model.obj". Обратите внимание, что вам также нужен файл model.mtl, который также экспортирует blender, но вы должны изменить его так, чтобы все ссылки на текстуры теперь использовали стандартный формат <modid>: <name>:
model.mtl:
newmtl None
Ns 0
Ka 0.000000 0.000000 0.000000
Kd 0.8 0.8 0.8
Ks 0.8 0.8 0.8
d 1
illum 2
map_Kd modtut:blocks/modeltexture
Другой способ добавления текстур через .json файл состояния блока, путем добавления текстурных карт. Одним из преимуществ является то, что вы можете повторно экспортировать файл .mtl без добавления строки
map_Kd
каждый раз. Ваш файл .mtl в таком случае должен будет содержать хотя бы одну строку "newmtl [name]". Чтобы отобразить текстуру, добавьте "#[name]" к текстурной карте. Вместо предыдущего примера, где вы добавили строку map_Kd
, вы можете просто изменить состояние блока следующим образом:
modelblock.json:
{
"forge_marker": 1,
"defaults": {
"custom": { "flip-v": true },
"model": "modtut:model.obj",
"textures": {
"#None": "modtut:blocks/modeltexture"
}
},
"variants": {
"normal": [{}],
"inventory": [{}]
}
}