реализация lerp для «tween»

У меня это как мой лерп функция:

  Vec2f lerp(float t, Vec2f a, Vec2f b){
return (1-t)*a + t*b;
}

И у меня есть следующий код ниже, который, как я надеялся, приведет к «твину»:

    Vec2f a(0,0);
Vec2f b(3,4);
Vec2f c(5,4);
Vec2f d(5,0);

if( i < 100 ){
if(i <= 30){
ball.pos = lerp(i, a, b);
}
else if(i > 30 && i < 80){
ball.pos = lerp(i, b, c);
}
else {
ball.pos = lerp(i, a, d);
}
} i += 1;

Но то, что я получаю, — это «прерывистая анимация движения», то есть вместо того, чтобы начинать с последней точки, где заканчивается скачок от А до В, он начинается где-то еще, а некоторые переходят к другим скачкам. Что я делаю неправильно?

6

Решение

t должно быть от 0 до 1 в вашей функции интерполяции, но вы передаете значения от 0 до 100. Измените ваши вызовы на lerp(i/100.0f, a, b) и так далее. (Важно, чтобы вы указали 100.0 как литерал с плавающей запятой, а не как целочисленный литерал!)

Как правильно указывает DarenW, вы должны охватить диапазон от 0 до 1 для каждого сегмента для желаемого эффекта, т.е. в вашем случае, lerp(i/30.0f, a, b), lerp((i-30)/50.0f, a, b), так далее.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]