Иконка ресурса

Слив кода Простой вращатель AxisAlignedBB (VoxelShape)

Версия(и) Minecraft
1.16.5
Уже давно при каждом создании коллизии для сложной модели я сталкивался с постоянным выдрачиванием нужных позиций. И если с вращением на 180 градусов проблем было еще не так много - нужно было просто поменять местами координаты, то вот дело с поворотом на 90 градусов что против, что по часовой превращалось в часовое дрочево.
Как бы было хорошо сделать одну коллизию и потом просто провращать ее по всем направлениям! Теперь такая возможность есть!
Логика кода проста и пригодна для использования на любых версиях начиная с 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);
}
}
Приятного использования! Если у вас есть критические замечания или мысли о том, как этот код улучшить, напишите пожалуйста в комментариях.
Автор
Maxik
Просмотры
885
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Maxik

Последние обновления

  1. Исправления

    Исправлен метод shapeRotCW90 - на самом деле он не работал. Исправлен метод shapeRot180 - он...
Сверху