1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем SoKnight, 6 апр 2019.

Метки:
  1. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Скажите, есть ли какая-то формула для вычисления вектора, задав велосити которым, можно было бы переместить энтити на заданную позицию. Варианты ручного подбора вектора исключены, т.к. мне нужно искать вектор автоматически... И может ли такая формула вообще существовать?
     
  2. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Код:
        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);
        }
     
  3. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Код:
        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);
        }
     
  4. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    И что мне это даст? Ограничит значения вектора до [-4;4]?
    А какой мне смысл от этого?
     
  5. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Комментарий же оставил для тебя, возьми да переведи. В твоем посте. ты просил
    getDirection.
     
  6. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Ты получаешь координаты вектора, который воид получил при вызове. Этот код обрежет скорость по осям до 4 и -4 соответственно, разве нет?
    Я просил формулу, которой можно расчитать вектор до заданного блока.
     
  7. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Ладно, упростим ситуацию до того, что энтити просто нужно передвинуть вверх так, чтобы это энтити закончило двигаться на нужной высоте.
     
  8. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Попробуй сделать траекторию используя
    getDirection и потом сделать для вектора множитель и играть им, пока оно не будет нужной высоты
     
  9. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Я знаю что я могу поиграться с высотой, но в том то и дело, что я не могу для каждого числа (которое в моём плагине равно высоте этажа - 1) подбирать так векторы...
     
  10. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Уникальность моего плагина на лифты включает в себя кастомную высоту этажа, мульти-этажность, ГУИ выбора этажа, мульти-блочная платформа, "плавное перемещение" платформы с игроком, кнопки вызова лифта и т.д.
     
  11. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    А на данный момент "плавное перемещение" это просто setVelocity для каждого блока платформы (FallingBlock), вектор для которой создаётся путём умножения дистанции между текущим и целевым этажом на 0.2f... Ну и эта бешеная скорость останавливается барьерами над этажом, куда должен прийти лифт... Это всё сейчас выглядит до ужаса халтурно, что хотелось бы исправить...
     
  12. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    с высотой играться тебе не нужно, делаешь вектор по Y от игрока в верх на нужную высоту, и отправляешь игрока туда и помощью
    entity.setVelocity(velocity.multiply(Множитель)); где вместо множителя подставляй числа от 1 до 0.1
     
  13. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    А если у игрока отключена гравитация (.setGravity(false))? И что мне даст множитель? Скорость перемещения или что?)
     
  14. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
  15. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Простыми словами, это сила с которой его запустит, 1 это 100%.
     
  16. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    То есть смотри. Такой код запустит игрока и платформу на 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);
    }
    
     
    Последнее редактирование: 7 апр 2019
  17. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    замени
    new Vector(0, 4, 0) на getDirection
     
  18. Автор темы
    SoKnight

    SoKnight Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    SoKnight_
    Окей, сделал + добавил строку toTarget.setY(4) ниже. Или она не нужна?
     
  19. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Не нужна.
     
  20. BDMan

    BDMan Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    CKATEPTb
    Код:
    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 я скидывал выше.
     

Поделиться этой страницей