- Версия(и) Minecraft
- 1.16.5
Уже давно при каждом создании коллизии для сложной модели я сталкивался с постоянным выдрачиванием нужных позиций. И если с вращением на 180 градусов проблем было еще не так много - нужно было просто поменять местами координаты, то вот дело с поворотом на 90 градусов что против, что по часовой превращалось в часовое дрочево.
Как бы было хорошо сделать одну коллизию и потом просто провращать ее по всем направлениям! Теперь такая возможность есть!
Логика кода проста и пригодна для использования на любых версиях начиная с 1.7(точно, а может и раньше), просто вам нужно немного его адаптировать.
Код применим исключительно к простым боксам. Если вы попытаетесь вращать какой то сложный составной бокс, у вас ничего не получится.
Класс содержит три метода для поворота на 90 по часовой, на 90 против часовой и на 180 градусов соответственно.
Приятного использования! Если у вас есть критические замечания или мысли о том, как этот код улучшить, напишите пожалуйста в комментариях.
Как бы было хорошо сделать одну коллизию и потом просто провращать ее по всем направлениям! Теперь такая возможность есть!
Логика кода проста и пригодна для использования на любых версиях начиная с 1.7(точно, а может и раньше), просто вам нужно немного его адаптировать.
Код применим исключительно к простым боксам. Если вы попытаетесь вращать какой то сложный составной бокс, у вас ничего не получится.
Класс содержит три метода для поворота на 90 по часовой, на 90 против часовой и на 180 градусов соответственно.
VoxelShapeUtil:
public class VoxelShapeUtil {
public static final VoxelShapeUtil INSTANCE = new VoxelShapeUtil();
public static VoxelShape shapeRotCCW90(VoxelShape vs) {
double new_minX, new_minZ, new_maxX, new_maxZ;
new_minX = 1 - vs.getBoundingBox().maxZ;
new_minZ = vs.getBoundingBox().minX;
new_maxX = 1 - vs.getBoundingBox().minZ;
new_maxZ = vs.getBoundingBox().maxX;
return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
}
public static VoxelShape shapeRotСW90(VoxelShape vs) {
double new_minX, new_minZ, new_maxX, new_maxZ;
new_minX = vs.getBoundingBox().minZ;
new_minZ = vs.getBoundingBox().minX;
new_maxX = vs.getBoundingBox().maxZ;
new_maxZ = vs.getBoundingBox().maxX;
return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
}
public static VoxelShape shapeRot180(VoxelShape vs) {
double new_minX, new_minZ, new_maxX, new_maxZ;
double new_minX2, new_minZ2, new_maxX2, new_maxZ2;
new_minX = vs.getBoundingBox().minZ;
new_minZ = vs.getBoundingBox().minX;
new_maxX = vs.getBoundingBox().maxZ;
new_maxZ = vs.getBoundingBox().maxX;
new_minX2 = new_minZ;
new_minZ2 = new_minX;
new_maxX2 = new_maxZ;
new_maxZ2 = new_maxX;
return VoxelShapes.create(new_minX2, vs.getBoundingBox().minY, new_minZ2, new_maxX2, vs.getBoundingBox().maxY, new_maxZ2);
}
public static VoxelShape shapeMirror(VoxelShape vs) {
double new_minX, new_minZ, new_maxX, new_maxZ;
new_minX = 1 - vs.getBoundingBox().minX;
new_minZ = 1 - vs.getBoundingBox().minZ;
new_maxX = 1 - vs.getBoundingBox().maxX;
new_maxZ = 1 - vs.getBoundingBox().maxZ;
return VoxelShapes.create(new_minX, vs.getBoundingBox().minY, new_minZ, new_maxX, vs.getBoundingBox().maxY, new_maxZ);
}
}