Двигать энтити до заданных координат

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,160
Лучшие ответы
348
Реакции
1,574
Версия Minecraft
1.7.10
Нужно двигать энтити с определенной скорость от одних координат до других.
Ну и рассчитать rotationYaw и rotationPitch, чтобы он двигался "лицом".
Познания в матане очень скудные, по-этому прошу не смеяться)
Где-то нагуглил, где-то выдрал с исходников... Вобщем, не работает как надо:
Java:
public void setMovePath(Vec3 start, Vec3 end){
        double x = end.xCoord - start.xCoord;
        double y = end.yCoord - start.yCoord;
        double z = end.zCoord - start.zCoord;
        double len = MathHelper.sqrt_double(x * x + z * z);

        if(len >= 1.0E-7D){
            double pitch = -(Math.atan2(y, MathHelper.sqrt_double(x * x + z * z)));
            double yaw = Math.atan2(z, x) - 90.0;

            //to degree
            pitch = pitch * 180.0 / Math.PI;
            yaw = yaw * 180.0 / Math.PI;

            prevRotationPitch = rotationPitch = (float)pitch;
            prevRotationYaw = rotationYaw = (float)yaw;
            
            motionX = (double)(-MathHelper.sin(rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float)Math.PI));
            motionZ = (double)(MathHelper.cos(rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(rotationPitch / 180.0F * (float)Math.PI));
            motionY = (double)(-MathHelper.sin(rotationPitch / 180.0F * (float)Math.PI));
            
            setLocationAndAngles(start.xCoord, start.yCoord, start.zCoord, rotationYaw, rotationPitch);
        }
    }
 
Сообщения
897
Лучшие ответы
33
Реакции
168
А почему Y не учитываешь? Или он не должен двигаться вверх/вниз?
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,160
Лучшие ответы
348
Реакции
1,574
Должен.
 
Сообщения
18
Лучшие ответы
2
Реакции
4
Покажи, как сейчас работает твой код. На первый взгляд все правильно написано. Скорее всего проблема в том, что где-то нужно изменить знак и/или прибавить или убавить какую-то константу по типу 90.0F/180.0F
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,160
Лучшие ответы
348
Реакции
1,574
Он то по иксу в противоположную сторону летит, то по зету.
Со знаками игрался, чот не получилось.
 
Сообщения
4,742
Лучшие ответы
132
Реакции
764
Scala:
//Результат метода kick надо выполнять в onUpdate, пока он возвращает true
def kick(entity:Entity,target:Vector3,speed:Double):Unit=>Boolean{
    val startPos=entity.pos.clone
    val startDistance=target.sub(startPos).lengthSquare
    val direction=target.sub(entity.pos).normalize //Вот и не надо со знаком играть
    entity.addVelocity(direction.scale(speed))
   
    //Todo: Тут надо при помощи arccos получить yaw, pitch из direction
   
    ()=>{
        val currentDistance=target.sub(startPos).lengthSquare
        if(startDistance-currentDistance<=speed){
            entity.motionX = 0
            entity.motionY = 0
            entity.motionZ = 0
            entity.setLocationAndAngles(target.x,target.y,target.z,entity.yaw,entity.pitch)
            false
        } else
            true
    }
}
 
Сообщения
63
Лучшие ответы
5
Реакции
19
Не знаю, пригодится ли тебе. При использования кода, игрок перемещается на несколько блоков вперёд.
Java:
p.addVelocity((double) (-MathHelper.sin(p.rotationYaw * 3.1415927F / 180F) * (float) 3 * 0.5F), 0.1D, (double) (MathHelper.cos(p.rotationYaw * 3.1415927F / 180F) * (float) 3 * 0.5F));
 
Сообщения
18
Лучшие ответы
2
Реакции
4
Немного изменил, вот примерное решение. Дальше подкрути его, как хочешь. Надеюсь, что поможет)
Java:
public void setMovePath(Entity entity, Vec3 start, Vec3 end, double speed)
    {
        Vec3 delta = start.subtract(end);
        double x = delta.xCoord;
        double y = delta.yCoord;
        double z = delta.zCoord;

        if (delta.lengthVector() >= 1.0E-7D)
        {
            double pitch = -(Math.atan2(y, MathHelper.sqrt_double(x*x + z*z)));
            double yaw = Math.atan2(z, x) - 90.0D;

            //to degree
            pitch = pitch * 180.0 / Math.PI;
            yaw = yaw * 180.0 / Math.PI;

            entity.prevRotationPitch = entity.rotationPitch = (float) pitch;
            entity.prevRotationYaw = entity.rotationYaw = (float) yaw;

//            entity.motionX = (double) (-MathHelper.sin(entity.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(entity.rotationPitch / 180.0F * (float) Math.PI));
//            entity.motionZ = (double) (MathHelper.cos(entity.rotationYaw / 180.0F * (float) Math.PI) * MathHelper.cos(entity.rotationPitch / 180.0F * (float) Math.PI));
//            entity.motionY = (double) (-MathHelper.sin(entity.rotationPitch / 180.0F * (float) Math.PI));

            Vec3 norm = delta.normalize();
            entity.motionX = norm.xCoord * speed;
            entity.motionY = norm.yCoord * speed;
            entity.motionZ = norm.zCoord * speed;

            entity.setLocationAndAngles(start.xCoord, start.yCoord, start.zCoord, entity.rotationYaw, entity.rotationPitch);
        }
    }
 

tox1cozZ

aka Agravaine
Модератор
Сообщения
6,160
Лучшие ответы
348
Реакции
1,574
Спасибо, решено.
 
Сверху