Сгладить анимацию

Версия Minecraft
1.10+
355
2
17
Доброго времени суток, сделал в общем такую вот штуку, которая должна следовать за игроком. По анимации она должна держаться над левым плечом, но при этом должна отставать от игрока, когда тот движется, приблизительно на скорость*8 = расстояние отставания. Но как видно, делает оно это рывками, что в принципе понятно, я пока эту формулу напрямую задаю в translate.

Необходимо сделать так, чтобы он имел две точки:
1: 0, 0, 0 - По сути это стартовая позиция и основная позиция которую должен придерживаться объект.
2: 0, 0, отставание от игрока - Это смещение на которое в данный момент смещен объект.

И между этими точками нужно сгладить анимацию, чем больше отрыв - тем больше порог сближения, чем меньше - тем меньше порог.
Само событие обрабатывают в Layers (Слоях игрока). Как можно это сделать? Чтобы динамически он следовал за игроком постоянно меняя пороги сближения? :)

CjFKc.gif
 

timaxa007

Модератор
5,831
409
672
Есть текущие положение "этой штуки", а так-же его старое положение "этой штуки", а так-же нужно сделать ускорение "этой штуки".
В Entity этот пример есть: "prevPosX, prevPosY, prevPosZ", "posX, posY, posZ", а так-же "motionX, motionY, motionZ" - смотри как влеяет motion на позицию Entity.
Нужно типа ускорять "эту штуку" - чем больше растояние, тем больше ускорение, чем ближе, тем меньше ускорение.
 
355
2
17
Приблизительное я и сидел разбирал.

Такое вот есть в RenderLivingBase, но чет у меня с ним особой плавности не вышло (хотя что-то на подобии истины было похоже), да и выглядит очень стремно x) (p.s это должно было сгладить анимацию при вороте игрока, чтобы он не резко за головой поворачивался, а со временем).

Java:
float f = this.interpolateRotation(entity.prevRenderYawOffset, entity.renderYawOffset, partialTicks);
float f1 = this.interpolateRotation(entity.prevRotationYawHead, entity.rotationYawHead, partialTicks);
float f2 = f1 - f;

float f3 = MathHelper.wrapDegrees(f2);

protected float interpolateRotation(float prevYawOffset, float yawOffset, float partialTicks)
    {
        float f;

        for (f = yawOffset - prevYawOffset; f < -180.0F; f += 360.0F)
        {
            ;
        }

        while (f >= 180.0F)
        {
            f -= 360.0F;
        }

        return prevYawOffset + partialTicks * f;
    }
 
Последнее редактирование:
Сверху