- 1,990
- 18
- 109
Накидайте идей по поводу того, как можно сделать AABB сущности неквадратным (вытянутым по оси Z, к примеру, при этом следует учитывать поворот сущности).
На рисунке примерно то, что нужно в итоге.
ЗЫ. Для незнающих: ванилька поддерживает только 2 размера для сущности, длину и высоту. Поэтому все сущности в игре по горизонтальной оси квадратны (в их физическом размере).
=============+++SWAG+++=============
DEVLOG
Буду здесь же вести свои УСПЕХИ по этому поводу:
Пока накостылял свой метод setSize, добавив туда параметр 'глубины'.
При этом пришлось подправить метод установки позиции:
И вроде бы всё хорошо, но код выше не будет учитывать поворот сущности.
Так что пока я обошёлся костылём, который меняет размер сущности каждый тик, учитывая поворот (магические формулы с синусами и косинусами).
Но в результате, сущность как-то неадекватно ресайзится и может проходить сквозь блоки при повороте.
Хотя тут очень даже может быть виновата кривая формула, так что пока ухожу курить.
И вообще от манипуляций с setSize сущность начинает себя неадекватно вести.
Приложу свои говноформулы:
Размеры подбирал в дебаге, всё БОЛЕЕ-МЕНЕЕ правильно работает, когда сущность примерно перпендикулярна хоть одной из горизонтальных осей, хожу игроком вокруг сущности и бокс действительно прямоугольный.
Но, очевидно, раз у нас AABB, имеем проблемы при "диагональной" ходьбе в виде неправильных размеров.
А ещё при повороте сущность ОЧЕНЬ странно движется.
На рисунке примерно то, что нужно в итоге.
ЗЫ. Для незнающих: ванилька поддерживает только 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, имеем проблемы при "диагональной" ходьбе в виде неправильных размеров.
А ещё при повороте сущность ОЧЕНЬ странно движется.