1.20 Minecraft Forge床模型与边界盒对齐异常问题
问题分析与解决方案
核心问题定位
这种朝向依赖的偏移问题,大概率是方块状态(BlockState)中FACING属性的旋转逻辑和模型/VoxelShape的旋转基准不匹配导致的。Forge里,方块模型的旋转通常以自身局部坐标系为基准,但朝向北/西时,部分旋转计算可能把全局坐标和局部坐标搞混,直接导致模型偏移一格。
具体修复步骤
1. 修正VoxelShape的旋转逻辑
别给不同朝向硬编码坐标,先定义一个局部空间的基础形状,再根据FACING统一旋转,避免全局偏移错误:
// 定义局部空间的基础碰撞盒(0-16范围,对应方块自身空间) private static final VoxelShape BASE_BED_SHAPE = Block.box(0, 0, 0, 16, 10, 15); @Override public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { Direction facing = state.getValue(FACING); // 根据朝向旋转基础形状,用Forge提供的Rotation工具类 return VoxelShapes.rotate(BASE_BED_SHAPE, Rotation.getRotation(facing)); }
如果之前是给北/西朝向硬加了坐标偏移(比如z轴从1开始),直接删掉这种写法,统一用旋转逻辑。
2. 检查模型的旋转配置
如果用的是JSON模型,确保variants里的旋转只绑定FACING的角度,别加多余的translation:
{ "variants": { "facing": { "north": {"rotation": {"y": 180}}, "south": {"rotation": {"y": 0}}, "west": {"rotation": {"y": 270}}, "east": {"rotation": {"y": 90}} } } }
要是模型里写了"translation": [1,0,0]这类偏移,直接删掉——错误的平移会在旋转时叠加,导致北/西朝向时偏移一格。
3. 验证放置时的FACING赋值
检查方块放置时的朝向设置,别搞反方向:
@Override public BlockState getStateForPlacement(BlockPlaceContext context) { // 这里的getOpposite()是否符合你的需求?如果搞反了,朝向逻辑会完全混乱 return this.defaultBlockState().setValue(FACING, context.getHorizontalDirection().getOpposite()); }
比如玩家面朝北放置,方块本该朝向北,要是代码里误设成南,旋转逻辑就会出错。
快速排查技巧
- 打印不同朝向时VoxelShape的坐标范围,对比南/东和北/西的数值,看是不是旋转后坐标超出了0-16的局部范围
- 临时替换成默认方块模型,测试碰撞盒是否对齐,排除模型本身的问题
- 注释掉所有手动坐标偏移的代码,只用基础形状加旋转,看问题是否消失
内容的提问来源于stack exchange,提问作者PupsiCola
相关产品推荐
相关产品推荐

