Я пытаюсь эмулировать эффект анимации в коде (почти любой язык будет делать то, что кажется математикой, а не языком).По сути, это эмуляция системы масса-пружина.Я смотрел на WPF / Silverlight ElasticEase
, и это, кажется, довольно близко к тому, что я ищу, но не совсем.
Прежде всего, вот что я ищу -объект, путешествуя определенное количество секунд, попадая в определенное место и сразу замедляясь, чтобы колебаться в течение определенного количества секунд, останавливается в той же точке, где было применено демпфирование.Итак, чтобы визуализировать это, скажем, у меня есть холст 600 Вт / 900 ч, и у меня есть квадрат, который начинает анимироваться от 900 до 150 пикселей в TranslateTransform.Y
.Чтобы достичь высоты 150px (187.5px в секунду), требуется 4 секунды, на этом этапе непосредственное затухание затухает и увеличивается на приблизительно 35px в течение 0,4 секунды (87.5px в секунду) до высоты 115px, а затем восстанавливается на 1 секунду до высоты 163px(48px и 48px в секунду), а затем восстанавливается до 146px (17px и 17px в секунду) и так далее до тех пор, пока колебания не замедлят его до последнего места отдыха 150px.Период колебания составляет 16 секунд.
Пример, который я описал выше, - это верхний левый синий прямоугольник: ![enter image description here](https://i.stack.imgur.com/35zN8.gif)
Вот что я буду знать заранее - расстояние в пикселях и количество секундтребуется, чтобы добраться из точки А в точку Б - количество секунд для колебания.Такие вещи, как масса, кажется, не имеют значения.
Я пробовал ElasticEase
, и проблема, похоже, в том, что я не могу заставить объект двигаться без замедления в течение 4 секунд, а затем "подпрыгнуть"в течение следующих 16 секунд..Springiness
также всегда слишком много, даже если я установлю его на действительно большое число, например 20.
ILSpy покажет свою функцию как:
protected override double EaseInCore(double normalizedTime)
{
double num = Math.Max(0.0, (double)this.Oscillations);
double num2 = Math.Max(0.0, this.Springiness);
double num3;
if (DoubleUtil.IsZero(num2))
{
num3 = normalizedTime;
}
else
{
num3 = (Math.Exp(num2 * normalizedTime) - 1.0) / (Math.Exp(num2) - 1.0);
}
return num3 * Math.Sin((6.2831853071795862 * num + 1.5707963267948966) * normalizedTime);
}
Я включил2 видео и и файл Excel в заархивированной папке на DropBox .Я предполагаю, что этот вопрос будет скорее незавершенным, поскольку люди задают больше уточняющих вопросов.
(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не знаю, о чем говорю, когда речь заходит о большей части этого материала)