Easings - Набор функций сглаживания
Когда требуется реализовать какие-то простые анимации, то первым делом прибегают к готовым пакетам, реализующим tween
-анимации с поддержкой определенного набора функций сглаживания (easings
). Но что, если нужно более точно контролировать анимацию программно как часть игромеханики и при этом сохранить поддержку функций сглаживания?
Можно попытаться выдернуть математику из готового пакета, можно самостоятельно повторить, опираясь на примеры с easings.net
Пакет Leopotam.Easings
поддерживает набор следующих функций сглаживания:
- Linear
- QuadIn
- QuadOut
- QuadInOut
- CubicIn
- CubicOut
- CubicInOut
- QuartIn
- QuartOut
- QuartInOut
- QuintIn
- QuintOut
- QuintInOut
- SineIn
- SineOut
- SineInOut
- BounceIn
- BounceOut
- BounceInOut
- BackIn
- BackOut
- BackInOut
- ElasticIn
- ElasticOut
- ElasticInOut
Каждый вариант сглаживания доступен через перечисление, которое можно сохранить в поле/переменную для дальнейшего использования:
1 | Ease e1 = Ease.Linear; |
Входящие данные требуется нормализовывать в диапазон [0;1] перед использованием расчета сглаживания - в данном пакете поддерживаются 4 вида нормализации (на примере Ease.Linear
):
- Raw - вычисление без изменения входящего параметра, следует использовать только в качестве оптимизации и если известно, что значение параметра точно находится в [0;1]:
1
2
3
4
5
6float r1 = Ease.Linear.Raw (-0.5f);
float r2 = Ease.Linear.Raw (0.5f);
float r3 = Ease.Linear.Raw (1.5f);
// r1 = -0.5f;
// r2 = 0.5f;
// r3 = 1.5f; - Clamp - вычисление с обрезанием входящего параметра в [0;1]:
1
2
3
4
5
6float r1 = Ease.Linear.Clamp (-0.5f);
float r2 = Ease.Linear.Clamp (0.5f);
float r3 = Ease.Linear.Clamp (1.5f);
// r1 = 0f;
// r2 = 0.5f;
// r3 = 1f; - Repeat - вычисление с повторением (отбрасыванием целой части) входящего параметра в [0;1):
1
2
3
4
5
6float r1 = Ease.Linear.Repeat (-0.5f);
float r2 = Ease.Linear.Repeat (0.1f);
float r3 = Ease.Linear.Repeat (1.4f);
// r1 = 0.5f;
// r2 = 0.1f;
// r3 = 0.4f; - PingPong - вычисление с повторением (нарастание с 0 до 1 и снижение с 1 до 2 к начальному значению) входящего параметра в [0;1):
1
2
3
4
5
6
7
8float r1 = Ease.Linear.PingPong (0.1f);
float r2 = Ease.Linear.PingPong (1f);
float r3 = Ease.Linear.PingPong (1.5f);
float r4 = Ease.Linear.PingPong (2f);
// r1 = 0.1f;
// r2 = 1.0f;
// r3 = 0.5f;
// r4 = 0.0f;