この記事は1.8のブロック追加を読んだ事を前提としています。 |
この記事は"Minecraft Forge Universal 11.14.4.1563~"を前提MODとしています。 |
簡単なOBJモデル利用ブロックの追加方法
目次
ブロックの追加
注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。
通常のブロック追加と同様の箇所の解説は省きます。1.8のブロック追加を参照のこと。
ソースコード
- SampleOBJMod.java
package com.example.examplemod; import net.minecraft.block.Block; import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.item.Item; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.registry.GameRegistry; /** * Modエントリークラス */ @Mod(modid = SampleOBJMod.MOD_ID, name = SampleOBJMod.MOD_NAME, version = SampleOBJMod.MOD_VERSION, dependencies = SampleOBJMod.MOD_DEPENDENCIES, acceptedMinecraftVersions = SampleOBJMod.MOD_ACCEPTED_MC_VERSIONS, useMetadata = true) public class SampleOBJMod { /** ModId文字列 */ public static final String MOD_ID = "sampleobjmod"; /** MOD名称 */ public static final String MOD_NAME = "SampleOBJMod"; /** MODのバージョン */ public static final String MOD_VERSION = "0.0.1"; /** 早紀に読み込まれるべき前提MODをバージョン込みで指定 */ public static final String MOD_DEPENDENCIES = "required-after:Forge@[1.8-11.14.4.1563,)"; /** 起動出来るMinecraft本体のバージョン。記法はMavenのVersion Range Specificationを検索すること。 */ public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]"; /** ブロック登録名 */ public static final String BLOCK_REGISTER_NAME = "sample_obj_block"; /** このクラスのインスタンス。GUI実装するなどしなければ不要。他のMODのエントリークラスのインスタンスも取得可能 */ @Mod.Instance(MOD_ID) public static SampleOBJMod INSTANCE; /** サンプルブロックのインスタンス */ public static Block sampleOBJModelBlock; /** PreInitialization処理。ブロック・アイテムの登録、Messageクラスの登録、ItemMeshDefinition、CustomStateMapperの登録を行う */ @EventHandler public void preInit(FMLPreInitializationEvent event) { /* ブロックのインスタンス生成 */ sampleOBJModelBlock = new SampleOBJBlock(); /*ブロックの登録。登録文字列はMOD内で被らなければ何でも良い。*/ GameRegistry.registerBlock(sampleOBJModelBlock, BLOCK_REGISTER_NAME); if (event.getSide().isClient()) { /* OBJファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */ OBJLoader.instance.addDomain(MOD_ID); /*手持ち描画用のModelResourceLocation登録*/ ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleOBJModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory")); } } }
- SampleOBJBlock.java
package com.example.examplemod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; public class SampleOBJBlock extends Block { /** * コンストラクタ */ public SampleOBJBlock() { super(Material.ground); /*ブロックの内部名設定*/ this.setUnlocalizedName("blockSampleOBJ"); /*クリエイティブタブ設定*/ this.setCreativeTab(CreativeTabs.tabBlock); /*ブロックの大きさを設定*/ this.setBlockBounds(0.25F, 0, 0.25F, 0.75F, 0.625F, 0.75F); } /** * 通常のブロックの形かどうか * @return true:通常のブロックと同じ。false:違う場合。 */ @Override public boolean isNormalCube() { return false; } /** * 1*1*1の大きさのブロックかどうか * @return true:1*1*1の立方体、false:違う場合。 */ @Override public boolean isFullCube() { return false; } /** * 不透過ブロックかどうか。 * @return true:不透過。false:透過 */ @Override public boolean isOpaqueCube() { return false; } }
- sample_obj_block.json
assets/sampleobjmod/blockstates/sample_obj_block.json
{ "forge_marker": 1, "defaults": { "model": "sampleobjmod:sample_obj_block.obj", "transform": "forge:default-block" }, "variants": { "normal": [{}], "inventory": [{}] } }
- sample_obj_block.obj
assets/sampleobjmod/models/block/sample_obj_block.obj
# mtllib 使用するマテリアル定義ファイル(.mtl) mtllib sample_obj_block.mtl # 頂点の定義 v 0.250000 0.625000 0.750000 v 0.250000 0.000000 0.750000 v 0.750000 0.625000 0.750000 v 0.750000 0.000000 0.750000 v 0.750000 0.625000 0.250000 v 0.750000 0.000000 0.250000 v 0.250000 0.625000 0.250000 v 0.250000 0.000000 0.250000 # UV座標の定義(各値は 0.0~1.0 の範囲に収まっていること) vt 0.25000 0.37500 vt 0.75000 0.37500 vt 0.75000 1.00000 vt 0.25000 1.00000 vt 0.25000 0.25000 vt 0.75000 0.25000 vt 0.75000 0.75000 vt 0.25000 0.75000 # 法線ベクトルの定義 vn 0.00000 0.00000 1.00000 vn 1.00000 0.00000 0.00000 vn 0.00000 0.00000 -1.00000 vn -1.00000 0.00000 0.00000 vn 0.00000 1.00000 0.00000 vn 0.00000 -1.00000 0.00000 # グループの定義。以下で定義される面の所属するグループ g sample # マテリアルの指定。以下で定義される面に適用するマテリアル usemtl mat_sample # 面(ポリゴン)の定義。四角形と三角形のみ有効。頂点番号/UV番号/法線番号 f 2/4/1 4/3/1 3/2/1 1/1/1 f 4/4/2 6/3/2 5/2/2 3/1/2 f 6/4/3 8/3/3 7/2/3 5/1/3 f 8/4/4 2/3/4 1/2/4 7/1/4 f 1/8/5 3/7/5 5/6/5 7/5/5 f 8/8/6 6/7/6 4/6/6 2/5/6
- sample_obj_block.mtl
assets/sampleobjmod/models/block/sample_obj_block.mtl
# newmtl マテリアル名 newmtl mat_sample # Kd 色(R G B) Kd 1.00000 1.00000 1.00000 # d 不透明度(0.0 透明 ~ 1.0 不透明) d 1.00000 # map_Kd テクスチャのResourceLocation map_Kd sampleobjmod:blocks/sample_obj_block
解説
SampleOBJMod.java
/* OBJファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */ OBJLoader.instance.addDomain(MOD_ID);
OBJLoaderにドメイン名を登録する処理。 登録しないと、OBJファイルの走査対象フォルダとならない。
/*手持ち描画用のModelResourceLocation登録*/ ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleOBJModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory"));
手持ち描画用の登録処理。 手持ちはアイコンでやりたい場合も、そのアイコンのJSON名を登録する必要あり。
sample_obj_block.json
"forge_marker": 1,
forgeの形式のJSONであることを指定している。
"defaults": { "model": "sampleobjmod:sample_obj_block.obj", "transform": "forge:default-block" },
model:OBJモデルの場合OBJファイルを(.objまで含めて)指定。この場合は"assets/sampleobjmod/models/block/sample_obj_block.obj"を指定している。
sample_obj_block.obj
mtllib sample_obj_block.mtl
マテリアル定義ファイルの指定。ここで指定されたMTLファイルはOBJファイルと同時にロードされる。
sample_obj_block.mtl
map_Kd sampleobjmod:blocks/sample_obj_block
マテリアルで使用するテクスチャファイルの指定。この場合は"assets/sampleobjmod/textures/blocks/sample_obj_block.png"を指定している。