Помогите Вычисление вектора для перемещения на заданную позицию

SoKnight

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
SoKnight_
Скажите, есть ли какая-то формула для вычисления вектора, задав велосити которым, можно было бы переместить энтити на заданную позицию. Варианты ручного подбора вектора исключены, т.к. мне нужно искать вектор автоматически... И может ли такая формула вообще существовать?
 
Код:
    public static void setVelocity(final Entity entity, final Vector velocity) {
        if (entity instanceof FallingBlock||entity instanceof TNTPrimed) {
                entity.setVelocity(velocity.multiply(Множитель));
            return;
        }

        // Attempt to stop velocity from going over the packet cap.
        if (velocity.getX() > 4) {
            velocity.setX(4);
        } else if (velocity.getX() < -4) {
            velocity.setX(-4);
        }

        if (velocity.getY() > 4) {
            velocity.setY(4);
        } else if (velocity.getY() < -4) {
            velocity.setY(-4);
        }

        if (velocity.getZ() > 4) {
            velocity.setZ(4);
        } else if (velocity.getZ() < -4) {
            velocity.setZ(-4);
        }

        entity.setVelocity(velocity);
    }
 
Код:
    public static Vector getDirection(final Location location, final Location destination) {
        double x1, y1, z1;
        double x0, y0, z0;

        x1 = destination.getX();
        y1 = destination.getY();
        z1 = destination.getZ();

        x0 = location.getX();
        y0 = location.getY();
        z0 = location.getZ();

        return new Vector(x1 - x0, y1 - y0, z1 - z0);
    }
 
Код:
    public static void setVelocity(final Entity entity, final Vector velocity) {
        if (entity instanceof FallingBlock||entity instanceof TNTPrimed) {
                entity.setVelocity(velocity.multiply(Множитель));
            return;
        }

        // Attempt to stop velocity from going over the packet cap.
        if (velocity.getX() > 4) {
            velocity.setX(4);
        } else if (velocity.getX() < -4) {
            velocity.setX(-4);
        }

        if (velocity.getY() > 4) {
            velocity.setY(4);
        } else if (velocity.getY() < -4) {
            velocity.setY(-4);
        }

        if (velocity.getZ() > 4) {
            velocity.setZ(4);
        } else if (velocity.getZ() < -4) {
            velocity.setZ(-4);
        }

        entity.setVelocity(velocity);
    }
И что мне это даст? Ограничит значения вектора до [-4;4]?
А какой мне смысл от этого?
 
И что мне это даст? Ограничит значения вектора до [-4;4]?
А какой мне смысл от этого?

Комментарий же оставил для тебя, возьми да переведи. В твоем посте. ты просил
getDirection.
 
Комментарий же оставил для тебя, возьми да переведи. В твоем посте. ты просил
getDirection.
Ты получаешь координаты вектора, который воид получил при вызове. Этот код обрежет скорость по осям до 4 и -4 соответственно, разве нет?
Комментарий же оставил для тебя, возьми да переведи. В твоем посте. ты просил
getDirection.
Я просил формулу, которой можно расчитать вектор до заданного блока.
 
Ладно, упростим ситуацию до того, что энтити просто нужно передвинуть вверх так, чтобы это энтити закончило двигаться на нужной высоте.
 
Ладно, упростим ситуацию до того, что энтити просто нужно передвинуть вверх так, чтобы это энтити закончило двигаться на нужной высоте.
Попробуй сделать траекторию используя
getDirection и потом сделать для вектора множитель и играть им, пока оно не будет нужной высоты
 
Попробуй сделать траекторию используя
getDirection и потом сделать для вектора множитель и играть им, пока оно не будет нужной высоты
Я знаю что я могу поиграться с высотой, но в том то и дело, что я не могу для каждого числа (которое в моём плагине равно высоте этажа - 1) подбирать так векторы...
 
Уникальность моего плагина на лифты включает в себя кастомную высоту этажа, мульти-этажность, ГУИ выбора этажа, мульти-блочная платформа, "плавное перемещение" платформы с игроком, кнопки вызова лифта и т.д.
 
А на данный момент "плавное перемещение" это просто setVelocity для каждого блока платформы (FallingBlock), вектор для которой создаётся путём умножения дистанции между текущим и целевым этажом на 0.2f... Ну и эта бешеная скорость останавливается барьерами над этажом, куда должен прийти лифт... Это всё сейчас выглядит до ужаса халтурно, что хотелось бы исправить...
 
Я знаю что я могу поиграться с высотой, но в том то и дело, что я не могу для каждого числа (которое в моём плагине равно высоте этажа - 1) подбирать так векторы...
с высотой играться тебе не нужно, делаешь вектор по Y от игрока в верх на нужную высоту, и отправляешь игрока туда и помощью
entity.setVelocity(velocity.multiply(Множитель)); где вместо множителя подставляй числа от 1 до 0.1
 
с высотой играться тебе не нужно, делаешь вектор по Y от игрока в верх на нужную высоту, и отправляешь игрока туда и помощью
entity.setVelocity(velocity.multiply(Множитель)); где вместо множителя подставляй числа от 1 до 0.1
А если у игрока отключена гравитация (.setGravity(false))? И что мне даст множитель? Скорость перемещения или что?)
 
А если у игрока отключена гравитация (.setGravity(false))? И что мне даст множитель? Скорость перемещения или что?)
Простыми словами, это сила с которой его запустит, 1 это 100%.
 
Простыми словами, это сила с которой его запустит, 1 это 100%.
То есть смотри. Такой код запустит игрока и платформу на 4 блока вверх? Со скоростью в 10%?
Код:
Player p = ...;
List<FallingBlock> platform = ...;
Vector toTarget = p.getDirection().multiply(0.1);
toTarget.setY(4);
p.setVelocity(toTarget);
for(FallingBlock b : platform) {
    b.setVelocity(toTarget);
}
 
Последнее редактирование:
То есть смотри. Такой код запустит игрока и платформу на 4 блока вверх? Со скоростью в 10%?
Код:
Player p = ...;
List<FallingBlock> platform = ...;
Vector toTarget = new Vector(0, 4, 0).multiply(0.1);
p.setVelocity(toTarget);
for(FallingBlock b : platform) {
    b.setVelocity(toTarget);
}
замени
new Vector(0, 4, 0) на getDirection
 
Код:
Player player = ...;
List<FallingBlock> fallingBlockList = ...;
Vector velocity= getDirection(player.getLocation(), player.getLocation().clone().add(0,4,0)).multiply(0.1);
player.setVelocity(velocity);
for(FallingBlock fallingBlock : fallingBlockList)
    fallingBlock.setVelocity(velocity);
Сам метод getDirection я скидывал выше.
 
Назад
Верх