Плавное движение

tox1cozZ

aka Agravaine
8,455
598
2,892
Есть у меня рендер тайла, в самом тайле есть переменная(angle), к которой в updateEntity прибавляется 0.5. 
Хочу чтобы он вращался по оси Y.
GL11.glRotated(tile.angle, 0, 1, 0);
Но оно двигается как-то рывками и медленно. Хочу сделать быстрее(прабавляю 2) - вообще очень рывками =)
Как сделать чтобы плавно?
 
1,990
18
105
Интерполяция.
Я даже писал об этом в нашей скайпоконфе.
В рендерер тайла передается float последним аргументом - это partialTickTime, по сути переменная от 0 до 1, обозначающая кадр между двумя обновлениями игры.
Т.е. игра как бы обновляется 20 раз в секунду, вся логика, а всё остальное - что мы видим плавно, обновляется неограниченное кол-во раз, но минимум - 20, зависит от мощности пека.
У меня рендер тайла выглядит так:
Код:
    public void renderTileEntity(TileEntityMyBlock tileEntity, double x, double y, double z, float scale) {
        GL11.glPushMatrix();
        GL11.glTranslatef((float) x + 0.5F, (float) y + 1.5F, (float) z + 0.5F);
    
        bindTexture(new ResourceLocation("modid", "textures/blocks/myblock.png"));
        GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
        
        int i = tileEntity.getBlockMetadata();
        GL11.glRotatef(90F*i, 0.0F, 1.0F, 0.0F);
        
        double angle = tileEntity.prevLidAngle;
        double f = tileEntity.lidAngle - angle;
        angle += f*scale;
        
        model.lidNeg.rotateAngleZ = (float) -Math.toRadians(angle*90);
        model.lidPos.rotateAngleZ = (float) Math.toRadians(angle*90);
        model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
        GL11.glPopMatrix();
    }
Код:
double angle = tileEntity.prevLidAngle;
        double f = tileEntity.lidAngle - angle;
        angle += f*scale;
Это, собсно, и есть интерполяция.
 
1,990
18
105
Типа не такого.
Хотя касатально приращения и сохранения предыдущего состояния - да, как у тебя.

В сущности хранишь настоящий и предыдущий угол открытия крышки\чеготебетамнадо.
Промежуточное значение получаешь:
Код:
double angle = tileEntity.prevLidAngle;
double f = tileEntity.lidAngle - angle;
angle += f*scale;
Если формулой, то:
prev + (now - prev)*partialTickTime

Хоть мы и обсудили это в скайпе, всё равно ответил здесь, чтобы другие люди с такой же проблемой не страдали.
 

Icosider

Kotliner
Администратор
3,601
99
664
Onneros написал(а):

-------------------------------------------------------
Спустя 2 года от создания темы
-------------------------------------------------------

Вот бы мне кто-нибудь подобные вещи в скайпе рассказывал :ermm:
Это как за грибами ходить, места знать надо:D
 
Сверху