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

  • Автор темы Автор темы Gru2303
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Gru2303

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Gru2303
У нас есть конструкция с армор стендов, и например Х армор стенд это центр конструкции. Как симметрично повернуть эту конструкцию? Я знаю что нужно это делать это через синус и косинус (поворот по колу как я понял), ну реализовать у меня это так и не получилось.
 
Может переводить декартовы координаты в сферические, там менять угол поворота и обратно переводить в декартовы?
screen2.jpg
 
Может переводить декартовы координаты в сферические, там менять угол поворота и обратно переводить в декартовы?
screen2.jpg
Ну даже не знаю. У меня есть Х стенд(Главный стенд), и когда я меняю его угол(yaw) мне нужно что-бы в остальные стенды подстроились под него. Иметься виду что-бы не всем стендам ставился одинаковый угол, а что-бы конструкция поворачивался симметрично.
 
Тебе ведь получается нужно изменить координаты этих стендов верно? Тогда мне кажется такой вариант подходит. И я даже думаю, что координата z не меняется, тогда можно использовать полярные координаты (и формулы для них) меняя только координаты x и y
slide-1.jpg
 
Тебе ведь получается нужно изменить координаты этих стендов верно? Тогда мне кажется такой вариант подходит. И я даже думаю, что координата z не меняется, тогда можно использовать полярные координаты (и формулы для них) меняя только координаты x и y
slide-1.jpg
Это я знаю, и я питался уже это сделать но без результатов...
 
Хотя я кажется по проще придумал. Пусть 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
 
Хотя я кажется по проще придумал. Пусть 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
Вы как-то поплутали переменные...
Ну я нашел код на на гите, вот он

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(), xvp, mainStand.getLocation().getY() + yOffset, zvp, fbvp.getYaw(), fbvp.getPitch());

Он идеально работает в плагине с гита.
Но когда и пытаются подстроить этот код в свой плагин то ничего не получается, стенды двигаются но не так как нужно...

Мой код

PHP:
public Location getMathStandLocation(VehicleStandCache stand) throws 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(), xvp, mainStand.getLocation().getY() + yOffset, zvp, fbvp.getYaw(), fbvp.getPitch());
    }
 
И так, преобразование координат.

Код:
    /**
    * повернуть координаты (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 у стендов на тот же угол.
Правда, я не тестил, но вроде должно работать.

Очевидно, все углы в радианах.
 
И так, преобразование координат.

Код:
    /**
    * повернуть координаты (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 у стендов на тот же угол.
Правда, я не тестил, но вроде должно работать.

Очевидно, все углы в радианах.
Что-то подобное делал, стенды улетали куда попало
 
Что-то подобное делал, стенды улетали куда попало
Немного объясню как должен работать этот код

PHP:
public Location getMathStandLocation(VehicleStandCache stand) throws 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(), xvp, mainStand.getLocation().getY() + yOffset, zvp, fbvp.getYaw(), fbvp.getPitch());
    }
 
Тема закрыта, была ошибка в моем кода :)
Код которые я описал выше идеально работает.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх