[Any] Нестандартный AABB сущности

1,990
18
109
Накидайте идей по поводу того, как можно сделать AABB сущности неквадратным (вытянутым по оси Z, к примеру, при этом следует учитывать поворот сущности).
RiCO9Bu.png

На рисунке примерно то, что нужно в итоге.
ЗЫ. Для незнающих: ванилька поддерживает только 2 размера для сущности, длину и высоту. Поэтому все сущности в игре по горизонтальной оси квадратны (в их физическом размере).

=============+++SWAG+++=============
DEVLOG
Буду здесь же вести свои УСПЕХИ по этому поводу:
Пока накостылял свой метод setSize, добавив туда параметр 'глубины'.
Код:
protected void setSize(float par1, float par2, float par3)
    {
        super.setSize(par1, par2);
        this.width = par1;
        this.height = par2;
        this.depth = par3;
        this.boundingBox.maxX = this.boundingBox.minX + (double)this.width;
        this.boundingBox.maxZ = this.boundingBox.minZ + (double)this.depth;
        this.boundingBox.maxY = this.boundingBox.minY + (double)this.height;        
    }

При этом пришлось подправить метод установки позиции:
Код:
public void setPosition(double x, double y, double z)
    {
        this.posX = x;
        this.posY = y;
        this.posZ = z;
        float f = this.width / 2.0F;
        float f2 = this.depth / 2.0F;
        float f1 = this.height;
        this.boundingBox.setBounds(
                x - (double)f, 
                y - (double)this.yOffset + (double)this.ySize, 
                z - (double)f2, 
                x + (double)f, 
                y - (double)this.yOffset + (double)this.ySize + (double)f1, 
                z + (double)f2);
    }

И вроде бы всё хорошо, но код выше не будет учитывать поворот сущности.
Так что пока я обошёлся костылём, который меняет размер сущности каждый тик, учитывая поворот (магические формулы с синусами и косинусами).
Но в результате, сущность как-то неадекватно ресайзится и может проходить сквозь блоки при повороте.
Хотя тут очень даже может быть виновата кривая формула, так что пока ухожу курить.

И вообще от манипуляций с setSize сущность начинает себя неадекватно вести.

Приложу свои говноформулы:
Код:
/*      double x1 = Math.cos(Math.toRadians(rotationYaw - 90)) * 2.3D;
        double z1 = Math.sin(Math.toRadians(rotationYaw - 90)) * 2.3D;
        double x2 = Math.cos(Math.toRadians(rotationYaw + 90)) * 14D;
        double z2 = Math.sin(Math.toRadians(rotationYaw + 90)) * 14D;
        
        float dx = (float)Math.abs(x1-x2);
        float dz = (float)Math.abs(z1-z2);
        setSize(2.7F + dx/2, 2.5F, 2.7F + dz/2);*/
Размеры подбирал в дебаге, всё БОЛЕЕ-МЕНЕЕ правильно работает, когда сущность примерно перпендикулярна хоть одной из горизонтальных осей, хожу игроком вокруг сущности и бокс действительно прямоугольный.
Но, очевидно, раз у нас AABB, имеем проблемы при "диагональной" ходьбе в виде неправильных размеров.
А ещё при повороте сущность ОЧЕНЬ странно движется.
 
Ну AABB повернуть нельзя по определению, ведь это axis aligned bounding box :D
Нужно или полностью перепиливать все коллизии, или действительно развивать костыли вроде твоего, хотя, конечно, не очень круто, что "форма" сущности изменяется от поворота. Даже не знаю, что будет проще.
Если нужны только коллизии с блоками, то можно "локально" прикрутить физический движок: строить физическую модель мира в радиусе нескольких блоков вокруг сущности. Я таким трюком регдоллы сделал.
 
Вот локальный физический движок - очень даже интересная идея, спасибо.
У меня была идея запилить несколько AABB для одной сущности, либо связать две сущности, но ни один из вариантов пока не пробовал и перспектив особых они не строят. Ибо по первому гугл молчит, а второй даёт сомнительную гарантию, что ты не войдешь в блок или сущности не войдут друг в друга >_<
 
Назад
Сверху