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

Помогите Как симметрично повернуть конструкцию с стендов.

Тема в разделе "Разработка плагинов для новичков", создана пользователем Gru2303, 26 июн 2021.

Статус темы:
Закрыта.
  1. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    У нас есть конструкция с армор стендов, и например Х армор стенд это центр конструкции. Как симметрично повернуть эту конструкцию? Я знаю что нужно это делать это через синус и косинус (поворот по колу как я понял), ну реализовать у меня это так и не получилось.
     
  2. gelion

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

    Баллы:
    78
    Может переводить декартовы координаты в сферические, там менять угол поворота и обратно переводить в декартовы?[​IMG]
     
  3. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Ну даже не знаю. У меня есть Х стенд(Главный стенд), и когда я меняю его угол(yaw) мне нужно что-бы в остальные стенды подстроились под него. Иметься виду что-бы не всем стендам ставился одинаковый угол, а что-бы конструкция поворачивался симметрично.
     
  4. gelion

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

    Баллы:
    78
    Тебе ведь получается нужно изменить координаты этих стендов верно? Тогда мне кажется такой вариант подходит. И я даже думаю, что координата z не меняется, тогда можно использовать полярные координаты (и формулы для них) меняя только координаты x и y [​IMG]
     
  5. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Это я знаю, и я питался уже это сделать но без результатов...
     
  6. gelion

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

    Баллы:
    78
    Хотя я кажется по проще придумал. Пусть X - центральный стенд. Y - один из стендов. Пусть координаты Y отсчитываются от стенда X. Вычисляешь R=sqrt(x^2 + y^2) (где x, y координаты стенда Y). Выбираешь на какой угол повернуть, пусть T(это наверно и есть yaw, я не очень разбираюсь в плагинах bukkit). Тогда координаты стенда будут
    x = R * cos(T)
    y = R * sin(T)

    Ну их еще надо будет преобразовать в глобальные. Потом сами стенды видимо тоже нужно повернуть вокруг своей оси на угол T
     
  7. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Вы как-то поплутали переменные...
    Ну я нашел код на на гите, вот он

    PHP:
                double xOffset VehicleData.mainx.get("MTVEHICLES_MAINSEAT_" license);
                
    double yOffset VehicleData.mainy.get("MTVEHICLES_MAINSEAT_" license);
                
    double zOffset VehicleData.mainz.get("MTVEHICLES_MAINSEAT_" license);
                
    Location locvp mainStand.getLocation().clone();
                
    Location fbvp locvp.add(locvp.getDirection().setY(0).normalize().multiply(xOffset));
                
    float zvp = (float) (fbvp.getZ() + zOffset Math.sin(Math.toRadians(fbvp.getYaw())));
                
    float xvp = (float) (fbvp.getX() + zOffset Math.cos(Math.toRadians(fbvp.getYaw())));
                
    Location loc = new Location(mainStand.getWorld(), xvpmainStand.getLocation().getY() + yOffsetzvpfbvp.getYaw(), fbvp.getPitch());
    Он идеально работает в плагине с гита.
    Но когда и пытаются подстроить этот код в свой плагин то ничего не получается, стенды двигаются но не так как нужно...

    Мой код

    PHP:
    public Location getMathStandLocation(VehicleStandCache standthrows IllegalAccessException {
            
    StandSpawn spawn stand.getStandSpawn();

            
    double xOffset spawn.getX();
            
    double yOffset spawn.getY();
            
    double zOffset spawn.getZ();

            
    Location locvp mainStand.getLocation().clone();
            
    Location fbvp locvp.add(locvp.getDirection().setY(0).normalize().multiply(xOffset));

            
    float xvp = (float) (fbvp.getX() + zOffset Math.cos(Math.toRadians(fbvp.getYaw())));
            
    float zvp = (float) (fbvp.getZ() + zOffset Math.sin(Math.toRadians(fbvp.getYaw())));

            return new 
    Location(mainStand.getArmorStand().getWorld(), xvpmainStand.getLocation().getY() + yOffsetzvpfbvp.getYaw(), fbvp.getPitch());
        }
     
  8. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
  9. sidey383

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

    Баллы:
    61
    Имя в Minecraft:
    sidey383
    И так, преобразование координат.

    Код:
        /**
        * повернуть координаты (x,y) относительно точки (rotatex, rotatey) на угол rotate
        * **/
        public double[] newCoordinate(double x, double y, double rotate, double rotatex, double rotatey)
        {
            double[] result = newCoordinateAt00(x - rotatex, y - rotatey, rotate);
            result[0] = result[0] + rotatex;
            result[1] = result[1] + rotatey;
            return result;
        }
      
      
        public double[] newCoordinateAt00(double x, double y, double rotate)
        {
            double phi = getPhi(x, y);
            phi+=rotate;
            double[] result = new double[2];
            double lenght = Math.sqrt(x*x+y*y);
            result[0] = lenght*Math.cos(phi);
            result[1] = lenght*Math.sin(phi);
            return result;
        }
      
        public double getPhi(double x, double y)
        {
            double phi;
            if(x == 0)
            {
                if(y>0)
                    return Math.PI/2;
                else
                    return -Math.PI/2;
            }
            if(y == 0)
            {
                if(x>0)
                    return 0;
                else
                    return -Math.PI;
            }
            phi = Math.atan(y/x);
            if(x < 0)
                phi+=Math.PI;
            return phi;
        }
    
    Вот это преобразование координат для поворота.
    Также, необходимо изменить yaw у стендов на тот же угол.
    Правда, я не тестил, но вроде должно работать.

    Очевидно, все углы в радианах.
     
  10. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Что-то подобное делал, стенды улетали куда попало
     
  11. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Немного объясню как должен работать этот код

    PHP:
    public Location getMathStandLocation(VehicleStandCache standthrows IllegalAccessException {

            
    // Интерфейс с координатами
            
    StandSpawn spawn stand.getStandSpawn();

            
    // Те самые координате (Что они делают? Эти координате нужно вычесть их координат главного стенда, иными словам эти координаты отвечают за расположения стенда относительно главного стенда) 
            
    double xOffset spawn.getX();
            
    double yOffset spawn.getY();
            
    double zOffset spawn.getZ();

            
    Location locvp mainStand.getLocation().clone();

            
    // Добавляет местоположение по вектору
            
    Location fbvp locvp.add(locvp.getDirection().setY(0).normalize().multiply(xOffset));

             
    // Вычисляем координаты  X i Z (Не ебу как оно должно здесь работать)
            
    float xvp = (float) (fbvp.getX() + zOffset Math.cos(Math.toRadians(fbvp.getYaw())));
            
    float zvp = (float) (fbvp.getZ() + zOffset Math.sin(Math.toRadians(fbvp.getYaw())));

            return new 
    Location(mainStand.getArmorStand().getWorld(), xvpmainStand.getLocation().getY() + yOffsetzvpfbvp.getYaw(), fbvp.getPitch());
        }
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Vector#rotateAroundAxis
     
  13. Автор темы
    Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    Тема закрыта, была ошибка в моем кода :)
    Код которые я описал выше идеально работает.
     
Статус темы:
Закрыта.

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