Модель как-то ,,неправильно,, поворачивается,,

Версия Minecraft
1.12.2
API
Vanilla (без API)
567
56
165
Доброго времени суток, у меня тут проблема с поворотом (верхняя сторона тестовой модельки ,,уезжает,, в сторону, хотя этого не хотелось бы), подскажите как исправить плиз. (По идее она должна кренится вверх-вниз, если лететь вперед-вверх/вперед-вниз)

Код рендера:
    private float scale = 1.85f;
    public void render(AbstractClientPlayer player){
        
        GlStateManager.pushMatrix();
        GlStateManager.scale(scale, scale, scale);

        float yRot = calcYRot(player);

        GlStateManager.rotate(90, 0, 1, 0);
        GlStateManager.rotate(yRot, 1, 0, 0);
        
        float rotYaw = calcXZrot(player.prevRotationYawHead, player.rotationYawHead,  1  );
        //тут должна быть интерполяция, для более плавных анимаций, но и так сойдет  ^^^
        
        GlStateManager.rotate(180.0F - rotYaw, 0, 1, 0);

        renderer.renderItem(
                player.getHeldItemMainhand(),
                player, ItemCameraTransforms.TransformType.FIXED, false
        );

        GlStateManager.popMatrix();
    }

    private float calcYRot(AbstractClientPlayer player){
        //сделал временно так, чтобы легче читать было
        //x, y - 1 и 2 переменные соотв.
        Vec2d P1 = new Vec2d(player.posX,     player.posY    );
        Vec2d P2 = new Vec2d(player.prevPosX, player.prevPosY);
        Vec2d P3 = new Vec2d(player.prevPosX, player.posY    );
        return (float) -Math.toDegrees(Math.atan2(P3.y - P1.y, P3.x - P1.x) -
                atan2(P2.y - P1.y, P2.x - P1.x));
    }


    //скопировал из кода mojang
    //хоть и выглядит подозрительно, но оно работает правильно
    private float calcXZrot(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;
    }


 
Решение
Сам решил проблему, оно оказывается чувствительно к порядку поворотов
Java:
//удалил все обращения к GlStateManager#rotate кроме этих 2-х, сохранив последовательность
GlStateManager.rotate(180.0F - rotYaw, 0, 1, 0);
GlStateManager.rotate(yXRot, 1, 0, 0);
И заменил расчет yXRot на нечто, похожее на new Point3D(x,y,z).angle(new Point3D(x2,y2,z2),new Point3D(x3,y3,z3))
неправильный поворот происходит при поворотах.
Оно правильно поворачивается по XZ, но когда я дополнительно поворачиваю по XY, оно себя вот так странно и ведет. Пробовал вертеть по XZ или XY и ZY одновременно, но оно так совсем с ума сходит
 
Сам решил проблему, оно оказывается чувствительно к порядку поворотов
Java:
//удалил все обращения к GlStateManager#rotate кроме этих 2-х, сохранив последовательность
GlStateManager.rotate(180.0F - rotYaw, 0, 1, 0);
GlStateManager.rotate(yXRot, 1, 0, 0);
И заменил расчет yXRot на нечто, похожее на new Point3D(x,y,z).angle(new Point3D(x2,y2,z2),new Point3D(x3,y3,z3))
 
Назад
Сверху