Поворот блока с моделью OBJ

Версия Minecraft
1.12.2
344
1
47
Делаю блок с OBJ моделью.

Есть вопрос, каким образом можно сделать его поворот, когда он располагается в мире? Полазал, был один вариант, но не сработал. х) желательно с полным кодом.

сам блок:
package erumind.init.blocks;

import java.util.Random;

import com.google.common.collect.Lists;

import erumind.engine_settings;
import erumind.init.ModItems;

import java.util.List;
import net.minecraft.block.*;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.property.*;
import net.minecraftforge.fml.relauncher.*;
import net.minecraft.block.*;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.*;
import net.minecraft.util.*;
 
import net.minecraft.world.IBlockAccess; import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

public class ModelBlock extends BlockBase {
    protected static final AxisAlignedBB BLOCK_TOP = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
    public ModelBlock(String name, Material material) {
        super(name, Material.BARRIER);
        setUnlocalizedName(engine_settings.MOD_ID + ".model1");
        setHardness(5.0F);
        setLightLevel(1.0F);
    }
    /*@Override
    public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase user, ItemStack stack)
    {
    super.onBlockPlacedBy(world, pos, state, user,stack);
        int dir = user.getHorizontalFacing().getHorizontalIndex();
        world.setBlockState(pos, getStateFromMeta(dir), 2);
    }*/
    
  @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;}
    @Override
    public boolean isFullCube(IBlockState state) {return false;}
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return BLOCK_TOP; }
    @Override
    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox,
            List<AxisAlignedBB> collidingBoxes, Entity entityIn, boolean p_185477_7_) { addCollisionBoxToList(pos, entityBox, collidingBoxes, BLOCK_TOP);}
}



config:
{
  "forge_marker": 1,
  "defaults": {
    "custom": { "flip-v": true },
    "model": "tm:model1.obj"
  },
 
  "variants": {
    "normal": [{}],
    "inventory": [{}]
  }
}
 
А у тебя получилось наложить текстуру на обж? У меня вот просто не вышло... А поворот делается обычным енумфейсингом либо с отталкиванием от стороны, по которой кликаешь(найди метод соответсвующий), либо от взгляда игрока(тоже все есть в Block)
 
А у тебя получилось наложить текстуру на обж? У меня вот просто не вышло... А поворот делается обычным енумфейсингом либо с отталкиванием от стороны, по которой кликаешь(найди метод соответсвующий), либо от взгляда игрока(тоже все есть в Block)
Текстура накладывается через mtl. Да, у меня всё работает.(если интересно, можешь банально скопировать код и проверить) Я пробовал через facing, Однако у меня в итоге переставала работать модель и, следственно текстура. Есть подробная статья с этим? Было бы удобно и достаточно. А если возникнут проблемы, по ней уже и отпишу.

Возможно, давать модель уже с поворотом или иным конфигом при определённом facing? Как вариант, можно попробовать...
 
Я знаю что через mtl. А в каком редакторе ты делал?
Модели делал не я, а... друг. blender. Текстура, к слову множественная и вполне работает. Могу скинуть пример mtl если хотите х) А вы вызывали obj на клиентской стороне?

Java:
OBJLoader.INSTANCE.addDomain(engine_settings.MOD_ID);
 
У меня все работало, но были какие то проблемы с мтл либой, т.к экспортил я из 3d макса
 
Последнее редактирование:
У меня все работало, но были какие то проблемы с мтл либой, т.к экспортил я из 3d макса
Не знаю насчёт 3Ds Max, но Blender экспортирует .OBJ вместе с материалами и UV развёрткой, так что для текстур просто нужно прописать путь к ним в .MTL файле, каждый материал может принимать свою текстуру, как пример:

JSON:
# Blender MTL File: 'V3.blend'
# Material Count: 2

newmtl Material
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
d 1.000000
map_Kd test:blocks/drill

newmtl Material.002
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
d 1.000000
map_Kd test:blocks/iron_bars
 
У тебя ответ содержится в твоем же вопросе. Поворачивается стейт, а не модель. Отсюда следует, что можно посмотреть любой блок который поворачивается(к примеру печь) и не скопипастить, а посмотреть как там сделано.
Не знаю насчёт 3Ds Max, но Blender экспортирует .OBJ вместе с материалами и UV развёрткой, так что для текстур просто нужно прописать путь к ним в .MTL файле, каждый материал может принимать свою текстуру, как пример:

JSON:
# Blender MTL File: 'V3.blend'
# Material Count: 2

newmtl Material
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
d 1.000000
map_Kd test:blocks/drill

newmtl Material.002
Ka 1.000000 1.000000 1.000000
Kd 0.800000 0.800000 0.800000
Ks 0.500000 0.500000 0.500000
d 1.000000
map_Kd test:blocks/iron_bars
Короче экспортер макса виноват. Надо бы поставить плаг для конверта из макса в блендер и уже из блендера экспортить
 
А ведь действительно, не подумал х) Попробую. Но подействует ли с моделью? Это не просто блок. Блок-то повернётся, а рендер? хмыкнул
 
:m_faceplam::m_faceplam::m_faceplam:
 
И так, я освободился и таки сделал это. Вновь проблема: вроде, поворачивается. Но модель не видна.

BLOCK1:
package core.erumind.block.s;

import java.util.List;

import core.Engine;
import core.Settings;
import core.erumind.block.TileEntity.Base;
import net.minecraft.block.Block;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.item.Item;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.Mirror;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

 
public class Block1 extends Block {
       protected static final AxisAlignedBB BLOCK_TOP = new AxisAlignedBB(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
       public static final String name = "block1";

       public static final PropertyDirection FACING = BlockHorizontal.FACING;
        private static Block1 ourInstance;
        
        public static Block1 getInstance() {
            if (ourInstance == null)
                ourInstance = new Block1();
            return ourInstance;
        }

    
    
    public Block1() {
          super(Material.IRON);
          setHardness(1.5F);
          setResistance(1000.0F);
          setHarvestLevel("pickaxe", 2);
          setCreativeTab(Engine.objTab);
          setSoundType(SoundType.METAL);
          setLightOpacity(0);
          setLightLevel(0.4f);
          setTickRandomly(false);
          setUnlocalizedName(name);
          setRegistryName(Settings.Resources, "tile." + name);
          setDefaultState(this.blockState.getBaseState().withProperty(FACING, EnumFacing.NORTH));
    }
    @Override
    protected BlockStateContainer createBlockState() {
         return new BlockStateContainer(this, new IProperty[] { FACING});
    }

    @Override
    public IBlockState getStateForPlacement(final World world, final BlockPos pos, final EnumFacing facing, final float hitX, final float hitY, final float hitZ, final int meta, final EntityLivingBase placer, final EnumHand hand) {
        return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand).withProperty(FACING, placer.getHorizontalFacing().getOpposite());
    }
    
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState getStateFromMeta(int meta) {
        EnumFacing enumfacing = EnumFacing.getFront(meta);
            if (enumfacing.getAxis() == EnumFacing.Axis.Y) {
                enumfacing = EnumFacing.NORTH;
            }
           return this.getDefaultState().withProperty(FACING, enumfacing);
    }

    @Override
    public int getMetaFromState(final IBlockState state) {
        return state.getValue(FACING).getHorizontalIndex();
    }
 
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withRotation(final IBlockState state, final Rotation rotation) {
        return state.withProperty(FACING, rotation.rotate(state.getValue(FACING)));
    }
    
    @SuppressWarnings("deprecation")
    @Override
    public IBlockState withMirror(final IBlockState state, final Mirror mirror) {
        return state.withRotation(mirror.toRotation(state.getValue(FACING)));
    }

    
    @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;}
    @Override
    public boolean isFullCube(IBlockState state) {return false;}
    @Override
    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { return BLOCK_TOP; }
    @Override
    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox,
            List<AxisAlignedBB> collidingBoxes, Entity entityIn, boolean p_185477_7_) { addCollisionBoxToList(pos, entityBox, collidingBoxes, BLOCK_TOP);}
}

tile.block1.json:
{
  "forge_marker": 1,
  "defaults": {
    "custom": { "flip-v": true }
  },
  "variants": {
    "inventory": [{
      "model": "erumind:model1.obj",
      "transform": {
      "facing": {
        "north": {
          "scale" : 1,
          "rotation": {"x": 0}]
        },
        "south": {
          "scale" : 1,
          "rotation": {"x": 180}]
        },
        "west": {
          "scale": 1,
          "rotation": {"x": 270}]
        },
        "east": {
          "scale": 1,
          "rotation": {"x": 90}]
        }
      }
      
      
    }}],
 
 
  }
}






2019-10-03_15.23.53.png
 
Решено, банальный конфиг был неверен.
tile.block1.json:
{
    "forge_marker": 1,
    "defaults": {
        "model": "erumind:10.obj",
        "uvlock": true
    },
    "variants": {
        "normal": [{

        }],
        "inventory": [{
        
        }],
        "facing": {
            "north": {},
            "south": {"y": 270},
            "east": {"y": 90},
            "west": {"y": 180}
        }
   }
}
 
Назад
Сверху